【问题标题】:How to set OnclickListener for the dynamically added items in recyclerview?如何为recyclerview中动态添加的项目设置OnclickListener?
【发布时间】:2020-07-22 21:35:48
【问题描述】:

在我的应用程序中,我使用回收器视图来显示一些数据,并且对于回收器视图中的每个项目,我正在添加已检查文本视图的列表。这些检查过的文本视图是根据提供的列表大小添加的,并且工作正常。现在我想为这些项目添加点击监听器以了解它们是否被选中?

检查项目时,应将这些已检查的项目带到另一个活动中。但是现在点击监听器直接添加到回收器视图中,它不会访问我来执行开箱即用的代码。所以我正在寻找如何添加点击监听器并在另一个活动中访问它。

我的 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;
        }
    }
}

【问题讨论】:

  • CheckedTextView[] textView; 将其设为类变量。如果您需要数据,请使用 for 循环和 textView[i].isChecked() 来获取状态。
  • i want to get the list of selected items ?您想要检查项目的列表吗?
  • @blackapps 抱歉回复晚了。 In my case when an item from the list is selected then a child layout is shown and a number is displayed according to the no.从列表中选择的项目如果没有选择项目,则子布局将隐藏。当检查时,这些选定项目的列表将被带到另一个活动。我正在寻找一种正确的方法来了解检查的 textview 的状态并相应地编写代码。
  • @blackapps 希望我能得到一个解决方案,因为我在过去一周一直在努力解决这个问题。这个唯一的解决方案可以帮助我完成我的应用程序。
  • 我在第一条评论中就告诉了大家。你还需要什么?

标签: android firebase android-recyclerview checkedtextview


【解决方案1】:

创建一个接口类,并将这个接口绑定到适配器类的构造函数中。

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

这是用于适配器类的

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

并为您所需的操作分配接口类方法,例如 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);
        });

在父activity类中添加接口的实现并覆盖接口方法。

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

这就是跟踪recyclerView事件的方式。 希望我说清楚了。

【讨论】:

  • 我会尝试检查您的解决方案是否对我有帮助。
  • listener.onItemClicked(textView);将其替换为 listener.onItemClicked(textView[i]); // 应该是 CheckedTextView 的实例
  • 很高兴为您提供帮助。
猜你喜欢
  • 1970-01-01
  • 2020-10-07
  • 1970-01-01
  • 2021-01-04
  • 1970-01-01
  • 2022-08-19
  • 2020-05-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多