使用相同的Recycler Adapter来充气不同的活动

时间:2015-02-09 16:04:05

标签: android android-layout recycler-adapter

我有以下适配器

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" />

 我想要做的是使用相同的适配器使用相同的行结构来膨胀多个活动。它在显示行时工作正常,但每次单击时重新启动相同活动的每个活动都使用相同的onClickListener。有没有办法使用相同的适配器,我可以根据活动分配监听器。或者我应该为每个活动创建新的适配器?我是Android开发的新手,所以任何帮助都会受到赞赏。谢谢你提前。

5 个答案:

答案 0 :(得分:1)

使用界面:

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

首先,在setOnClickListener中使用处理程序延迟的原因是什么?在上次销毁上下文的情况下,此代码将导致NullPointerException。

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