简体   繁体   English

如何在 Fragments 中设置 RecyclerView OnClickListener 和 OnLongClickListener?

[英]How to set RecyclerView OnClickListener an OnLongClickListener in Fragments?

I'm trying to start a new Fragment that shows the details of the item that was clicked on in the RecyclerView.我正在尝试启动一个新的片段,以显示在 RecyclerView 中单击的项目的详细信息。 The RecyclerView is on a Fragments. RecyclerView 位于片段上。 I've tried this in Activities and it worked perfectly but I'm trying to convert it to use on Fragments.我已经在活动中尝试过它并且效果很好,但我正在尝试将其转换为在片段上使用。 And Also, how to detect other gestures in the RecyclerView (swipe, etc...)此外,如何检测 RecyclerView 中的其他手势(滑动等)

My Adapter:我的适配器:

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {

private final ArrayList<Tip> dataSet;

public static class MyViewHolder extends RecyclerView.ViewHolder {

    TextView textViewTitle;
    TextView textViewType;
    //TextView textViewDetail;
    ImageView imageViewImage;

    public MyViewHolder(View itemView) {

        super(itemView);

        this.textViewTitle = itemView.findViewById(R.id.title);
        this.textViewType = itemView.findViewById(R.id.type);
        //this.textViewDetail = itemView.findViewById(R.id.detail);
        this.imageViewImage = itemView.findViewById(R.id.itemImage);
    }
}

public MyAdapter(ArrayList<Tip> data) {
    this.dataSet = data;
}


@NonNull
@Override
public MyAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

    View view = LayoutInflater.from(parent.getContext()).inflate( R.layout.item, parent, false);
    view.setOnClickListener(HomeFragment.myOnClickListener);
    MyViewHolder myViewHolder = new MyViewHolder(view);

    return myViewHolder;
}

@Override
public void onBindViewHolder(@NonNull MyAdapter.MyViewHolder holder, int listPosition) {

    TextView textViewTitle = holder.textViewTitle;
    TextView textViewType = holder.textViewType;
    //TextView textViewDetail = holder.textViewDetail;
    ImageView imageViewImage = holder.imageViewImage;

    textViewTitle.setText( dataSet.get(listPosition).getTitle() );
    textViewType.setText( dataSet.get(listPosition).getType() );
    //textViewDetail.setText( dataSet.get(listPosition).getDetail() );
    imageViewImage.setImageResource( dataSet.get(listPosition).getImage() );

}

@Override
public int getItemCount() {
    return dataSet.size();
}

} }

My Fragment:我的片段:

public class HomeFragment extends Fragment {

public static RecyclerView.Adapter myAdapter;
private static RecyclerView.LayoutManager myLayoutManager;
private static RecyclerView myRecyclerView;
public static View.OnClickListener myOnClickListener;

private static ArrayList<Tip> myData;




public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    // Get the integer from the integers.xml resource file
    Resources res = getResources();
    int gridColumnCount = res.getInteger(R.integer.grid_column_count);


    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_home, container, false);



    // Add the following lines to create RecyclerView
    myRecyclerView = view.findViewById(R.id.my_recycler_view);
    myRecyclerView.setHasFixedSize(true);

    //myLayoutManager = new LinearLayoutManager( view.getContext() );
    myLayoutManager = new GridLayoutManager( view.getContext(),gridColumnCount );

    myRecyclerView.setLayoutManager( myLayoutManager );
    myRecyclerView.setItemAnimator( new DefaultItemAnimator() );

    myData = new ArrayList<Tip>();
    for (int i = 0; i < MyData.tipTitleArray.length; i++) {
        myData.add(new Tip( MyData.tipTitleArray[i], MyData.tipTypeArray[i], MyData.tipDetailArray[i], MyData.id_[i], MyData.tipImageArray[i] ));

    }

    myAdapter = new MyAdapter(myData);
    myRecyclerView.setAdapter(myAdapter);
//On retourne la View
    return view;

}

@Override
public void onDestroyView() {
    super.onDestroyView();
    fr.cnam.smb116.mimi_tips_navdraw.databinding.FragmentHomeBinding binding = null;
}

} }

Don't use static listener and recyclerview instance.不要使用 static 监听器和 recyclerview 实例。 Better to add callBack function to handle this.最好添加 callBack function 来处理这个问题。 eg例如

interface RecyclerViewItemClickListener<T> {
  void onClick(int position, T data);
}

init property in your adapter适配器中的 init 属性

RecyclerViewItemClickListener<Tip> listener

constructor of your Adapter适配器的构造函数

MyAdapter(RecyclerViewItemClickListener<Tip> listener) {
   this. listener = listener
}

in

onBindViewHolder() {
   holder.setOnClickListener(v -> {
      listener.onClick(position, dataSet.get(listPosition));
   })
}

In Your Fragment Implement this interface在你的片段中实现这个接口

public class HomeFragment extends Fragment implements RecyclerViewItemClickListener<Tip> {
 
}

your adapter instance你的适配器实例

myAdapter = new MyAdapter(myData,this);

implement onClick Method in your fragment在您的片段中实现 onClick 方法

void onClick(int position, Tip tip){
// your listener
} 

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何在Fragments中设置RecyclerView OnClickListener? - How to set RecyclerView OnClickListener in Fragments? 如何在RecyclerView上设置onClickListener? - How to set onClickListener on RecyclerView? 如何在LungClickListener上设置recyclerview项时具有ContextMenu - How to have a ContextMenu when the recyclerview item is set onLongClickListener 如何在单个查看器中实现onClickListener和onLongClickListener? - How to implement onClickListener and onLongClickListener in a single viewholder? Android:如何使用 onClickListener 和 onLongClickListener 编写 AlertDialog - Android: How to code an AlertDialog with onClickListener and onLongClickListener 如何在RecyclerView中为Button设置OnClickListener() - How to set OnClickListener() for Button inside RecyclerView 如何在MVVM结构中的RecyclerView项上设置OnClickListener - How to set OnClickListener on RecyclerView item in MVVM structure 如何在AsyncTask中的RecyclerView项上设置OnClickListener - How to set OnClickListener on RecyclerView items inside AsyncTask 如何为recyclerview中动态添加的项目设置OnclickListener? - How to set OnclickListener for the dynamically added items in recyclerview? 如何在 recyclerView 中设置 OnclickListener 以进行另一个活动 - How to set OnclickListener in recyclerView for going another activity
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM