需要解释从适配器发送数据到片段

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)

注意:另外两个答案也正确

【讨论】:

以上是关于需要解释从适配器发送数据到片段的主要内容,如果未能解决你的问题,请参考以下文章

如何将可扩展列表视图的选定子视图数据从片段发送到父活动?

将活动回调发送到片段

Java Android - 将数据从活动发送到片段

如何将列表视图中的数据从一个片段发送到另一个片段

将数据从活动发送到片段android工作室[重复]

在Android中将数据从活动发送到片段