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

mAdapter.setOnItemClickListenernew NavAdapter.OnRecyclerViewItemClickListener{ @Override public void onItemClickView view , int position{ Log.v"mainDebug","position:"+position+""; //重置显示效果 int firstItemPosition=LinearLayoutManagermLayoutManager.findFirstVisibleItemPosition; int lastPos = LinearLayoutManagermLayoutManager.findLastVisibleItemPosition; System.out.printlnfirstItemPosition+"——"+lastPos; forint i=1;i<mAdapter.getItemCount;i++ { View v=mRecyclerView.getChildAti; NavAdapter.ViewHolder viewHolder=NavAdapter.ViewHoldermRecyclerView.getChildViewHolderv; viewHolder.getmItemText.setTextColorgetResources.getColorR.color.black; viewHolder.getmItemIcon.setImageResourcemAdapter.getNormalIconi - 1; } //设置选中效果 View v=mRecyclerView.getChildAtposition; NavAdapter.ViewHolder viewHolder=NavAdapter.ViewHoldermRecyclerView.getChildViewHolderv; viewHolder.getmItemText.setTextColorgetResources.getColorR.color.mainColor; viewHolder.getmItemIcon.setImageResourcemAdapter.getSelectedIconposition - 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 MyAdapterList<String> data{ this.data = data; forString string :data{ vector.addfalse; } } public static class ViewHolder extends RecyclerView.ViewHolder{ public TextView text; public ViewHolderView v{ superv; text = TextView v.findViewByIdR.id.text; } } @Override public MyAdapter.ViewHolder onCreateViewHolderViewGroup parent,int viewType{ View v = LayoutInflater.fromparent.getContext.inflateR.layout.item,parent,false; v.setOnClickListenerthis; return new ViewHolderv; } @Override public void onBindViewHolderViewHolder holder,int position{ holder.text.setTextdata.getposition; holder.itemView.setTagposition; ifvector.getposition{ holder.text.setTextColorColor.RED; }else{ holder.text.setTextColorColor.BLACK; } } @Override public int getItemCount{ return data.size; } @Override public void onClickView v{ int position = intv.getTag; vector.setposition,!vector.getposition; notifyDataSetChanged; iflistener != null{ listener.onItemClickv, position; } } public interface ItemClickListener{ void onItemClickView v,int position; } public void setOnClickListenerItemClickListener listener{ this.listener = listener; }
}

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

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

发表评论

电子邮件地址不会被公开。 必填项已用*标注