正确处理物品的方法 Click Recycler View
Proper Way to Handle Item Click Recycler View
我有 5 行要显示在 RecyclerView 中。当用户单击其中一个项目时,另一个 activity 打开。每个项目的开头都不同 activity。我像下面这样处理了点击事件。
switch (getAdapterPosition()) {
case 1:
ActivityUtil.startActivity(itemView.getContext(), BlablaActivity.class);
break;
//other cases
}
它工作正常。但是,如果将来有新项目添加到列表中怎么办?对于每一个项目,我都必须向 switch-case 添加一个新的案例。根据开闭原则,这不是一个合适的解决方案。我该如何处理?任何建议都会很棒...
首先将 Activity 项目保存在您的数据库中,然后将其添加到您的类型列表模型中,如果是
yourlist.java
....
private String BLABLA;
private String BLABLA1;
private String ActivityName;
....
然后在你的 Adapter OnBindViewholder OnClick 中做一些像这样的事情
@Override
public void onClick(View v) {
activityString = singleItem.getActivityName();
Intent intent= new Intent(context, Class.forName(activityString));
context.startActivity(intent);
}
});
如果您严格地让 RecyclerView 适配器仅作为视图工作,即仅通过视图显示数据,则可以轻松处理。所有逻辑决策责任都应委托回父 activity 或片段。这可以通过使用 Callback/Listener.
来实现
每当 RecyclerView 项目中有点击事件时,告诉父级 activity 或片段处理它。
您需要将适配器更改为如下形式:
public class YourAdapter extends RecyclerView.Adapter<YourAdapter.ViewHolder> {
// Local variable for listener
private OnItemClickListener listener;
// Listener interface
public interface OnItemClickListener {
void onItemClick(View itemView, int position);
}
// set the listener on parent activity or fragment
public void setOnItemClickListener(OnItemClickListener listener) {
this.listener = listener;
}
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
....
public ViewHolder(final View itemView) {
super(itemView);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (listener != null) return;
// tell the parent to handle the item.
listener.onItemClick(itemView, position);
}
});
}
}
}
然后您可以使用以下方法来处理点击:
// assuming adapter is your adapter
adapter.setOnItemClickListener(new ContactsAdapter.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
handleItemClickByPosition(position);
}
});
...
private void handleItemClickByPosition(int position) {
switch (getAdapterPosition()) {
case 1:
ActivityUtil.startActivity(itemView.getContext(), BlablaActivity.class);
break;
//other cases
}
}
因此,只要您的适配器中有新项目,您就不需要更改适配器。
理想情况下,您可以将 Class<? extends Activity>
字段添加到代表您的 RecyclerView 项目的 class 中。然后你可以简单地在你的点击监听器中访问这个字段(这段代码将在 onCreateViewHolder()
内):
holder.itemView.setOnClickListener(v -> {
int position = holder.getAdapterPosition();
if (position != RecyclerView.NO_POSITION) {
Class<? extends Activity> activityClass = items.get(position).getActivityClass();
ActivityUtil.startActivity(v.getContext(), activityClass);
}
});
这样一来,每个项目都负责知道点击它时要去哪里。您可以将新项目添加到您的列表中,而无需触摸适配器代码。
我有 5 行要显示在 RecyclerView 中。当用户单击其中一个项目时,另一个 activity 打开。每个项目的开头都不同 activity。我像下面这样处理了点击事件。
switch (getAdapterPosition()) {
case 1:
ActivityUtil.startActivity(itemView.getContext(), BlablaActivity.class);
break;
//other cases
}
它工作正常。但是,如果将来有新项目添加到列表中怎么办?对于每一个项目,我都必须向 switch-case 添加一个新的案例。根据开闭原则,这不是一个合适的解决方案。我该如何处理?任何建议都会很棒...
首先将 Activity 项目保存在您的数据库中,然后将其添加到您的类型列表模型中,如果是
yourlist.java
....
private String BLABLA;
private String BLABLA1;
private String ActivityName;
....
然后在你的 Adapter OnBindViewholder OnClick 中做一些像这样的事情
@Override
public void onClick(View v) {
activityString = singleItem.getActivityName();
Intent intent= new Intent(context, Class.forName(activityString));
context.startActivity(intent);
}
});
如果您严格地让 RecyclerView 适配器仅作为视图工作,即仅通过视图显示数据,则可以轻松处理。所有逻辑决策责任都应委托回父 activity 或片段。这可以通过使用 Callback/Listener.
来实现每当 RecyclerView 项目中有点击事件时,告诉父级 activity 或片段处理它。
您需要将适配器更改为如下形式:
public class YourAdapter extends RecyclerView.Adapter<YourAdapter.ViewHolder> {
// Local variable for listener
private OnItemClickListener listener;
// Listener interface
public interface OnItemClickListener {
void onItemClick(View itemView, int position);
}
// set the listener on parent activity or fragment
public void setOnItemClickListener(OnItemClickListener listener) {
this.listener = listener;
}
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
....
public ViewHolder(final View itemView) {
super(itemView);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (listener != null) return;
// tell the parent to handle the item.
listener.onItemClick(itemView, position);
}
});
}
}
}
然后您可以使用以下方法来处理点击:
// assuming adapter is your adapter
adapter.setOnItemClickListener(new ContactsAdapter.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
handleItemClickByPosition(position);
}
});
...
private void handleItemClickByPosition(int position) {
switch (getAdapterPosition()) {
case 1:
ActivityUtil.startActivity(itemView.getContext(), BlablaActivity.class);
break;
//other cases
}
}
因此,只要您的适配器中有新项目,您就不需要更改适配器。
理想情况下,您可以将 Class<? extends Activity>
字段添加到代表您的 RecyclerView 项目的 class 中。然后你可以简单地在你的点击监听器中访问这个字段(这段代码将在 onCreateViewHolder()
内):
holder.itemView.setOnClickListener(v -> {
int position = holder.getAdapterPosition();
if (position != RecyclerView.NO_POSITION) {
Class<? extends Activity> activityClass = items.get(position).getActivityClass();
ActivityUtil.startActivity(v.getContext(), activityClass);
}
});
这样一来,每个项目都负责知道点击它时要去哪里。您可以将新项目添加到您的列表中,而无需触摸适配器代码。