【问题标题】:RecyclerView and Item Position and click on particular itemRecyclerView 和 Item Position 并单击特定项目
【发布时间】:2021-08-15 17:53:09
【问题描述】:

这是我的应用程序的界面,我的问题是,如果我点击“视频讲座”,那么它应该进入视频讲座活动,如果我点击“详细笔记”,那么它应该进入详细笔记活动。同样,我想处理所有 recyclerView 项目。

这是我的适配器代码

package com.example.motionofknowledge;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

import com.example.motionofknowledge.databinding.ActivityMaterialsBinding;
import com.google.firebase.firestore.DocumentSnapshot;
import com.google.firebase.firestore.EventListener;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.FirebaseFirestoreException;
import com.google.firebase.firestore.QuerySnapshot;

import java.util.ArrayList;

public class Materials extends AppCompatActivity {

    ActivityMaterialsBinding binding;
    FirebaseFirestore database;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = ActivityMaterialsBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());
        getSupportActionBar().hide();

        String head = getIntent().getStringExtra("subName");

        TextView textView = findViewById(R.id.headingMat);
        textView.setText(new String(head));

        database = FirebaseFirestore.getInstance();

        ArrayList<MatModel> materials = new ArrayList<>();
        MatAdapter adapter = new MatAdapter(this,materials);

        String subId = getIntent().getStringExtra("subId");

        database.collection("subjects")
                .document(subId)
                .collection("mat")
                .orderBy("index")

                .addSnapshotListener(new EventListener<QuerySnapshot>() {

                    @Override
                    public void onEvent(@Nullable QuerySnapshot value, @Nullable FirebaseFirestoreException error) {
                        materials.clear();
                        for (DocumentSnapshot snapshot:value.getDocuments()){
                            MatModel model = snapshot.toObject(MatModel.class);
                            model.setMatId(snapshot.getId());
                            materials.add(model);
                        }
                        adapter.notifyDataSetChanged();
                    }
                });

        binding.matList.setLayoutManager(new GridLayoutManager(this,2));
        binding.matList.setAdapter(adapter);


        binding.matHome.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(Materials.this,MainActivity.class);
                startActivity(intent);
            }
        });

    }
}

这是我的适配器代码

package com.example.motionofknowledge;

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

import com.bumptech.glide.Glide;

import java.util.ArrayList;

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

public class MatAdapter extends RecyclerView.Adapter<MatAdapter.MatViewHolder>{


    Context context;
    ArrayList<MatModel> matModels;

    public MatAdapter(Context context, ArrayList<MatModel> matModels){
        this.context = context;
        this.matModels = matModels;

    }

    @NonNull
    @Override
    public MatViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.item_category,null);

        return new MatViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull MatViewHolder holder, int position) {

        MatModel model = matModels.get(position);
        holder.textView.setText(model.getMatName());
        Glide.with(context)
                .load(model.getMatImage())
                .into(holder.imageView);

        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                Intent intent = new Intent(context,Chapters.class);
                intent.putExtra("matId",model.getMatId());
                context.startActivity(intent);

            }
        });
        
    }

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

    public class MatViewHolder extends RecyclerView.ViewHolder{

        ImageView imageView;
        TextView textView;

        public MatViewHolder(@NonNull View itemView) {
            super(itemView);
            imageView = itemView.findViewById(R.id.image);
            textView = itemView.findViewById(R.id.category);
        }
    }
}

【问题讨论】:

  • 请支持我解决这个问题

标签: android-recyclerview adapter onclicklistener


【解决方案1】:

您发布的不是适配器代码,而是您的活动代码。无论如何:我知道您有一个 recyclerView,其中包含不同类型的项目(视频讲座、详细说明等)。根据用户点击的项目,你想做不同的事情。

这是通过在您的MatAdapter 中使用onBindViewHolder 方法完成的。该方法不仅可以将数据绑定到 UI 布局,还应该用于将点击监听器绑定到 UI 布局。

如果您的 RecyclerView 中只有几个项目,您可以使用适配器的 getItem(position) 方法来找出您在 onBindViewHolder 中处理的特定项目。只要知道Adapter要绑定什么样的item,就可以设置相应的点击监听了。

看到这个建议:

holder.itemView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {

        Intent intent = null

        if (model.type == VIDEO) {
            intent = new Intent(context,Video.class);
        } else if (model.type == DETAILS) {
            intent = new Intent(context,Details.class);
        } else {
          ...
        }
    
        intent.putExtra("matId",model.getMatId());
        context.startActivity(intent);

    }
});
  • model 是您要绑定的当前 MatModel
  • model.type 是区分不同项目的任何方式。我不知道MatModel 类的详细信息,但您当然需要能够区分不同的模型。

【讨论】:

  • 先生,请阅读我的适配器代码并建议如何在我的应用程序中实现此方法
  • @Ravi chill :) stackoverflow 不是一个帮助中心,人们在那里等待您的反应立即回复您;)我添加了一些您可以在适配器中使用的代码。
  • @mutezenflo 先生,我已经完成了所有这些,但它仍然显示错误
  • @mutezenflo : java.lang.NullPointerException: 尝试调用虚拟方法 'android.content.Intent android.content.Intent.putExtra(java.lang.String, java.lang.String)' on空对象引用
  • 现在这是基本的编程。阅读错误消息:您的意图对象仍然为空。所以没有一个 if 分支是“真的”。为此我无法帮助您,因为我不知道您要为每个 if 分支启动哪些活动。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-01
  • 1970-01-01
  • 2020-01-19
相关资源
最近更新 更多