我有以下适配器
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开发的新手,所以任何帮助都会受到赞赏。谢谢你提前。
答案 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回答)。在这种情况下,回收视图项的按下状态将自动动画