通过接口将值从适配器传递给另一个 activity

pass value from adapter to another activity through interface

请不要将我的问题标记为与 none 为我提供的解决方案重复

我试图通过接口将值从适配器传递到另一个 activity......

错误显示在这个 evrytime :--- data clickedItem = mdata.get(position);

给予

java.lang.NullPointerException: 尝试在空对象引用

上调用接口方法'java.lang.Object java.util.List.get(int)'

以下是我的代码:-------------------- 适配器:---

public class ExampleAdapter extends RecyclerView.Adapter<ExampleAdapter.ExampleViewHolder> {
Context mContext;
 List<data> mExampleList;
 OnItemClickListener mListener;
public interface OnItemClickListener {
    void onItemClick(int position);
}
public void setOnItemClickListener(OnItemClickListener listener) {
    mListener = listener;
}
public ExampleAdapter(Context context,List<data> exampleList) {
    mContext = context;
    mExampleList = exampleList;
}
@Override
public ExampleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.employeelist, parent, false);
    ExampleViewHolder evh = new ExampleViewHolder(v);
    return evh;
}
@Override
public void onBindViewHolder(ExampleViewHolder holder, final int position) {
    data currentItem = mExampleList.get(position);

    Picasso.get().load(currentItem.getAvatar()).into(holder.mimageView);

    holder.mtextview1.setText(String.format("%s %s", currentItem.getFirst_name(), currentItem.getLast_name()));
    holder.mtextveiew2.setText(currentItem.getEmail());
    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            mListener.onItemClick(position);

        }
    });

}
@Override
public int getItemCount() {
    return mExampleList.size();
}
public class ExampleViewHolder extends RecyclerView.ViewHolder {
    public ImageView mimageView;
    public TextView mtextview1;
    public TextView mtextveiew2;
    public ExampleViewHolder(View itemView) {
        super(itemView);
        mimageView = itemView.findViewById(R.id.imageView);
        mtextview1 = itemView.findViewById(R.id.textView1);
        mtextveiew2 = itemView.findViewById(R.id.textView2);

    }
}

}

另一个activity:--

public class Details extends AppCompatActivity {
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_details);
    textView=findViewById(R.id.tvEmail);
    Intent intent = getIntent();

    String emailadd = intent.getStringExtra("email");
    textView.setText(emailadd);

}

}

样例 :--

public class SampleResponse {
@SerializedName("page")
@Expose
private String page;
@SerializedName("per_page")
@Expose
private String per_page;
@SerializedName("total")
@Expose
private String total;
@SerializedName("total_pages")
@Expose
private String total_pages;
@SerializedName("data")
@Expose
private List<data> dataArray = null;

public String getPage() {
    return page;
}

public void setPage(String page) {
    this.page = page;
}

public String getPer_page() {
    return per_page;
}

public void setPer_page(String per_page) {
    this.per_page = per_page;
}

public String getTotal() {
    return total;
}

public void setTotal(String total) {
    this.total = total;
}

public String getTotal_pages() {
    return total_pages;
}

public void setTotal_pages(String total_pages) {
    this.total_pages = total_pages;
}

public List<data> getDataArray() {
    return dataArray;
}

public void setDataArray(List<data> dataArray) {
    this.dataArray = dataArray;
}

}

数据点:--

public class data {
@SerializedName("id")
@Expose
private String id;
@SerializedName("first_name")
@Expose
private String first_name;
@SerializedName("last_name")
@Expose
private String last_name;
@SerializedName("email")
@Expose
private String email;
@SerializedName("avatar")
@Expose
private String avatar;

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public String getFirst_name() {
    return first_name;
}

public void setFirst_name(String first_name) {
    this.first_name = first_name;
}

public String getLast_name() {
    return last_name;
}

public void setLast_name(String last_name) {
    this.last_name = last_name;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

public String getAvatar() {
    return avatar;
}

public void setAvatar(String avatar) {
    this.avatar = avatar;
}

}

主要activity:--

public class MainActivity extends AppCompatActivity implements ExampleAdapter.OnItemClickListener {
 RecyclerView mRecyclerView;
 ExampleAdapter mAdapter;
 RecyclerView.LayoutManager mLayoutManager;
 List<data> mdata;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    mRecyclerView = findViewById(R.id.recyclerView);
    mLayoutManager = new LinearLayoutManager(this);
    mRecyclerView.setLayoutManager(mLayoutManager);
    
    jsonparse();
}

private void jsonparse() {
    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("https://reqres.in/api/")
            .addConverterFactory(GsonConverterFactory.create())
            .build();

    EmployeeAPI request = retrofit.create(EmployeeAPI.class);
    Call<SampleResponse> call1 = request.getJson(10);
    call1.enqueue(new Callback<SampleResponse>() {
        @Override
        public void onResponse(Call<SampleResponse> call, retrofit2.Response<SampleResponse> response) {

            List<data> exampleList = response.body().getDataArray();
            mAdapter = new ExampleAdapter(MainActivity.this,exampleList);
            mRecyclerView.setAdapter(mAdapter);
            mAdapter.setOnItemClickListener(MainActivity.this);

        }

        @Override
        public void onFailure(Call<SampleResponse> call, Throwable t) {
        }
    });
}

@Override
public void onItemClick(int position) {
    Intent detailIntent = new Intent(this, Details.class);
    data clickedItem = mdata.get(position);
    detailIntent.putExtra("email", clickedItem.getEmail());
    startActivity(detailIntent);
}

NullPointerException 的问题是由于 activity 上的变量 List<data> mdata; 造成的。

它崩溃的原因是因为你声明了变量 List<data> mdata; 但从未给它赋值,因此它最终因 'null pointer' 而崩溃,因为没有从该变量读取的值。

我建议对您的 activity 进行以下修改以暂时解决您的问题,但仍然是永久性修复将重构 OnItemClickListener

临时修复:

在您的 jsonparse() 方法中,您需要为 mdata 赋值,然后像下面的代码片段一样使用它:

mdata = response.body().getDataArray(); // remove local variable from here and assign value directly to mdata
mAdapter = new ExampleAdapter(MainActivity.this, mdata); // instead of local variable exampleList, you now pass mdata

这将暂时解决您的问题

永久修复:

为了正确解决这个问题,我建议遵循重构 (我推荐这种方法,因为它不太容易出错,并且不需要你在 activity 上有局部变量).

与其将位置从适配器传递到 activity,不如直接通过方法传递变量,这样就不会在本地存储列表。

修改后的界面:

public interface OnItemClickListener {
    void onItemClick(data selectedData);
}

& 在 onClick onClick 适配器项目时,像这样使用它:mListener.onItemClick(mExampleList.get(position));

这也会更改您在 activity 上覆盖方法的代码:

@Override
public void onItemClick(data selectedData) {
    Intent detailIntent = new Intent(this, Details.class);
    detailIntent.putExtra("email", selectedData.getEmail());
    startActivity(detailIntent);
}