首页 > 使用RecyclerView时怎么通过ViewHolder,改变某一个item的外观

使用RecyclerView时怎么通过ViewHolder,改变某一个item的外观

mAdapter.setOnItemClickListener(new NavAdapter.OnRecyclerViewItemClickListener(){
            @Override
            public void onItemClick(View view , int position){
                Log.v("mainDebug","position:"+position+"");
                //重置显示效果
                int firstItemPosition=((LinearLayoutManager)mLayoutManager).findFirstVisibleItemPosition();
                int lastPos = ((LinearLayoutManager)mLayoutManager).findLastVisibleItemPosition();
                System.out.println(firstItemPosition+"——"+lastPos);
                for(int i=1;i<mAdapter.getItemCount();i++)
                {
                    View v=mRecyclerView.getChildAt(i);
                    NavAdapter.ViewHolder viewHolder=(NavAdapter.ViewHolder)mRecyclerView.getChildViewHolder(v);
                    viewHolder.getmItemText().setTextColor(getResources().getColor(R.color.black));
                    viewHolder.getmItemIcon().setImageResource(mAdapter.getNormalIcon(i - 1));
                }
                //设置选中效果
                View v=mRecyclerView.getChildAt(position);
                NavAdapter.ViewHolder viewHolder=(NavAdapter.ViewHolder)mRecyclerView.getChildViewHolder(v);
                viewHolder.getmItemText().setTextColor(getResources().getColor(R.color.mainColor));
                viewHolder.getmItemIcon().setImageResource(mAdapter.getSelectedIcon(position - 1));
                //提示重绘
                mAdapter.notifyDataSetChanged();
            }
        });
        

代码如上,我根据点击的position得到View,这一步得到的确实是我说点击的那个view,我已经输出view中的textView内容看过了,没有问题。但是我得到ViewHolder后,去设置文本的颜色,缺发现改变的颜色不是我所点击的那个view的,而是他前面的2个的view的颜色被改变了,不知道该怎么解决。


我是个新手,也刚刚学着用recyclerView,说说自己的看法
按照recyclerview本身的设计意图,单纯改变viewholder的布局是肯定无效的,因为每个viewholder都会在滚动出屏幕后被重用,重用的过程中会调用onBindViewHolder重新给布局设置数据,自然也就变回原样了。
我的想法是,根据item的数量建一个vector或者map,记录每个position的点击状态,在onBindViewHolder中检查表中点击的状态然后设置数据,这样就不会出现错乱的问题。
如果有数据的增改,记得同时也刷新一下vector

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> implements View.OnClickListener{
    Vector<Boolean> vector = new Vector<>();
    List<String> data;
    ItemClickListener listener;
    public MyAdapter(List<String> data){
        this.data = data;
        for(String string :data){
            vector.add(false);
        }
    }
    public static class ViewHolder extends RecyclerView.ViewHolder{
        public TextView text;
        public ViewHolder(View v){
            super(v);
            text = (TextView) v.findViewById(R.id.text);
        }
    }
    @Override
    public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,int viewType){
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item,parent,false);
        v.setOnClickListener(this);
        return new ViewHolder(v);
    }
    @Override
    public void onBindViewHolder(ViewHolder holder,int position){
        holder.text.setText(data.get(position));
        holder.itemView.setTag(position);
        if(vector.get(position)){
            holder.text.setTextColor(Color.RED);
        }else{
            holder.text.setTextColor(Color.BLACK);
        }
    }
    @Override
    public int getItemCount(){
        return data.size();
    }
    @Override
    public void onClick(View v){
        int position = (int)v.getTag();
        vector.set(position,!vector.get(position));
        notifyDataSetChanged();
        if(listener != null){
            listener.onItemClick(v, position);
        }
    }
    public interface ItemClickListener{
        void onItemClick(View v,int position);
    }
    public void setOnClickListener(ItemClickListener listener){
        this.listener = listener;
    }
}

你再点击事件里把ViewHolder传出来就好了啊,ViewHolder.itemView就是你Item的布局。。你那个写得太麻烦了


首先,感谢热心为我解答的朋友。后来自己差文档发现notifyItemChanged(int position)这个方法,会回调onBindViewHolder()。所以导致设置的属性被重置了。去掉notifyItemChanged(int position)这个方法就可以了。

【热门文章】
【热门文章】