RecyclerView onClick问题
RecyclerView onClick problems
我一直在研究 RecyclerView
,当用户点击某个项目时,我希望更改 recyclerview 面板。出于简单测试目的,我将 recyclerview 项目的文本在单击时变为红色。单击正确,但当我滚动 RecyclerView
时,其他项目随机变为红色。这些随机项目没有被点击,当我滚动时它们自己变成红色。我想我的问题应该出在onClick
这个方法上。
public class interestAdapter extends RecyclerView.Adapter<interestAdapter.MyViewHolder> {
private LayoutInflater inflater;
private Context context;
public ArrayList<String> data = new ArrayList();
public static MyViewHolder.ViewHolderClick click;
//public static MyViewHolder.ViewHolderClick click;
public interestAdapter(Context context, ArrayList<String> objects) {
this.context = context;
inflater = LayoutInflater.from(context);
for(int i = 0; i < objects.size(); i++) {
data.add(objects.get(i));
}
}
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = inflater.inflate(R.layout.interestpanel, parent, false);
MyViewHolder holder = new MyViewHolder(view);
return holder;
}
public int getItemCount() {
return data.size();
}
public void setClickListener(MyViewHolder.ViewHolderClick clicker) {
this.click = clicker;
}
public void onBindViewHolder(MyViewHolder holder, int position) {
String current = data.get(position);
holder.category.setText(current);
}
static class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { //implements View.onClickListener {
TextView category;
public MyViewHolder(View itemView) {
super(itemView);
//itemView.setOnClickListener(this);
category = (TextView) itemView.findViewById(R.id.category);
category.setOnClickListener(this);
}
@Override
public void onClick(View v) {
MyViewHolder holder = new MyViewHolder(v);
holder.category.setTextColor(Color.RED);
}
public TextView getCate() {
return category;
}
public static interface ViewHolderClick {
public void clicked(View view, int position);
}
}
}
`
您需要将 OnClick
回调接口提供回调用 activity 或片段并在那里更改颜色。
问题很简单,因为我们知道回收视图回收视图,您已经更改了列表视图中一个视图的颜色,该视图的颜色在您的情况下保持该颜色 red.So绑定视图持有者的时间你需要将颜色更改回正常如果没有以其他方式单击你必须保持单击视图的位置并相应地更改颜色。
RecyclerView 通过 myHolder 对象多次使用同一行引用。问题在:
MyViewHolder holder = new MyViewHolder(v); //this holder has multiple reference in recyclerView
holder.category.setTextColor(Color.RED);
正如 Piyush 正确建议的那样,在您的模型中维护一个用于点击的字段(布尔值)。并通过检查此布尔值来呈现点击。在您的 onclick
更新布尔值
我通常做的是:
public void onBindViewHolder(final ContactViewHolder convosViewHolder, final int i) {
convosViewHolder.name.setText(contacts.get(i).getName());
convosViewHolder.phone.setText(contacts.get(i).getNumber());
convosViewHolder.cv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//turn red here
});
}
你可以试试。希望对你有帮助。
I have done this in onBindViewHolder()
method of RecyclerView.Adapter
class
@Override
public void onBindViewHolder(final MyRecyclerViewAdapter.MyViewHolder viewHolder, final int position) {
final MyModel myModel = mMyModelArrayList.get(position);
viewHolder.aTextView.setText(myModel.getA());
View view = viewHolder.itemView;
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(mContext, "View where A: " + myModel.getA() + " is Clicked", Toast.LENGTH_SHORT).show();
}
});
}
Imp Part
不要忘记在您的 RecyclerViews 布局中添加 android:clickable="true"
和 android:focusable="true"
,即父布局
例如:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clickable="true"
android:focusable="true">
通过这个,您可以启用点击您的 RecyclerViews 特定视图
Explanation
在 RecyclerView.Adapter
class 的 onBindViewHolder()
方法中,您可以通过 View view = viewHolder.itemView;
获取 ViewHolders Class 查看
因此,通过使用该视图,您可以为 RecyclerView 的特定项目点击设置 onClick
事件
我一直在研究 RecyclerView
,当用户点击某个项目时,我希望更改 recyclerview 面板。出于简单测试目的,我将 recyclerview 项目的文本在单击时变为红色。单击正确,但当我滚动 RecyclerView
时,其他项目随机变为红色。这些随机项目没有被点击,当我滚动时它们自己变成红色。我想我的问题应该出在onClick
这个方法上。
public class interestAdapter extends RecyclerView.Adapter<interestAdapter.MyViewHolder> {
private LayoutInflater inflater;
private Context context;
public ArrayList<String> data = new ArrayList();
public static MyViewHolder.ViewHolderClick click;
//public static MyViewHolder.ViewHolderClick click;
public interestAdapter(Context context, ArrayList<String> objects) {
this.context = context;
inflater = LayoutInflater.from(context);
for(int i = 0; i < objects.size(); i++) {
data.add(objects.get(i));
}
}
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = inflater.inflate(R.layout.interestpanel, parent, false);
MyViewHolder holder = new MyViewHolder(view);
return holder;
}
public int getItemCount() {
return data.size();
}
public void setClickListener(MyViewHolder.ViewHolderClick clicker) {
this.click = clicker;
}
public void onBindViewHolder(MyViewHolder holder, int position) {
String current = data.get(position);
holder.category.setText(current);
}
static class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { //implements View.onClickListener {
TextView category;
public MyViewHolder(View itemView) {
super(itemView);
//itemView.setOnClickListener(this);
category = (TextView) itemView.findViewById(R.id.category);
category.setOnClickListener(this);
}
@Override
public void onClick(View v) {
MyViewHolder holder = new MyViewHolder(v);
holder.category.setTextColor(Color.RED);
}
public TextView getCate() {
return category;
}
public static interface ViewHolderClick {
public void clicked(View view, int position);
}
}
} `
您需要将 OnClick
回调接口提供回调用 activity 或片段并在那里更改颜色。
问题很简单,因为我们知道回收视图回收视图,您已经更改了列表视图中一个视图的颜色,该视图的颜色在您的情况下保持该颜色 red.So绑定视图持有者的时间你需要将颜色更改回正常如果没有以其他方式单击你必须保持单击视图的位置并相应地更改颜色。
RecyclerView 通过 myHolder 对象多次使用同一行引用。问题在:
MyViewHolder holder = new MyViewHolder(v); //this holder has multiple reference in recyclerView
holder.category.setTextColor(Color.RED);
正如 Piyush 正确建议的那样,在您的模型中维护一个用于点击的字段(布尔值)。并通过检查此布尔值来呈现点击。在您的 onclick
更新布尔值我通常做的是:
public void onBindViewHolder(final ContactViewHolder convosViewHolder, final int i) {
convosViewHolder.name.setText(contacts.get(i).getName());
convosViewHolder.phone.setText(contacts.get(i).getNumber());
convosViewHolder.cv.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//turn red here
});
}
你可以试试。希望对你有帮助。
I have done this in
onBindViewHolder()
method ofRecyclerView.Adapter
class
@Override
public void onBindViewHolder(final MyRecyclerViewAdapter.MyViewHolder viewHolder, final int position) {
final MyModel myModel = mMyModelArrayList.get(position);
viewHolder.aTextView.setText(myModel.getA());
View view = viewHolder.itemView;
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(mContext, "View where A: " + myModel.getA() + " is Clicked", Toast.LENGTH_SHORT).show();
}
});
}
Imp Part
不要忘记在您的 RecyclerViews 布局中添加 android:clickable="true"
和 android:focusable="true"
,即父布局
例如:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clickable="true"
android:focusable="true">
通过这个,您可以启用点击您的 RecyclerViews 特定视图
Explanation
在 RecyclerView.Adapter
class 的 onBindViewHolder()
方法中,您可以通过 View view = viewHolder.itemView;
因此,通过使用该视图,您可以为 RecyclerView 的特定项目点击设置 onClick
事件