【问题标题】:can't use Intent inside a RecyclerView Adapter不能在 RecyclerView 适配器中使用 Intent
【发布时间】:2022-01-25 19:45:19
【问题描述】:

我正在制作一个应用程序,您可以在其中跟踪自己的成绩。目前,我正在开发一个添加主题的系统。所以,我想在 RecyclerView 上显示主题。所以,我有一个添加主题的活动,它获取主题的名称,将其存储在数组列表中,将数组列表发送到 RecyclerView 适配器并将主题名称显示为一个项目。

我面临的问题是,我似乎无法使用 Intent 传输 arraylist 的值。我在适配器中遇到错误,特别是当我尝试使用名为 getIntent() 的命令时。

这是 RecyclerAdapter.java 文件中的代码:


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

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

import java.util.ArrayList;

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

   private ArrayList<String> subjectList;

   public recyclerAdapter(ArrayList<String> subjectList){
       this.subjectList = subjectList;
   }

   public class MyViewHolder extends RecyclerView.ViewHolder{
       private TextView subjectName;

       public MyViewHolder(final View view){
           super(view);
           subjectName = view.findViewById(R.id.txtSubjectName);

           Intent addedSubject = getIntent(); //I get the error in this line, specifically getIntent()
           subjectList = addedSubject.getStringArrayListExtra("Subject");
       }
   }

   @NonNull
   @Override
   public recyclerAdapter.MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
       View subjectView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_subjects, parent, false);
       return new MyViewHolder(subjectView);
   }

   @Override
   public void onBindViewHolder(@NonNull recyclerAdapter.MyViewHolder holder, int position) {
       String subject = subjectList.get(position);
       holder.subjectName.setText(subject);
   }

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

这是您在其中添加主题名称的活动中的代码:


import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.DefaultItemAnimator;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.widget.EditText;
import android.widget.Toast;

import java.util.ArrayList;

public class addSubject extends AppCompatActivity {

    private ArrayList<Subjects> subjectList;
    private boolean subjectAdded = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getSupportActionBar().hide();
        setContentView(R.layout.activity_add_subject);
        subjectList = new ArrayList<>();
    }

    public void addSubject (View view){
        EditText editSubjectName = findViewById(R.id.editSubjectName);
        Intent backToMain = new Intent(this, MainActivity.class);
        Intent toAdapter = new Intent(this, recyclerAdapter.class);
        String subjectName = editSubjectName.getText().toString();

        if (!subjectName.equals("")){
            subjectList.add(new Subjects(subjectName));
            toAdapter.putExtra("Subject", subjectList);
            startActivity(backToMain);
        }
        else
            Toast.makeText(getApplicationContext(),"Invalid values, try again",Toast.LENGTH_SHORT).show();

    }


【问题讨论】:

  • getIntent()Activitys 方法,在适配器中不可用。如果您想将此Intent 传递给适配器,则将其传递给构造函数
  • @snachmsm 我该怎么做?
  • 显示如何启动适配器
  • 我遵循了一个教程,它说要在主活动中使用它:recyclerAdapter adapter = new recyclerAdapter(subjectList); RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getApplicationContext()); rvSubject.setLayoutManager(layoutManager); rvSubject.setItemAnimator(new DefaultItemAnimator()); rvSubject.setAdapter(adapter);
  • 跟随@Narendra_Nath 的回答,简而言之,new Intent(this, recyclerAdapter.class) 行没有意义,也不会直接将数据分发给recyclerAdapter。除此之外,它甚至没有被进一步使用,除了为它设置一些数据之外,另一个Intent 正在由startActivity 运行。阅读Intents,如何使用它们在上下文扩展类之间传递数据(适配器不扩展Context

标签: java android android-recyclerview


【解决方案1】:

为什么不用一组新的subjectList 重新初始化recyclerView。 `binding.rv.adapter=recyclerAdapter(//新建主题列表)

由于它是一个 Activity 特定的方法,它在适配器中不可用。

但是,如果您的目标是更新数据,则可以使用更优雅的解决方案,例如 notifyDataSet() 或使用适配器内部的方法。

但是,如果您有一个复杂的实现,Passing data from an activity back to recyclerview adapter 上的这个答案可能会有所帮助。

Ps:让你的班级名称大写。这是一个编码规范

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多