[英]Pass the data from Recyclerview adapter to Fragment
在我的片段课中
public class ReceiveFragment extends Fragment implements ReceiverRecyclerViewAdapter.OnItemClick {
btnGenAddress.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
linearLayoutMyWalletInfo.setVisibility(View.VISIBLE);
linearLayoutGenAddress.setVisibility(View.GONE);
recyclerViewAdapter = new ReceiverRecyclerViewAdapter(getActivity(),subjects, emails,this);
recyclerViewCardContainer.setAdapter(recyclerViewAdapter);
}
});
@Override
public void onClick(String value) {
}
在ReceiverRecyclerViewAdapter类中,我创建了一个接口,现在当我在片段中编写recyclerViewAdapter = new ReceiverRecyclerViewAdapter(getActivity(),主题,电子邮件,this)时; }它给人的complie时间错误,当我用“这个”参数。
和我的ReceiverRecyclerViewAdapter类
public class ReceiverRecyclerViewAdapter extends RecyclerView.Adapter<ReceiverRecyclerViewAdapter.ViewHolder>{
private OnItemClick mCallback;
public ReceiverRecyclerViewAdapter(Context context1,String[] SubjectValues1, String[] SubjectValues2,OnItemClick listener){
SubjectValues = SubjectValues1;
EmailValues2 = SubjectValues2;
context = context1;
this.mCallback = listener;
}
public interface OnItemClick {
void onClick(String value);
}
itemView.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
// get position
int pos = getAdapterPosition();
// check if item still exists
if(pos != RecyclerView.NO_POSITION){
String clickedDataItem = SubjectValues[pos];
Toast.makeText(v.getContext(), "You clicked " + clickedDataItem, Toast.LENGTH_SHORT).show();
mCallback.onClick(clickedDataItem);
}
}
});
}
您从片段传递了4个参数,但构造函数期望为3。因此,您需要将Context
作为适配器中的第一个参数添加。
更新:
您正在匿名实例中传递this
实例,该匿名类是未实现该接口的OnClickListener
。 因此,与其相反,请传递ReceiveFragment.this
,这样您就可以引用实现接口的片段:
recyclerViewAdapter = new ReceiverRecyclerViewAdapter(getActivity(),subjects, emails, ReceiveFragment.this);
问题是因为当您从OnClickListener传递this
参数时,它传递的是on click实例,而不是该接口。 您可以像下面的代码一样在片段中初始化接口,然后在适配器中传递接口。
OnItemClick onitemClick = (OnItemClick) this;
btnGenAddress.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
linearLayoutMyWalletInfo.setVisibility(View.VISIBLE);
linearLayoutGenAddress.setVisibility(View.GONE);
recyclerViewAdapter = new ReceiverRecyclerViewAdapter(getActivity(),subjects, emails,onitemClick);
recyclerViewCardContainer.setAdapter(recyclerViewAdapter);
}
});
public class ReceiverRecyclerViewAdapter extends RecyclerView.Adapter<ReceiverRecyclerViewAdapter.ViewHolder>{
private OnItemClick mCallback;
public ReceiverRecyclerViewAdapter(Context context, String[] SubjectValues1, String[] SubjectValues2,OnItemClick listener){
SubjectValues = SubjectValues1;
EmailValues2 = SubjectValues2;
this.context = context;
this.mCallback = listener;
}
public interface OnItemClick {
void onClick(String value);
}
itemView.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
// get position
int pos = getAdapterPosition();
// check if item still exists
if(pos != RecyclerView.NO_POSITION){
String clickedDataItem = SubjectValues[pos];
Toast.makeText(v.getContext(), "You clicked " + clickedDataItem, Toast.LENGTH_SHORT).show();
mCallback.onClick(clickedDataItem);
}
}
});
}
尝试这个:
在适配器中:
编写public ReceiverRecyclerViewAdapter(Context context1,String[] SubjectValues1, String[] SubjectValues2,OnItemClick listener)
片段中:
创建一个对象: OnItemClick onItemClick;
在构造函数中: this.OnItemClick = onItemClick;
在适配器中传递此对象。
活动中:
实现此listner
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.