android - 如何从 RecyclerView.ViewHolder 调用 DialogFragment(带接口(interface)实现)

标签 android android-fragments android-recyclerview

我看到很少有关于这种情况的相关问题,但找不到任何解决方案,所以我的问题是这样的。

我有包含 4 个 fragment 的 tabLayout,我在 fragment 编号 3(目录)中向用户传送数据,这个 fragment 为 cardView 保存 recyclerView 我正在尝试为将调用 dialogFragment 的卡片实现 onclicklistner,我了解最有效的方法因此,在为 viewHolder 使用接口(interface)时,我遇到了 recyclerView 适配器构造函数 的一个问题。

这是目录 fragment :

public class CatalogFragment extends Fragment implements CustomAdapter.OnItemClickListener {

private FloatingActionButton mSharedFab;
private List<MyProducts> productsList;

//Creating Views
private RecyclerView recyclerView;
private RecyclerView.LayoutManager layoutManager;
private RecyclerView.Adapter adapter;

private CustomAdapter.OnItemClickListener listener;//////LISTNER FOR DIALOG???

//Volley Request 
private RequestQueue requestQueue;

//request counter 
private int requestCount = 1;
private static final String URL_INDEX = "http://myserverip/product.php";
//Tag values to read from json
public static final String TAG_IMAGE_URL = "product_img";
public static final String TAG_PRODUCT_SN = "product_serial_num";
public static final String TAG_PRODUCT_TITLE = "product_title";
public static final String TAG_PRODUCT_PRICE = "product_price";
public static final String TAG_PRODUCT_DESCRIPTION = "product_description";

public CatalogFragment() {
    // Required empty public constructor
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_catalog, container, false);
    recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
    layoutManager = new LinearLayoutManager(getActivity().getApplicationContext(), LinearLayoutManager.VERTICAL, false);
    recyclerView.setLayoutManager(layoutManager);
    //recyclerView.setHasFixedSize(true);
    RecyclerView.ItemAnimator itemAnimator = new DefaultItemAnimator();
    itemAnimator.setAddDuration(1000);
    itemAnimator.setRemoveDuration(1000);
    recyclerView.setItemAnimator(itemAnimator);

    //Initializing our product list
    productsList = new ArrayList<>();
    requestQueue = Volley.newRequestQueue(getActivity().getApplicationContext());

    // fetch data
    getData();



    //initialize adapter

    adapter = new CustomAdapter(listener, productsList, getActivity());
    //Adding adapter to recyclerview
    recyclerView.setAdapter(adapter);
    return view ;
}
 @Override
public void onItemClicked(View v) {
    DialogAddToCartFragment df= new DialogAddToCartFragment();
    df.show(getFragmentManager(), "Dialog");
}

使用 3 个参数和自定义适配器实例化的适配器。

自定义适配器类:

public class CustomAdapter extends RecyclerView.Adapter<CustomAdapter.ViewHolder> {

public interface OnItemClickListener {
    void onItemClicked(View v);
}

private OnItemClickListener listener;
//Image loader inst for image
private ImageLoader imageLoader;

private Context context;
public Snackbar snackbar;
String title;
//List  all products
List<MyProducts> myProducts;

public CustomAdapter( OnItemClickListener listener, List<MyProducts> myProducts, Context context)
{
    super();
    this.listener = listener;
    this.myProducts = myProducts;
    this.context = context;
}

@Override
public CustomAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.product_list, parent, false);
    ViewHolder viewHolder = new ViewHolder(v);
    return viewHolder;
}

@Override
public void onBindViewHolder(CustomAdapter.ViewHolder holder, int position) {

    if( myProducts != null) {
        MyProducts myProducts1 = myProducts.get(position);
        imageLoader = ImageVolley.getInstance(context).getImageLoader();
        imageLoader.get(myProducts1.getProductImage(), ImageLoader.getImageListener(holder.imageView, R.drawable.android_store_log, android.R.drawable.ic_dialog_alert));
        title = myProducts1.getProductTitle();
        //Showing data to the views
        holder.imageView.setImageUrl(myProducts1.getProductImage(), imageLoader);
        holder.textViewProductTitle.setText(myProducts1.getProductTitle());
        holder.textViewProductDescription.setText(myProducts1.getProductDescription());
        holder.textViewProductSerialNumber.setText(myProducts1.getProductSn());
        holder.textViewProductPrice.setText(myProducts1.getProductPrice());
    }
}

@Override
public int getItemCount() {
    return myProducts.size();
}
public class ViewHolder extends RecyclerView.ViewHolder {
    //Views
    public NetworkImageView imageView;
    public TextView textViewProductTitle;
    public TextView textViewProductDescription;
    public TextView textViewProductSerialNumber;
    public TextView textViewProductPrice;

    //Initializing Views
    public ViewHolder(final View itemView) {
        super(itemView);
        imageView = (NetworkImageView) itemView.findViewById(R.id.imageViewProduct);
        textViewProductTitle = (TextView) itemView.findViewById(R.id.textViewProductTitle);
        textViewProductDescription = (TextView) itemView.findViewById(R.id.textViewProductDescription);
        textViewProductSerialNumber = (TextView) itemView.findViewById(R.id.textViewProductSerialNumber);
        textViewProductPrice = (TextView) itemView.findViewById(R.id.textViewProductPrice);

        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                listener.onItemClicked(v);/////////DIALOG LISTENER????
            }
        });
    }
}

DialogFragment:

public class DialogAddToCartFragment extends DialogFragment {



@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    View view = getActivity().getLayoutInflater().inflate(R.layout.fragment_dialog_add_to_cart, new LinearLayout(getActivity()), false);

    // Retrieve layout elements
    //TextView title = (TextView) view.findViewById(R.id.text_title);

    // Set values
    //title.setText("Not perfect yet");

    // Build dialog
    Dialog builder = new Dialog(getActivity());
    builder.requestWindowFeature(Window.FEATURE_NO_TITLE);
    builder.getWindow().setBackgroundDrawable(new ColorDrawable(Color.GREEN));
    builder.setContentView(view);
    return builder;

}

当我点击卡片时,我关闭了程序:(

这是日志:

07-12 08:42:22.685 2808-2808/com.example.get2i.androidstore E/AndroidRuntime: FATAL EXCEPTION: main
                                                                          Process: com.example.get2i.androidstore, PID: 2808
                                                                          java.lang.NullPointerException: Attempt to invoke interface method 'void com.example.get2i.androidstore.CustomAdapter$OnItemClickListener.onItemClicked(android.view.View)' on a null object reference
                                                                              at com.example.get2i.androidstore.CustomAdapter$ViewHolder$1.onClick(CustomAdapter.java:102)
                                                                              at android.view.View.performClick(View.java:5198)
                                                                              at android.view.View$PerformClick.run(View.java:21147)
                                                                              at android.os.Handler.handleCallback(Handler.java:739)
                                                                              at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                              at android.os.Looper.loop(Looper.java:148)
                                                                              at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                                              at java.lang.reflect.Method.invoke(Native Method)
                                                                              at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                              at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

我应该用什么来实例化 catalogfrag 中的 CustomAdapter.OnItemClickListener 监听器?如有任何建议,我们将不胜感激,谢谢!

最佳答案

在 Activity 本身中实例化 fragmentManager,

MyActivity.java

 `FragmentManager fragmentManager = getFragmentManager();
 adapter = new CustomAdapter(productsList, fragmentManager);`

自定义适配器.java

 `CustomAdapter implements MyClickListner{
 CustomAdapter(Arraylist<MyProduct>productsList, FragmentManager 
 fragmentManager) {
      this.productList = productsList;
      this.fragmentManager = fragmentManager;
 }

 `@override
  clickFunction(){
     Fragment myFragment= new MyFilterFragment();
     ((MyFilterFragment) myFragment).show(this.fragmentManager,"tag");
  }`

MyClickListener.java

`public interface MyClickListener(){
   public clickFunction();
}`

关于android - 如何从 RecyclerView.ViewHolder 调用 DialogFragment(带接口(interface)实现),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38324856/

相关文章:

android - 如何实现具有不同行数项目的 RecyclerView?

java - Json数据输出不更新 fragment View

android - setDrawerLockMode 在 android 中不起作用?

java - 根据列表项的位置替换 fragment

java - fragment 中的 RecyclerView - 没有连接适配器,跳过布局

android - 从 ViewPager Activity 访问 fragment 的方法

java.lang.ClassCastException : android. support.transition.Fade 无法转换为 android.transition.Transition?

android - 将 View 模型传递到 recyclerview 适配器会导致内存泄漏吗?

android - 无法在我的 Mac 上使用 dex2jar : permission denied

Android 动画师与动画资源目录