通过接口将值从适配器传递到另一个活动 [英] pass value from adapter to another activity through interface

查看:73
本文介绍了通过接口将值从适配器传递到另一个活动的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

请不要将我的问题标记为重复,因为没有一种解决方案适合我

please dont mark my question as duplicate as none of the solutions wotked for me

我试图通过接口将适配器的值传递给另一个活动…….

i was trying to pass value from adapter to another activity through interface.......

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

the error shows at this evrytime :--- data clickedItem = mdata.get(position);

给予

java.lang.NullPointerException:尝试在空对象引用上调用接口方法'java.lang.Object java.util.List.get(int)'

java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.Object java.util.List.get(int)' on a null object reference

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

following is my code :------------------- Adapter :---

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);

    }
}

}

另一项活动:-

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);

}

}

pojo示例:-

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

}

数据pojo:-

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

}

主要活动:-

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问题是由于活动中的变量List<data> mdata;.

Your issue with the NullPointerException is due to your variable List<data> mdata; on the activity.

它崩溃的原因是因为您已经声明了变量List<data> mdata;但从未为其赋值,因此它最终由于空指针"而崩溃,因为没有值可从该变量中读取.

The reason it is crashing is because you've declared variable List<data> mdata; but never assigned value to it, thus it eventually crash due to 'null pointer' because there's no value to read from that variable.

我建议对您的活动进行以下修改以临时解决您的问题,但仍然可以在OnItemClickListener上重构永久性修复.

I would suggest following modification on your activity to fix your issue temporarily but still permanent fix would be refactor on OnItemClickListener.

临时修订:

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

On your jsonparse() method, you'll need to assign value to mdata and then use it afterwards like below code snippet:

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

这将暂时解决您的问题

永久修复程序:

要正确解决此问题,我建议遵循重构(我建议采用这种方法,因为这样不易出错,并且不需要在活动时使用局部变量).

To fix this properly, I would suggest following refactor (I recommend this approach because it would be less error prone and doesn't require you to have local variable on activity).

与其将位置从适配器传递到活动,不如直接通过方法传递变量,以免最终不在本地存储列表.

Instead of passing position from adapter to activity, you should instead pass variable directly via method, so that you don't end up storing list locally.

修改后的界面:

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

&在适配器项目的onClick期间,按以下方式使用它:mListener.onItemClick(mExampleList.get(position));

& During onClick on adapter item, use it like this: mListener.onItemClick(mExampleList.get(position));

这还会更改您覆盖方法的活动代码:

This also changes your code on activity where you override method:

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

这篇关于通过接口将值从适配器传递到另一个活动的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆