您的位置:首页 > 其它

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拉动的时候自然就会更新出来)

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;
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: