使用相同的 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 的回答)。在这种情况下,回收视图项的按下状态将自动设置动画
我有以下适配器
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 的回答)。在这种情况下,回收视图项的按下状态将自动设置动画