[英]struggling with Fragment and RecycleView implement OnItemClick
I tried to implement OnItemClickListener in Fragment with RecycleView Adapter, but my code seems not to work well, OnItemClickListener keeps turning red when I try to change it to getContext().我尝试使用 RecycleView Adapter 在 Fragment 中实现 OnItemClickListener,但我的代码似乎不能正常工作,当我尝试将其更改为 getContext() 时 OnItemClickListener 一直变红。 I've tried to find many ways to get it done, but that makes me find another error in my code.
我试图找到很多方法来完成它,但这让我在我的代码中发现了另一个错误。 .
. your help will make my day brighter,
你的帮助会让我的日子更美好,
public class MountainFragment extends Fragment {
private final int LOCATION_SIZE = 10;
private final int LOCATION_TYPE = 1;
public MountainFragment() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.word_list_activity, container, false);
String name, imageName, address;
Drawable image;
int resourceId, imageId;
final ArrayList<WorldDataModel> mountainArrays = new ArrayList<WorldDataModel>();
for (int n = 1; n <= LOCATION_SIZE; n++) {
//get Location Name
resourceId = getResources().getIdentifier("location_name_" + LOCATION_TYPE
+ "_" + n, "string", getActivity().getPackageName());
name = getResources().getString(resourceId);
//get address
resourceId = getResources().getIdentifier("location_address_" + LOCATION_TYPE
+ "_" + n, "string", getActivity().getPackageName());
address = getResources().getString(resourceId);
//get image thumbnail
resourceId = getResources().getIdentifier("location_thumbnail_" + LOCATION_TYPE
+ "_" + n, "string", getActivity().getPackageName());
imageName = getResources().getString(resourceId);
imageId = getResources().getIdentifier(imageName, "drawable", getActivity().getPackageName());
image = getResources().getDrawable(imageId);
//add new data to list
mountainArrays.add(new WorldDataModel(name, address, image));
}
// using simple recycle view
RecyclerView recyclerView = (RecyclerView) rootView.findViewById(R.id.word_list_activity);
recyclerView.setLayoutManager(new LinearLayoutManager(this.getContext()));
RecycleViewWorldAdapter adapter = new RecycleViewWorldAdapter(mountainArrays);
recyclerView.setAdapter(adapter);
//on list item click
recyclerView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
WorldDataModel worldDataModel = mountainArrays.get(position);
Intent intent = new Intent(getActivity(), DetailsActivity.class);
intent.putExtra("category", LOCATION_TYPE);
intent.putExtra("location", position + 1);
getActivity().startActivity(intent);
}
});
// Inflate the layout for this fragment
return rootView;
}
and here's my adapter class这是我的适配器类
package com.example.mytourguideapp;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
public class RecycleViewWorldAdapter extends RecyclerView.Adapter<RecycleViewWorldAdapter.MyViewHolder> {
private ArrayList<WorldDataModel> worldDataModelArrayList;
public class MyViewHolder extends RecyclerView.ViewHolder {
public TextView textViewLocationName, textViewPlacesName;
public ImageView imageOnCard;
public MyViewHolder(View itemView) {
super(itemView);
textViewLocationName = (TextView) itemView.findViewById(R.id.location_name);
textViewPlacesName = (TextView) itemView.findViewById(R.id.places_name);
imageOnCard = (ImageView) itemView.findViewById(R.id.image_on_cardview);
}
}
public RecycleViewWorldAdapter(ArrayList<WorldDataModel> worldDataModelArrayList) {
this.worldDataModelArrayList = worldDataModelArrayList;
}
@Override
public MyViewHolder onCreateViewHolder( ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_item_layout, parent, false);
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(RecycleViewWorldAdapter.MyViewHolder holder, int position) {
WorldDataModel worldDataModel = worldDataModelArrayList.get(position);
holder.textViewPlacesName.setText(worldDataModel.getName());
holder.textViewLocationName.setText(worldDataModel.getAddress());
holder.imageOnCard.setImageDrawable(worldDataModel.getImageThumbnail());
}
@Override
public int getItemCount() {
return worldDataModelArrayList.size();
}
}
You can send the callback from your Adapter class to your fragment/activity.您可以将 Adapter 类的回调发送到您的片段/活动。
First create a interface class首先创建一个接口类
public interface OnItemClickListener { void onItemClick(WorldDataModel item); }
Next modify your Adapter class , in your case RecycleViewWorldAdapter
接下来修改你的 Adapter 类,在你的情况下
RecycleViewWorldAdapter
i) Send listener as a parameter in your constructor i)在构造函数中将侦听器作为参数发送
private final OnItemClickListener listener; public RecycleViewWorldAdapter(ArrayList<WorldDataModel> worldDataModelArrayList, OnItemClickListener listener) { this.worldDataModelArrayList = worldDataModelArrayList; this.listener = listener; }
ii) Set onCLick listener on some view in your ViewHolder class ii)在 ViewHolder 类中的某个视图上设置 onCLick 侦听器
public MyViewHolder(View itemView) { super(itemView); textViewLocationName = (TextView) itemView.findViewById(R.id.location_name); textViewPlacesName = (TextView) itemView.findViewById(R.id.places_name); imageOnCard = (ImageView) itemView.findViewById(R.id.image_on_cardview); // change your listener on any other view if you want imageOnCard..setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { listener.onItemClick(worldDataModelArrayList.get(getAdapterPosition()); } }); }
Now modify your Activity/Fragment class to listen to your interface callback , in your case MountainFragment
in onCreateView
现在修改您的 Activity/Fragment 类以收听您的接口回调,在您的情况下,
onCreateView
MountainFragment
// using simple recycle view RecyclerView recyclerView = (RecyclerView) rootView.findViewById(R.id.word_list_activity); recyclerView.setLayoutManager(new LinearLayoutManager(this.getContext())); RecycleViewWorldAdapter adapter = new RecycleViewWorldAdapter(mountainArrays,new RecycleViewWorldAdapter.OnItemClickListener() { @Override public void onItemClick(WorldDataModel item) { // implement click listener as per your requirement WorldDataModel worldDataModel = item; Intent intent = new Intent(getActivity(), DetailsActivity.class); intent.putExtra("category", LOCATION_TYPE); intent.putExtra("location", position + 1); getActivity().startActivity(intent); }); recyclerView.setAdapter(adapter);
I changed MyView Holder into this我把 MyView Holder 改成了这个
linearLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.onItemClick(worldDataModelArrayList.get(getAdapterPosition()), worldDataModelArrayList.get(getPosition()));
}
});
and I changed my interface OnItemClickListener into this;我把我的接口 OnItemClickListener 改成了这个;
public interface OnItemClickListener {
void onItemClick(WorldDataModel item, WorldDataModel position);
}
then I changed my fragment onItemClick method into this ;然后我把我的片段 onItemClick 方法改成了这个;
@Override
public void onItemClick(WorldDataModel item, WorldDataModel position) {
WorldDataModel worldDataModel = item;
WorldDataModel worldDataModel1 = position;
Intent intent = new Intent(getActivity(), DetailsActivity.class);
intent.putExtra("category", LOCATION_TYPE);
intent.putExtra("location", position + 1);
getActivity().startActivity(intent);
}
I'm still getting errors "operator + cannot be applied WorldDataModel int", witch one I put it wrong,我仍然收到错误“操作符 + 无法应用 WorldDataModel int”,我把它弄错了,
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.