正确处理物品的方法单击回收者视图

时间:2018-10-18 14:06:19

标签: android android-recyclerview open-closed-principle

我在RecyclerView中显示5行。当用户单击其中一个项目时,将打开另一个活动。每个项目都有不同的开始活动。我按如下方式处理了点击事件。

switch (getAdapterPosition()) {
                case 1:
                    ActivityUtil.startActivity(itemView.getContext(), BlablaActivity.class);
                    break;
                //other cases
}

它正常工作。但是,如果将来有新项目添加到列表中怎么办?对于每一项,我必须在开关盒中添加一个新盒。根据开放封闭原则,这不是适当的解决方案。我应该如何处理?任何建议都很棒...

3 个答案:

答案 0 :(得分:2)

先保存项目在数据库中引用的Activity,然后将其添加到类型列表模型中

yourlist.java
....
private String BLABLA;
private String BLABLA1;
private String ActivityName;
....

然后在您的适配器OnBindViewholder OnClick中执行类似的操作

  @Override
        public void onClick(View v) {

            activityString = singleItem.getActivityName();
            Intent intent= new Intent(context, Class.forName(activityString));
            context.startActivity(intent);
        }
    });

答案 1 :(得分:1)

理想情况下,您将一个Class<? extends Activity>字段添加到表示您的RecyclerView项目的类。然后,您可以简单地在点击侦听器中访问此字段(此代码位于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);
    }
});

通过这种方式,每个项目都有责任知道点击后的去向。您可以将新项目添加到列表中,而无需触摸适配器代码。

答案 2 :(得分:0)

如果您严格地将RecyclerView适配器仅用作视图,即仅在视图中显示数据,则可以轻松处理。所有逻辑决策责任都应委托给父活动或片段。这可以通过使用回调/侦听器来实现。

只要RecyclerView项中有click事件,请告诉父活动或片段进行处理。

您需要将适配器更改为以下内容:

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
  }
}

因此,只要适配器中有新项目,您就无需更改适配器。