ListView/RecyclerView的item中有进度条的处理

来源:互联网 发布:上课玩手机神器淘宝 编辑:程序博客网 时间:2024/06/06 01:16

      之所以特意提出是有进度条的情况,是因为进度条刷新的频率非常高,如果是在进度刷新的时候调用notifyDataSetChanged或者notifyItemChanged方法虽然可以实现刷新,但是界面会频繁的闪烁!所以这个时候最好的办法就是拿到要刷新的item的对应的控件,比如要刷新的进度条的引用。

     我的方法是这样的:以recyclerview为例。

     给ViewHolder添加一个int类型的position属性,其实就是给ViewHolder一个标记、一个索引,方便我们通过这个position来找到对应的ViewHolder对象。在adapter中维护个map,其中key是adapter中的position,value是holder的position,这样我们就能根据我们要刷新的item的position拿到ViewHolder对象对应的position。同时我们将所有的ViewHolder保存到一个集合中,一般adapter创建的viewholder的数量是同一时间最多显示的item个数加2,然后就是复用,这个想必大家都很清楚。当我们需要刷新某个position对应的item的进度条的时候,我们就可以拿到该position上的进度条的引用,然后直接更新,而不需要刷新整个item!代码如下:

    class MyAdapter extends RecyclerView.Adapter<MyViewHolder> {        HashMap<Integer, Integer> map = new HashMap<>();        ArrayList<MyViewHolder> mHolders = new ArrayList<>();        int count = 0;        @Override        public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {            count++;            MyViewHolder myViewHolder = new MyViewHolder(View.inflate(getApplicationContext(), R.layout                    .recycler_item_2, null), count);            mHolders.add(myViewHolder);            return myViewHolder;        }        @Override        public void onBindViewHolder(MyViewHolder holder, int position) {            map.put(position, holder.position);            holder.mTvIndex.setText(mList.get(position));            holder.mPb.setProgress(15);        }        @Override        public int getItemCount() {            return mList.size();        }    }


                                             
0 0
原创粉丝点击