需要解释从适配器发送数据到片段
Posted
技术标签:
【中文标题】需要解释从适配器发送数据到片段【英文标题】:Need explanation on sending data from adapter to fragment 【发布时间】:2019-12-27 07:53:20 【问题描述】:我想将数据从适配器发送到已经打开的片段。 在主活动中,已经打开了两个片段,片段 A 和片段 B。在片段 A 中,我放置了一个 RecyclerView 和 CardView。单击其中一个卡片视图时,我想将其数据发送到片段 B。并且在调用 mCallbacks 时得到 NPE。
if (mCallbacks != null)
mCallbacks.onItemClicked(strStockName);
在这种情况下,我使用了一个接口。但我需要更多解释。
这是我的适配器的代码:
public class adapterStock extends RecyclerView.Adapter<adapterStock.ViewHolder>
private String[] stockNameDataSet;
private Context mContext;
//==============================================
//---- interface
public interface Callbacks
public void onItemClicked(String StockName);
private Callbacks mCallbacks;
//==============================================
public adapterStock(Context context, String[] DataSet)
stockNameDataSet = DataSet;
mContext = context;
@NonNull
@Override
public adapterStock.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType)
LayoutInflater layoutInflater = LayoutInflater.from(viewGroup.getContext());
View view = layoutInflater.inflate(R.layout.cv_stock, viewGroup, false);
return new ViewHolder(view);
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position)
final String strStockName = stockNameDataSet[position];
holder.tbxStockName.setText(stockNameDataSet[position]);
holder.cardView.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View view)
Snackbar.make(view, "Stock "+strStockName, Snackbar.LENGTH_LONG).show();
if (mCallbacks != null)
mCallbacks.onItemClicked(strStockName);
);
@Override
public int getItemCount()
return stockNameDataSet.length;
public static class ViewHolder extends RecyclerView.ViewHolder
public View view;
public TextView tbxStockName;
public CardView cardView;
public ViewHolder(View v)
super (v);
tbxStockName = (TextView) v.findViewById(R.id.cvTbxItemStockName);
cardView = (CardView) v.findViewById(R.id.cvStock);
public void setCallbacks(Callbacks callbacks)
this.mCallbacks = callbacks;
这里是片段 A:
public class AFrag extends Fragment implements adapterStock.Callbacks
private String strStockName;
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
View view = inflater.inflate(R.layout.frag_A, container, false);
tbxStock = (TextView) view.findViewById(R.id.tbxR);
return view;
@Override
public void onItemClicked(String StockName)
Toast.makeText(getActivity(), "Stock terpilih " + StockName, Toast.LENGTH_LONG).show();
tbxStock.setText(strStockName);
欢迎提出建议。谢谢。
【问题讨论】:
在您的主要活动中公开该数据。那么您可以在两个片段中访问该数据 【参考方案1】:在您的片段 A 中包含 setCallbacks(this) 一旦创建了 adapterStock 实例。
【讨论】:
对不起,你能告诉我更多关于那个代码的信息吗(如何在代码中实现)? 在你创建你的适配器类adapterstock的对象后,执行adapterstock.setCallbacks(this)。 参考developer.android.com/training/basics/fragments/communicating【参考方案2】:setCallbacks(this) 在你的片段中
【讨论】:
【参考方案3】:改变这个
public adapterStock(Context context, String[] DataSet)
stockNameDataSet = DataSet;
mContext = context;
到这里
public adapterStock(Context context, String[] DataSet, Callbacks mCallbacks)
stockNameDataSet = DataSet;
mContext = context;
this.mCallbacks=mCallbacks;
在片段的adapterStock
实例中,将mCallbacks
传递为this
(即new adapterStock(context, dataset,this)
)
注意:另外两个答案也正确
【讨论】:
以上是关于需要解释从适配器发送数据到片段的主要内容,如果未能解决你的问题,请参考以下文章