简体   繁体   English

挣扎于 Fragment 和 RecycleView 实现 OnItemClick

[英]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 类的回调发送到您的片段/活动。

  1. First create a interface class首先创建一个接口类

    public interface OnItemClickListener { void onItemClick(WorldDataModel item); }
  2. 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()); } }); }
  3. 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM