需要说明从适配器向片段发送数据

xdc*_*omx 5 android adapter fragment

我想将数据从适配器发送到已经打开的片段。在主要活动中,已经打开了两个片段,片段A和片段B。在片段A中,我放置了RecyclerView和CardView。单击其中一个卡视图时,我想将其数据发送到片段B。并且在调用mCallbacks时得到一个NPE。

if (mCallbacks != null){
     mCallbacks.onItemClicked(strStockName);}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我使用了一个接口。但是我需要更多的解释。

这是我的适配器的代码:

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;
   }
}
Run Code Online (Sandbox Code Playgroud)

这是片段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);
}
}
Run Code Online (Sandbox Code Playgroud)

建议表示赞赏。谢谢。

小智 1

在片段中包含 setCallbacks(this) 一旦创建了adapterStock实例。