android - 使用RecyclerView时怎么通过ViewHolder,改变某一个item的外观
怪我咯
怪我咯 2017-04-17 16:31:47
[Android讨论组]
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的颜色被改变了,不知道该怎么解决。

怪我咯
怪我咯

走同样的路,发现不同的人生

全部回复(3)
怪我咯

我是个新手,也刚刚学着用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的布局。。你那个写得太麻烦了

PHP中文网

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号