[英]FirebaseRecyclerAdapter OnItemClick from fragment to fragment
[英]struggling with Fragment and RecycleView implement OnItemClick
我嘗試使用 RecycleView Adapter 在 Fragment 中實現 OnItemClickListener,但我的代碼似乎不能正常工作,當我嘗試將其更改為 getContext() 時 OnItemClickListener 一直變紅。 我試圖找到很多方法來完成它,但這讓我在我的代碼中發現了另一個錯誤。 . 你的幫助會讓我的日子更美好,
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;
}
這是我的適配器類
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();
}
}
您可以將 Adapter 類的回調發送到您的片段/活動。
首先創建一個接口類
public interface OnItemClickListener { void onItemClick(WorldDataModel item); }
接下來修改你的 Adapter 類,在你的情況下RecycleViewWorldAdapter
i)在構造函數中將偵聽器作為參數發送
private final OnItemClickListener listener; public RecycleViewWorldAdapter(ArrayList<WorldDataModel> worldDataModelArrayList, OnItemClickListener listener) { this.worldDataModelArrayList = worldDataModelArrayList; this.listener = listener; }
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()); } }); }
現在修改您的 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);
我把 MyView Holder 改成了這個
linearLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.onItemClick(worldDataModelArrayList.get(getAdapterPosition()), worldDataModelArrayList.get(getPosition()));
}
});
我把我的接口 OnItemClickListener 改成了這個;
public interface OnItemClickListener {
void onItemClick(WorldDataModel item, WorldDataModel position);
}
然后我把我的片段 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);
}
我仍然收到錯誤“操作符 + 無法應用 WorldDataModel int”,我把它弄錯了,
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.