簡體   English   中英

掙扎於 Fragment 和 RecycleView 實現 OnItemClick

[英]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 類的回調發送到您的片段/活動。

  1. 首先創建一個接口類

    public interface OnItemClickListener { void onItemClick(WorldDataModel item); }
  2. 接下來修改你的 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()); } }); }
  3. 現在修改您的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM