简体   繁体   English

如何为recyclerview中动态添加的项目设置OnclickListener?

[英]How to set OnclickListener for the dynamically added items in recyclerview?

In my application I'm using a recycler view to show some data and for each item in recyclerview I'm adding a list of checked text view.在我的应用程序中,我使用回收器视图来显示一些数据,并且对于 recyclerview 中的每个项目,我正在添加已检查文本视图的列表。 These checked textviews are added according to the size of list provided and it works fine.这些检查过的文本视图是根据提供的列表大小添加的,并且工作正常。 Now I want to add the click listener for those items to know if they are checked or not?现在我想为这些项目添加点击监听器以了解它们是否被选中?

When items are checked those checked items should be taken to another activity.检查项目时,应将这些已检查的项目带到另一个活动中。 But now the click listener is added directly in recycler view which won't access me to do out of box code.但是现在点击监听器直接添加到回收器视图中,它不会访问我来执行开箱即用的代码。 So I'm looking for how to add a click listener and access it in another activity.所以我正在寻找如何添加点击监听器并在另一个活动中访问它。

My Recyclerview code:我的 Recyclerview 代码:

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckedTextView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.allio.customer.R;
import com.allio.customer.models.Types_Item;
import com.bumptech.glide.Glide;
import com.firebase.ui.firestore.FirestoreRecyclerAdapter;
import com.firebase.ui.firestore.FirestoreRecyclerOptions;
import com.github.florent37.expansionpanel.ExpansionLayout;
import com.github.florent37.expansionpanel.viewgroup.ExpansionLayoutCollection;

public class Types_adapter extends FirestoreRecyclerAdapter<Types_Item, Types_adapter.RecyclerHolder> {

    private final ExpansionLayoutCollection expansionsCollection = new ExpansionLayoutCollection();
    Context context;

    public Types_adapter(@NonNull FirestoreRecyclerOptions<Types_Item> options, Context context) {
        super(options);
        expansionsCollection.openOnlyOne(true);
        this.context = context;
    }

    @Override
    protected void onBindViewHolder(@NonNull RecyclerHolder holder, int position, @NonNull Types_Item model) {
        expansionsCollection.add(holder.getExpansionLayout());
        holder.textView.setText(model.getName());
        Glide.with(holder.imageView.getContext())
                .load(model.getImageURL())
                .into(holder.imageView);
        CheckedTextView[] textView = new CheckedTextView[model.getProblems().size()];
        holder.problems.removeAllViews();
        for (int i = 0; i < model.getProblems().size(); i++){
            textView[i] = new CheckedTextView(context);
            textView[i].setText(model.getProblems().get(i));
            textView[i].setPadding(10,10,10,10);
            textView[i].setTextSize(15);
            int finalI = i;
            textView[i].setOnClickListener(v -> {
                if (textView[finalI].isChecked()){
                    textView[finalI].setChecked(false);
                    textView[finalI].setCheckMarkDrawable(0);
                }else {
                    textView[finalI].setChecked(true);
                    textView[finalI].setCheckMarkDrawable(R.drawable.checked);
                }
            });
            holder.problems.addView(textView[i]);
        }

    }

    @NonNull
    @Override
    public RecyclerHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        return RecyclerHolder.buildFor(parent);
    }

    public final static class RecyclerHolder extends RecyclerView.ViewHolder {

        private static final int LAYOUT = R.layout.item_types;

        ExpansionLayout expansionLayout;
        TextView textView;
        ImageView imageView;
        LinearLayout problems;

        public static RecyclerHolder buildFor(ViewGroup viewGroup){
            return new RecyclerHolder(LayoutInflater.from(viewGroup.getContext()).inflate(LAYOUT, viewGroup, false));
        }

        public RecyclerHolder(View itemView) {
            super(itemView);
            expansionLayout = itemView.findViewById(R.id.expansionLayout);
            textView = itemView.findViewById(R.id.type_name);
            imageView = itemView.findViewById(R.id.type_image);
            problems = itemView.findViewById(R.id.problems_list);
        }

        public ExpansionLayout getExpansionLayout() {
            return expansionLayout;
        }
    }
}

make an interface class and bind this interface into constructor of adapter class.创建一个接口 class 并将该接口绑定到适配器 class 的构造函数中。

public interface CustomDialogListener {
    void onItemClicked(CheckedTextView checkedTextView);
}

this is for adapter class这是用于适配器 class

private CustomDialogListener mViewClickListener;
public ProductsAdapter(Context context,boolean status) {
    this.context = context;
    this.status = status;
    this.mViewClickListener = (CustomDialogListener) context;
}

and assign interface class method on your required action like onClick on any view.并在您需要的操作上分配接口 class 方法,例如在任何视图上的 onClick。

 textView[i].setOnClickListener(v -> {
            if (textView[finalI].isChecked()){
                textView[finalI].setChecked(false);
                textView[finalI].setCheckMarkDrawable(0);
            }else {
                textView[finalI].setChecked(true);
                textView[finalI].setCheckMarkDrawable(R.drawable.checked);
            }
            listener.onItemClicked(textView);
        });

add implementation of interface in parent activity class and override the interface method.在父活动 class 中添加接口实现并覆盖接口方法。

public class ParentActivity extends AppCompatActivity implements 
YourAdapter.CustomDialogListener {
  
  @Override
  public void onItemClicked(CheckedTextView checkedTextView) {
    //Log.d("Item clicked", checkedTextView.isChecked()+"");
  }
}

thats the way to track event of recyclerView.这就是跟踪recyclerView事件的方式。 hope i made myself clear.希望我说清楚了。

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

相关问题 如何在AsyncTask中的RecyclerView项上设置OnClickListener - How to set OnClickListener on RecyclerView items inside AsyncTask 如何在RecyclerView上设置onClickListener? - How to set onClickListener on RecyclerView? 如何在Fragments中设置RecyclerView OnClickListener? - How to set RecyclerView OnClickListener in Fragments? 如何在 Kotlin 的 recyclerView 的项目中添加 onClickListener? - How to add onClickListener to the items of the recyclerView in Kotlin? 如何在 Fragments 中设置 RecyclerView OnClickListener 和 OnLongClickListener? - How to set RecyclerView OnClickListener an OnLongClickListener in Fragments? 如何在 recyclerView 中设置 OnclickListener 以进行另一个活动 - How to set OnclickListener in recyclerView for going another activity 如何在RecyclerView中为Button设置OnClickListener() - How to set OnClickListener() for Button inside RecyclerView 如何在MVVM结构中的RecyclerView项上设置OnClickListener - How to set OnClickListener on RecyclerView item in MVVM structure 如何为ListView中的项目设置onClickListener(通过从Firebase检索数据来动态生成Listview的项目) - How to set onClickListener for items in a ListView (items of listview are generated dynamically by retreiving data from firebase) 如何保存 RecyclerView 中添加的项目? - How to save items added in RecyclerView?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM