我有一个带有一些图像的RecyclerView,在这里我想通过点击不同的图像打开不同的活动...所以,我认为在适配器的onClick上使用switch语句将解决我的问题,但我不知道如何添加在RecyclerView适配器中的switch-if语句。我是android开发的初学者,所以我需要一些帮助......
没有adapter.Java
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ImageViewHolder> {
@NonNull
private int[] images;
public RecyclerAdapter(int[] images){
this.images =images;
}
@Override
public ImageViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerview_item2,parent,false);
ImageViewHolder imageViewHolder = new ImageViewHolder(view);
return imageViewHolder;
}
@Override
public void onBindViewHolder(@NonNull ImageViewHolder holder, int position) {
int image_id =images[position];
holder.imagess.setImageResource(image_id);
}
@Override
public int getItemCount() {
return images.length;
}
public static class ImageViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
ImageView imagess;
TextView titless;
public ImageViewHolder(View itemView) {
super(itemView);
imagess = itemView.findViewById(R.id.image);
titless = itemView.findViewById(R.id.title);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
// Toast.makeText(itemView.getContext(), "DOWNLOAD ANY TORRENT DOWNLOADER AND OPEN", Toast.LENGTH_LONG).show();
}
}}
所以我想要的是:我想打开不同的活动,如果用户点击猫图像,它应该打开一个名为cats的活动,如果用户点击狗图像,它应该打开一个名为狗的活动...
@Override
public void onClick(View v) {
switch(getAdapterPosition()) {
case 0:
Intent intent = new Intent(context, Cat.class);
context.startActivity(intent);
break;
case 1: // Open second activity
};
}
返回此ViewHolder表示的项的适配器位置。
我对Java的经验很少,我只在Kotlin写。这就是我想出的。
在Adapter本身中设置click事件并不是最好的实践。根据推荐的方法,你应该添加一个回调方法,让点击事件后Activity
附加的Fragment
\ Recycler
处理。
如何进行,
第1步:创建一个Interface
,它将你的Adapter
松散地绑定到Activity
或Fragment
。
interface AdapterListener{
void afterAdapterItemClicked(int adapterPosition);
}
这个Interface
可以在Adapter
内部作为内部成员创建。
第2步:让Activity
附加的Fragment
或Recycler
实现这个Interface
,所以让我们假设你的Activity
被命名为MenuActivity
class MenuActivity extends Activity implements AdapterListener{
}
第3步:现在在Activity
/ Fragment
内部实现覆盖方法
@Override
void afterAdapterItemClicked(int adapterPosition){
switch(adapterPosition) {
case 0: // Move to activity1
break;
case 1: // Move to activity2
break;
}
}
第4步:现在在click事件后调用方法afterAdapterClicked()
public static class ImageViewHolder extends RecyclerView.ViewHolder
implements View.OnClickListener {
ImageView imagess;
TextView titless;
public ImageViewHolder(View itemView) {
super(itemView);
imagess = itemView.findViewById(R.id.image);
titless = itemView.findViewById(R.id.title);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
mListener.afterAdapterItemClicked(getAdapterPosition());
}
}
第五步:现在向所有好奇的面孔思考,mListener
落在世界的哪个地方,不要担心我把它保存到最后。
现在,当你在RecyclerAdapter
/ Activity
中创建Fragment
对象(实例)时,你需要在其构造函数中传递当前上下文或this
。
RecyclerAdapter(arrayOfImages,this);
现在在RecyclerAdapter
类中创建一个新的状态变量,例如
private AdapterListener mListener;
然后在RecyclerAdapter
的构造函数中,您需要像这样添加类型为AdapterListener
的变量,然后为mListener分配接收到的值
public RecyclerAdapter(int[] images,AdapterListener mListener){
this.images = images;
this.mListener = mListener;
}
然后在内部类mListener
中使用ImageViewHolder
。