【问题标题】:Android RecyclerView onClickListenerAndroid RecyclerView onClickListener
【发布时间】:2018-11-27 15:49:41
【问题描述】:

我需要在片段中创建的 Android RecyclerView 中获取单击项目的位置。由于recyclerview没有listview之类的监听器,我在网上搜索并找到了一些方法。有些不起作用,有些没有提供位置值。然后我从我看到的示例中使用了我自己的精炼代码,并且在花费了一整天后它工作了。现在我的问题是我需要知道包括性能问题在内的任何缺点。甚至更好的方法(如果可能的话)。

也有人可以帮我在同一个项目中为多个recyclerview重用这段代码

RecyclerButtonClick.java

public class RecyclerButtonClick implements View.OnClickListener {
    YourFragment yourFragment=new YourFragment();
    public int pos;

    public RecyclerButtonClick(int position){
        this.pos=position;
    }
    @Override
    public void onClick(View v) {
        yourFragment.recyclerButtonClicked(pos);
    }
}

现在已经设置好了,我们可以在 Fragment java 文件中的函数中编写要执行的操作。 然后通过创建 Fragment 的实例来调用它。

public void recyclerButtonClicked(int position) {
    ...
    //position will have the index value of the rows in RecyclerView.
    ...
}

RecyclerButtonClick类在RecycleViewAdapter的onBindViewHolder()中的setOnClickListener中被调用

public void onBindViewHolder(MyViewHolder holder, int position) {
    ...
    holder.YOUR_BUTTON.setOnClickListener(new RecyclerButtonClick(position));
    ...
}

非常感谢帮助

如果需要,请更新此 github 链接。 https://github.com/abhinanduN/Android--RecyclerView-onClick-Listener/blob/master/README.md

【问题讨论】:

  • 您为什么要创建该类而不是接口,这是您在搜索过程中肯定会遇到的常用方法?
  • 顺便说一句,您的代码将无法正常工作,因为您创建了一个新片段来调用 click 方法,而不是将其传播到现有片段
  • 这个问题已经回答了,参考这个click
  • @TimCastelijns 确实有效。
  • 它可能会编译,但不会工作。至少不是基于你在这里展示的内容

标签: android performance android-fragments android-recyclerview


【解决方案1】:

你可以做这样的事情。如果你想在课堂之外获得点击事件,你可以 使用界面。

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

public RecyclerViewAdapter() {
}

@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    return null;
}

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {

}

@Override
public int getItemCount() {
    return 0;
}

public class RRecyclerViewHolder extends RecyclerView.ViewHolder implements View

        .OnClickListener {
    public RRecyclerViewHolder(@NonNull View itemView) {
        super(itemView);
    }

    @Override
    public void onClick(View v) {
        int selectPosition = getAdapterPosition();
    }
}

}

【讨论】:

    【解决方案2】:

    RecyclerView 没有 ListView 的 setOnItemClickListener。 如果您想让他在片段中创建的 Android RecyclerView 中单击项目位置,请按照以下示例操作:

    1. OnFragement.java 在片段中包含 recyclerview:
    公共类 OneFragment 扩展片段 { 回收器视图回收器视图; 字符串 arr[]={"Apple","Banana","Mango","Orange"}; 公共静态 OneFragment newInstance() { 捆绑参数 = 新捆绑(); OneFragment 片段 = 新的 OneFragment(); 片段.setArguments(args); 返回片段; } @Nullable @覆盖 public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup 容器, @Nullable Bundle savedInstanceState) { 查看视图=inflater.inflate(R.layout.fragment_one,null); recyclerView=view.findViewById(R.id.recyclerview); 线性布局管理器线性布局管理器=新线性布局管理器(getActivity()); linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); recyclerView.setLayoutManager(linearLayoutManager); MyAdapter myAdapter=new MyAdapter(getActivity(),arr); recyclerView.setAdapter(myAdapter); 返回视图; }
    1. 在您的自定义适配器中执行以下操作:
    公共类 MyAdapter 扩展 RecyclerView.Adapter { 上下文上下文; 字符串数组[]; 布局充气机布局充气机; 公共 MyAdapter(FragmentActivity 活动,字符串 [] arr){ 上下文=活动; 数组=arr; layoutInflater=LayoutInflater.from(context); } @NonNull @覆盖 public MyHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { 查看视图=layoutInflater.inflate(R.layout.recycler_row,null); 返回新的 MyHolder(视图); } @覆盖 public void onBindViewHolder(@NonNull MyHolder myHolder, final int i) { myHolder.tvName.setText(array[i]); //单击按钮或行上的任何 UI 组件后获取位置 myHolder.btnBuy.setOnClickListener(new View.OnClickListener() { @覆盖 公共无效 onClick(查看 v){ Toast.makeText(context,"你在第"+i+"个位置点击了"+array[i]+",Toast.LENGTH_SHORT).show(); } }); //单击一个itemview或行后获取位置 myHolder.itemView.setOnClickListener(new View.OnClickListener() { @覆盖 公共无效 onClick(查看 v){ Toast.makeText(context,"你点击了第"+i+"个位置的项目",Toast.LENGTH_SHORT).show(); } }); } @覆盖 公共 int getItemCount() { 返回数组.长度; } MyHolder 类扩展 RecyclerView.ViewHolder { TextView 电视名称; 按钮 btn购买; public MyHolder(@NonNull View itemView) { 超级(项目视图); tvName=itemView.findViewById(R.id.tv_fruit); btnBuy=itemView.findViewById(R.id.btn_buy); } }

    【讨论】:

      猜你喜欢
      • 2015-09-04
      • 1970-01-01
      • 2021-03-23
      • 2016-11-05
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多