修改ListView单个Item

来源:互联网 发布:什么是审计作业软件 编辑:程序博客网 时间:2024/05/16 05:47

问题:我们都知道刷新ListView,一般是通过Adapter的notifyDataSetChanged():通过集合的改动去刷新整个ListView ,如果ListView数据量庞大,当我们更改某一个数据的时候就会消耗加载内存!


所以下列出ListView 只更新某一个或者几个的Item数据的情况处理;


方法一:常用作点击处理,也是最多处理的情况!

首先ListView的Item点击事件中

mListView.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view,int position, long id) {// TODO Auto-generated method stub}});
上面方法中的参数中 view则是我们点击某一个Item的 这个单个tem的view;

例如  ListView 加载  100个TextView  我们点击 第n个,这个view 就是 第n 个的TextView;

得知这个参数我们就不难处理上述问题了;


通过自己定义一个方法,当Item每次点击时候调用此方法,

mListView.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view,int position, long id) {// TODO Auto-generated method stubitemChange(view);  //每次点击都调用此方法}});private void itemChange(View view){TextView txView = (TextView) view;//这里强转必须是咱自己知道的明确的是点击的是TextViewtxView.setText("更改过");}


方法二:接收更新Item的消息,来更新Item;适用范围更加广:

注意:在ListView中,使用getChildAt(index)的取值(返回一个View),只能是当前可见区域(列表可滚动)的子项! 

即取值范围在 >= ListView.getFirstVisiblePosition() &&  <= ListView.getLastVisiblePosition(); 
1)所以如果想获取前部的将会出现返回Null值空指针问题; 
2)getChildCount跟getCount获取的值将会不一样(数量多时); 
3 )如果使用了getChildAt(index).findViewById(...)设置值的话,滚动列表时值就会改变了。 (错误的Index修改 的是屏幕当前的第几个View)

正确使用!如下

   需要使用getFirstVisiblePosition()获得第一个可见的位置,再用当前的position-它,再用getChildAt取值!即getChildAt(position - ListView。getFirstVisiblePosition()).findViewById(...)去设置值 
2.如果想更新某一行数据,需要配合ListView的滚动状态使用,一般不滚动时才加载更新数据 (滚动时候不容易判定getchildAt的view),监听滚动结束时候更新单个Item;

核心代码 如下;

public void updateView(int itemIndex) {          //得到第一个可显示控件的位置,          int visiblePosition = mListView.getFirstVisiblePosition();          //只有当要更新的view在可见的位置时才更新,不可见时,跳过不更新          if (itemIndex - visiblePosition >= 0) {              //得到要更新的item的view              View view = mListView.getChildAt(itemIndex - visiblePosition);   //必须减去第一个可见的position,得到当前屏幕可见的view            //从view中取得holder              ViewHolder holder = (ViewHolder) view.getTag(); //得到holder 就可以去更改 此holder的控件值了

}


0 0
原创粉丝点击