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)这个方法就可以了。