listview 刷新某一个item
2016-05-20 11:07
295 查看
public void updateView(int itemIndex) {
//得到第一个可显示控件的位置,
int visiblePosition = mListView.getFirstVisiblePosition();
//只有当要更新的view在可见的位置时才更新,不可见时,跳过不更新
if (itemIndex - visiblePosition >= 0) {
//得到要更新的item的view
View view = mListView.getChildAt(itemIndex - visiblePosition);
//从view中取得holder
ViewHolder holder = (ViewHolder) view.getTag();
HashMap<String, Object> item = data.get(itemIndex);
holder.listItem = (RelativeLayout) view.findViewById(R.id.rl_item);
holder.ibPlay = (ImageButton) view.findViewById(R.id.ib_play);
holder.ibDelete = (ImageButton) view.findViewById(R.id.ib_delete);
holder.tvName = (TextView) view.findViewById(R.id.tv_record_sound_name);
holder.tvLastModifyTime = (TextView) view
.findViewById(R.id.tv_record_time);
holder.tvCurrentPlayTime = (TextView) view
.findViewById(R.id.tv_current_play_time);
holder.tvTotalTime = (TextView) view.findViewById(R.id.tv_total_time);
holder.sb = (MySeekBar) view.findViewById(R.id.pb_play);
holder.layout = (LinearLayout) view
.findViewById(R.id.play_progress_info);
updateData(itemIndex, holder, item);
}
}
自定义一个adapter继承BaseAdapter,写一个如上的方法,要更新数据时,不要调用notifyDataSetChanged()方法,调用上面的方法,即可做到更新单个item
在很多时候ListView列表数据不需要全部刷新,只需刷新有数据变化的那一条,这时可以用getChildAt(index)获取某个指定position的view,并对该view进行刷新。
注意:在ListView中,使用getChildAt(index)的取值,只能是当前可见区域(列表可滚动)的子项!
即取值范围在 >= ListView.getFirstVisiblePosition() && <= ListView.getLastVisiblePosition();
1)所以如果想获取前部的将会出现返回Null值空指针问题;
2)getChildCount跟getCount获取的值将会不一样(数量多时);
3 )如果使用了getChildAt(index).findViewById(...)设置值的话,滚动列表时值就会改变了。
需要使用getFirstVisiblePosition()获得第一个可见的位置,再用当前的position-它,再用getChildAt取值!即getChildAt(position - ListView。getFirstVisiblePosition()).findViewById(...)去设置值
2.如果想更新某一行数据,需要配合ListView的滚动状态使用,一般不滚动时才加载更新数据
//全局变量,用来记录ScrollView的滚动状态,1表示开始滚动,2表示正在滚动,0表示停止滚动
伪代码
ListView设置
public int scrollStates;
class OnScrollListenerImpl implements OnScrollListener{
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
scrollStates = scrollState;
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
int lastInScreen = firstVisibleItem + visibleItemCount;
}
listView.setOnScrollListener(new OnScrollListenerImpl());
Activity中
if(scrollStates==OnScrollListener.SCROLL_STATE_IDLE){
更新视图数据
}
下面这个方法是google 2011年开发者大会上提出的方法——ListView单条更新:
首先我们看一下adapter的getView方法,我们要进行单条刷新就要手动调用这个方法。
public View getView(int position, View convertView, ViewGroup parent)
那么这三个参数是如何确定的呢,第三个参数很好确定,就是你的listview。
为了确定另外两个参数position和converView,这里介绍几个lisView的新方法:
getFirstVisiblePosition(),该方法获取当前状态下list的第一个可见item的position。
getLastVisiblePosition(),该方法获取当前状态下list的最后一个可见item的position。
getItemAtPosition(int position),该方法返回当前状态下position位置上listView的convertView
ps:这里的convertView是复用的,也就是说不管position的值是多大(这个要看你整个list有多大),converView的个数应该始终是屏幕上能显示的list的条数那么多。
所 以,我们通过从getFirstVisiblePosition的值到getLastVisiblePosition的值之间的listitem和需要进 行更新的条件(比如id)进行比较确定哪一个是要更新的(如果不在当前可是范围内也就没有必要更新了,等list拉动的时候自然就会更新出来)
//得到第一个可显示控件的位置,
int visiblePosition = mListView.getFirstVisiblePosition();
//只有当要更新的view在可见的位置时才更新,不可见时,跳过不更新
if (itemIndex - visiblePosition >= 0) {
//得到要更新的item的view
View view = mListView.getChildAt(itemIndex - visiblePosition);
//从view中取得holder
ViewHolder holder = (ViewHolder) view.getTag();
HashMap<String, Object> item = data.get(itemIndex);
holder.listItem = (RelativeLayout) view.findViewById(R.id.rl_item);
holder.ibPlay = (ImageButton) view.findViewById(R.id.ib_play);
holder.ibDelete = (ImageButton) view.findViewById(R.id.ib_delete);
holder.tvName = (TextView) view.findViewById(R.id.tv_record_sound_name);
holder.tvLastModifyTime = (TextView) view
.findViewById(R.id.tv_record_time);
holder.tvCurrentPlayTime = (TextView) view
.findViewById(R.id.tv_current_play_time);
holder.tvTotalTime = (TextView) view.findViewById(R.id.tv_total_time);
holder.sb = (MySeekBar) view.findViewById(R.id.pb_play);
holder.layout = (LinearLayout) view
.findViewById(R.id.play_progress_info);
updateData(itemIndex, holder, item);
}
}
自定义一个adapter继承BaseAdapter,写一个如上的方法,要更新数据时,不要调用notifyDataSetChanged()方法,调用上面的方法,即可做到更新单个item
在很多时候ListView列表数据不需要全部刷新,只需刷新有数据变化的那一条,这时可以用getChildAt(index)获取某个指定position的view,并对该view进行刷新。
注意:在ListView中,使用getChildAt(index)的取值,只能是当前可见区域(列表可滚动)的子项!
即取值范围在 >= ListView.getFirstVisiblePosition() && <= ListView.getLastVisiblePosition();
1)所以如果想获取前部的将会出现返回Null值空指针问题;
2)getChildCount跟getCount获取的值将会不一样(数量多时);
3 )如果使用了getChildAt(index).findViewById(...)设置值的话,滚动列表时值就会改变了。
需要使用getFirstVisiblePosition()获得第一个可见的位置,再用当前的position-它,再用getChildAt取值!即getChildAt(position - ListView。getFirstVisiblePosition()).findViewById(...)去设置值
2.如果想更新某一行数据,需要配合ListView的滚动状态使用,一般不滚动时才加载更新数据
//全局变量,用来记录ScrollView的滚动状态,1表示开始滚动,2表示正在滚动,0表示停止滚动
伪代码
ListView设置
public int scrollStates;
class OnScrollListenerImpl implements OnScrollListener{
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
scrollStates = scrollState;
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
int lastInScreen = firstVisibleItem + visibleItemCount;
}
listView.setOnScrollListener(new OnScrollListenerImpl());
Activity中
if(scrollStates==OnScrollListener.SCROLL_STATE_IDLE){
更新视图数据
}
下面这个方法是google 2011年开发者大会上提出的方法——ListView单条更新:
首先我们看一下adapter的getView方法,我们要进行单条刷新就要手动调用这个方法。
public View getView(int position, View convertView, ViewGroup parent)
那么这三个参数是如何确定的呢,第三个参数很好确定,就是你的listview。
为了确定另外两个参数position和converView,这里介绍几个lisView的新方法:
getFirstVisiblePosition(),该方法获取当前状态下list的第一个可见item的position。
getLastVisiblePosition(),该方法获取当前状态下list的最后一个可见item的position。
getItemAtPosition(int position),该方法返回当前状态下position位置上listView的convertView
ps:这里的convertView是复用的,也就是说不管position的值是多大(这个要看你整个list有多大),converView的个数应该始终是屏幕上能显示的list的条数那么多。
所 以,我们通过从getFirstVisiblePosition的值到getLastVisiblePosition的值之间的listitem和需要进 行更新的条件(比如id)进行比较确定哪一个是要更新的(如果不在当前可是范围内也就没有必要更新了,等list拉动的时候自然就会更新出来)
private void updateSingleRow(ListView listView, long id) { if (listView != null) { int start = listView.getFirstVisiblePosition(); for (int i = start, j = listView.getLastVisiblePosition(); i <= j; i++) if (id == ((Messages) listView.getItemAtPosition(i)).getId()) { View view = listView.getChildAt(i - start); getView(i, view, listView); break; } } }
相关文章推荐
- HDU 1080-Super Jumping! Jumping! Jumping!(LIS最长上升子序列-最大递增子段和)
- JavaScript 数组some()和filter()的用法及区别
- msp430单片机实现常按键和短按键加去抖功能
- LoadRunner 技巧之协议分析
- 巩固缓存相关,深入解析imageLoader
- fedora23 安装openssh-server
- 2.1 JobScheduler, Job, JobSet 详解
- Scrum 项目 6.0
- JAXB - Calling marshal
- 牛客网算法学习记录-排序2
- 手把手教你写框架之ShykyAnnotations - 注解
- Tomcat
- shell变量
- 半透明的actionbar的实现
- 父域与子域的帐户是否可以相互登陆
- Python查询本地外网IP实例
- Android RecycleView汇总
- hdu 1061 Rightmost Digit
- maven+spring+mybatis配置3步走
- 最长公共子序列 && 最长公共字串