改变listview中某一个item的控件值,如何对其单独刷新
改变listview中某一个item的控件值,怎么对其单独刷新?
在做一个项目,需要改变listview中某一个item的控件值,然后对其刷新。不能用notifyDataSetChanged()方法对整个listview里面的item全部刷新,请问各位,我该怎么做?
下面是相关的几个文件。
1.ListViewTest.java
public class ListViewTest extends Activity {
ListView listview;
ArrayList<HashMap<String, Object>> listItem = new ArrayList<HashMap<String, Object>>();
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_record);
listview = (ListView) findViewById(R.id.split_listview);
for(int i=1;i<=100;i++)
{
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("number",i+"");
listItem.add(map);
}
MyAdapter myadapter=new MyAdapter(PractiseActivity.this, listItem, listview);
listview.setAdapter(adapterMY);
adapterMY.notifyDataSetChanged();
///////////////////////////下面是我认为可以对listview中的第50item进行改变的代码:
View localView=getViewByPosition(50,listview);
TextView localtextviewNumber=(TextView) localView.findViewById(R.id.tv_split_number);
Log.i("hahalog", "number_before="+localtextviewNumber.getText());
localtextviewNumber.setText("500");
Log.i("hahalog", "number2_after="+localtextviewNumber.getText());
//////////////////////////////通过log信息看出,以上代码改变了其值,但没有更新在界面上,界面上的值还是50,而不是500!!!
}
}
public View getViewByPosition(int pos, ListView listView) {
final int firstListItemPosition = listView.getFirstVisiblePosition();
final int lastListItemPosition = firstListItemPosition + listView.getChildCount() - 1;
if (pos < firstListItemPosition || pos > lastListItemPosition ) {
return listView.getAdapter().getView(pos, null, listView);
} else {
final int childIndex = pos - firstListItemPosition;
return listView.getChildAt(childIndex);
}
}
}
2.activity_record.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
>
<ListView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/split_listview"
/>
</LinearLayout>
3.practise_split_vlist.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:id="@+id/tv_split_number"
android:layout_width="20dp"
android:layout_height="15dp"
android:layout_marginLeft="10dp"
android:textSize="20px" />
</LinearLayout>
4.MyAdapter.java
public class MyAdapter extends BaseAdapter {
ListView listView;
private Context context;
private ArrayList<HashMap<String, Object>> listItem;
/*
public MyAdapter(Context context, List<String> dataList, ListView listView) {
super(context, 0);
this.listView = listView;
this.context = context;
this.dataList = dataList;
}
*/
public MyAdapter(Context context,
ArrayList<HashMap<String, Object>> listItem, ListView ListView) {
super();
// TODO Auto-generated constructor stub
this.listView = listView;
this.context = context;
this.listItem=listItem;
}
public int getCount() {
if (listItem != null) {
return listItem.size();
} else {
return 0;
}
}
public int getItemViewType(int position) {
return position;
}
public int getViewTypeCount() {
return 1;
}
public Object getItem(int arg0) {
return listItem.get(arg0);
}
public long getItemId(int position) {
return position;
}
public boolean isEnabled(int position) {
// TODO Auto-generated method stub
return false;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
try{
if (convertView == null || (holder = (ViewHolder) convertView.getTag()) == null) {
Log.i("lzqlog", "context 1="+context);
convertView = View.inflate(context, R.layout.practise_split_vlist, null);
holder = new ViewHolder();
holder.number=(TextView) convertView.findViewById(R.id.tv_split_number);
convertView.setTag(holder);
}else {
holder = (ViewHolder)convertView.getTag();
}
Log.i("lzqlog", "context 2="+context);
holder.number.setText((String)listItem.get(position).get("number"));
}catch(Exception e){
e.printStackTrace();
}finally{
return convertView;
}
}
class ViewHolder {
public TextView number;
}
}
------解决思路----------------------
今天上班没有时间,晚上回来抽空帮你解决了。直接给你看代码吧,用的是回调接口。
还有 ,你的布局文件有严重问题,你把宽高写死了,三位数根本不会出现,尽量减少这些小失误吧,浪费好多时间
在做一个项目,需要改变listview中某一个item的控件值,然后对其刷新。不能用notifyDataSetChanged()方法对整个listview里面的item全部刷新,请问各位,我该怎么做?
下面是相关的几个文件。
1.ListViewTest.java
public class ListViewTest extends Activity {
ListView listview;
ArrayList<HashMap<String, Object>> listItem = new ArrayList<HashMap<String, Object>>();
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_record);
listview = (ListView) findViewById(R.id.split_listview);
for(int i=1;i<=100;i++)
{
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("number",i+"");
listItem.add(map);
}
MyAdapter myadapter=new MyAdapter(PractiseActivity.this, listItem, listview);
listview.setAdapter(adapterMY);
adapterMY.notifyDataSetChanged();
///////////////////////////下面是我认为可以对listview中的第50item进行改变的代码:
View localView=getViewByPosition(50,listview);
TextView localtextviewNumber=(TextView) localView.findViewById(R.id.tv_split_number);
Log.i("hahalog", "number_before="+localtextviewNumber.getText());
localtextviewNumber.setText("500");
Log.i("hahalog", "number2_after="+localtextviewNumber.getText());
//////////////////////////////通过log信息看出,以上代码改变了其值,但没有更新在界面上,界面上的值还是50,而不是500!!!
}
}
public View getViewByPosition(int pos, ListView listView) {
final int firstListItemPosition = listView.getFirstVisiblePosition();
final int lastListItemPosition = firstListItemPosition + listView.getChildCount() - 1;
if (pos < firstListItemPosition || pos > lastListItemPosition ) {
return listView.getAdapter().getView(pos, null, listView);
} else {
final int childIndex = pos - firstListItemPosition;
return listView.getChildAt(childIndex);
}
}
}
2.activity_record.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
>
<ListView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/split_listview"
/>
</LinearLayout>
3.practise_split_vlist.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:id="@+id/tv_split_number"
android:layout_width="20dp"
android:layout_height="15dp"
android:layout_marginLeft="10dp"
android:textSize="20px" />
</LinearLayout>
4.MyAdapter.java
public class MyAdapter extends BaseAdapter {
ListView listView;
private Context context;
private ArrayList<HashMap<String, Object>> listItem;
/*
public MyAdapter(Context context, List<String> dataList, ListView listView) {
super(context, 0);
this.listView = listView;
this.context = context;
this.dataList = dataList;
}
*/
public MyAdapter(Context context,
ArrayList<HashMap<String, Object>> listItem, ListView ListView) {
super();
// TODO Auto-generated constructor stub
this.listView = listView;
this.context = context;
this.listItem=listItem;
}
public int getCount() {
if (listItem != null) {
return listItem.size();
} else {
return 0;
}
}
public int getItemViewType(int position) {
return position;
}
public int getViewTypeCount() {
return 1;
}
public Object getItem(int arg0) {
return listItem.get(arg0);
}
public long getItemId(int position) {
return position;
}
public boolean isEnabled(int position) {
// TODO Auto-generated method stub
return false;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
try{
if (convertView == null || (holder = (ViewHolder) convertView.getTag()) == null) {
Log.i("lzqlog", "context 1="+context);
convertView = View.inflate(context, R.layout.practise_split_vlist, null);
holder = new ViewHolder();
holder.number=(TextView) convertView.findViewById(R.id.tv_split_number);
convertView.setTag(holder);
}else {
holder = (ViewHolder)convertView.getTag();
}
Log.i("lzqlog", "context 2="+context);
holder.number.setText((String)listItem.get(position).get("number"));
}catch(Exception e){
e.printStackTrace();
}finally{
return convertView;
}
}
class ViewHolder {
public TextView number;
}
}
------解决思路----------------------
今天上班没有时间,晚上回来抽空帮你解决了。直接给你看代码吧,用的是回调接口。
package com.nsz.test;
import java.util.ArrayList;
import java.util.HashMap;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ListView;
import android.widget.TextView;
import com.example.test.R;
import com.nsz.test.MyAdapter.CallBackItemListener;
public class ListViewTest extends Activity {
ListView listview;
ArrayList<HashMap<String, Object>> listItem = new ArrayList<HashMap<String, Object>>();
private MyAdapter myadapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_record);
listview = (ListView) findViewById(R.id.split_listview);
for (int i = 1; i <= 100; i++) {
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("number", i + "");
listItem.add(map);
}
myadapter = new MyAdapter(this, listItem);
listview.setAdapter(myadapter);
myadapter.setmListener(new CallBackItemListener() {
@Override
public void callBackItem(int position, HashMap<String, Object> map) {
listItem.remove(position);
map.put("number", "测试下哦");
listItem.add(position, map);
myadapter.notifyDataSetChanged();
}
});
listview.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
}
});
// /////////////////////////下面是我认为可以对listview中的第50item进行改变的代码:
// View localView = getViewByPosition(50, listview);
// TextView localtextviewNumber = (TextView) localView .findViewById(R.id.tv_split_number);
// Log.i("hahalog", "number_before=" + localtextviewNumber.getText());
// localtextviewNumber.setText("500");
// Log.i("hahalog", "number2_after=" + localtextviewNumber.getText());
// myadapter.notifyDataSetChanged();
// ////////////////////////////通过log信息看出,以上代码改变了其值,但没有更新在界面上,界面上的值还是50,而不是500!!!
}
public View getViewByPosition(int pos, ListView listView) {
int firstListItemPosition = listView.getFirstVisiblePosition();
int lastListItemPosition = firstListItemPosition + listView.getChildCount() - 1;
if (pos < firstListItemPosition
------解决思路----------------------
pos > lastListItemPosition) {
return listView.getAdapter().getView(pos, null, listView);
} else {
final int childIndex = pos - firstListItemPosition;
return listView.getChildAt(childIndex);
}
}
}
package com.nsz.test;
import java.util.ArrayList;
import java.util.HashMap;
import android.content.Context;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import com.example.test.R;
public class MyAdapter extends BaseAdapter {
private Context context;
private ArrayList<HashMap<String, Object>> listItem;
private CallBackItemListener mListener;
/*
* public MyAdapter(Context context, List<String> dataList, ListView
* listView) { super(context, 0); this.listView = listView; this.context =
* context; this.dataList = dataList; }
*/
public MyAdapter(Context context, ArrayList<HashMap<String, Object>> listItem) {
super();
this.context = context;
this.listItem = listItem;
}
public CallBackItemListener getmListener() {
return mListener;
}
public void setmListener(CallBackItemListener mListener) {
this.mListener = mListener;
}
public int getCount() {
if (listItem != null) {
return listItem.size();
} else {
return 0;
}
}
public int getItemViewType(int position) {
return position;
}
public int getViewTypeCount() {
return 1;
}
public Object getItem(int arg0) {
return listItem.get(arg0);
}
public long getItemId(int position) {
return position;
}
public boolean isEnabled(int position) {
return false;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
if ( convertView == null ) {
Log.i("lzqlog", "context 1=" + context);
convertView = View.inflate(context, R.layout.practise_split_vlist, null);
holder = new ViewHolder();
holder.number = (TextView) convertView.findViewById(R.id.tv_split_number);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
Log.i("lzqlog", "context 2=" + context);
holder.number.setText( (String) listItem.get(position).get("number") );
if( position == 49 ) {
HashMap<String, Object> map = listItem.get(position);
mListener.callBackItem(position, map);
}
return convertView;
}
static class ViewHolder {
public TextView number;
}
public interface CallBackItemListener{
void callBackItem(int position, HashMap<String, Object> map);
}
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="#ff0000" >
<TextView
android:id="@+id/tv_split_number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:text="ssssssssssssssssssssssssssss"
android:textSize="20px" />
</LinearLayout>
还有 ,你的布局文件有严重问题,你把宽高写死了,三位数根本不会出现,尽量减少这些小失误吧,浪费好多时间