使用相同的 Recycler Adapter 为不同的 Activity 充气

Use same Recycler Adapter for inflating different activities

我有以下适配器

public class CardAdapter extends RecyclerView.Adapter<CardAdapter.ViewHolder>{

 List<String> list;
 int id;
Context context;

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view= LayoutInflater.from(parent.getContext()).inflate(id,parent,false);
   return new ViewHolder(view);

}

@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
        holder.textView.setText(list.get(position));

       holder.textView.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
               Handler handler=new Handler();
               handler.postDelayed(new Runnable() {
                   @Override
                   public void run() {
                       Intent intent = new Intent(context, BESyllabus.class);
                       context.startActivity(intent);
                   }
               },500);

           }
       });
}

@Override
public int getItemCount() {
    return list.size();
}


public static class ViewHolder extends RecyclerView.ViewHolder{
    public TextView textView;
    public CardView cardView;
    public ViewHolder(View v){
        super(v);
        textView=(TextView)v.findViewById(R.id.text);
        cardView=(CardView)v.findViewById(R.id.card_view);
    }
}

public CardAdapter(List<String> list, int id,Context context){
    this.list=list;
    this.id=id;
    this.context=context;
}

}

我使用相同的布局文件,其中有一个使用上述适配器的 recyclerView,id 是我用作回收视图行的布局文件的资源 ID`

<?xml version="1.0" encoding="utf-8"?>

<TextView
    android:id="@+id/text"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:textColor="#000000"
    android:alpha="0.87"
    android:layout_marginLeft="8dp"
    android:layout_marginRight="8dp"
    android:layout_marginTop="8dp"
    android:textSize="35dp" />

我想要做的是使用相同的适配器使用相同的行结构来膨胀多个活动。它在显示行时工作正常,但在每个 activity 中使用相同的 onClickListener,每次我单击时重新启动相同的 activity。有没有办法使用相同的适配器,我可以根据 activity.Or 分配侦听器我应该为每个 activity 创建新的适配器吗?我是 android 开发的新手,所以任何帮助都会提前 appreciated.Thanks。

您可以将侦听器作为构造函数参数传递给适配器

您应该将 OnClickListener 传递给 CardAdapter(可能在其构造函数上)并在使用此适配器的 activity 上实现它。

public class ActivityX extends Activity implements View.OnClickListener {
    CardAdapter adapter;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ...
        adapter = new CardAdapter(this)
    }

    public void onClick(View v) {
        // Handle click here
        String string = (String) v.getTag();
    }
}

您的适配器可能如下所示:

public class CardAdapter extends RecyclerView.Adapter<CardAdapter.ViewHolder> {
    View.OnClickListener onClickListener;

    public CardAdapter(View.OnClickListener onClickListener) {
        this.onClickListener = onClickListener;
    }

    @Override
    public void onBindViewHolder(final ViewHolder holder, final int position) {
        // Saving object from list at given position in View tag
        holder.setTag(list.get(position));
        holder.textView.setText(list.get(position));

        holder.textView.setOnClickListener(onClickListener);
    }
}

this answer 中有一个用于回收站视图的 onItemClickListener 的实现。您可以将代码从您的 onClickListener 移动到不同的 onItemClickListener 以获取您需要的每个不同 activity。

使用界面:

public class CardAdapter extends RecyclerView.Adapter<CardAdapter.ViewHolder>{

    private IOnItemClickListener mListener;

    public CardAdapter(IOnItemClickListener mListener) {
        this.mListener = mListener;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view= LayoutInflater.from(parent.getContext()).inflate(id,parent,false);

        return new ViewHolder(v, new CardAdapter.ViewHolder.IMyViewHolderClicks() {
            public void onClick(View v, int position) {
                mListener.onItemClick(v, position);
            };
        });

    }

    public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        public TextView textView;
        public CardView cardView;
        public IMyViewHolderClicks mListener;

        public ViewHolder(View v, IMyViewHolderClicks listener) {
            super(itemView);
            mListener = listener;

            textView=(TextView)v.findViewById(R.id.text);
            cardView=(CardView)v.findViewById(R.id.card_view);
        }

        @Override
        public void onClick(View v) {
            mListener.onClick(v, getPosition());
        }

        public interface IMyViewHolderClicks {
            public void onClick(View v, int position);
        }
    }
}
public interface IOnItemClickListener {
    public void onItemClick(View v, int position);
}

首先,在setOnClickListener中使用handler delay的原因是什么?在之前销毁上下文的情况下,此代码将导致 NullPointerException。

关于问题的主题,您可以像以前的答案一样通过构造函数传递 onClickListener,仅传递目标 activity 的 Class 变量,制作广播事件。这取决于您的需要。但在大多数情况下,我认为最合适的不是在适配器内部设置 onClickListener,而是设置回收器视图的 onItemClickListener(如@tinuviel 的回答)。在这种情况下,回收视图项的按下状态将自动设置动画