2016-07-12 2 views
2

Я видел несколько связанных вопросов об этой ситуации, но не смог найти решение, поэтому моя проблема будет такой.Как вызвать DialogFragment из RecyclerView.ViewHolder (с интерфейсом реализации)

У меня есть tabLayout, в котором хранятся 4 фрагмента, Im, передающие данные пользователю в фрагменте номер 3 (каталог), этот фрагмент удерживает recyclerView для cardView im, пытающегося реализовать onclicklistner для карты, которая вызовет dialogFragment, я понимаю наиболее эффективный способ сделать это, использует интерфейс для viewHolder, я сталкиваюсь с одной проблемой: recyclerView конструктор адаптера.

Вот каталог осколочная:

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 Params, с customadapter.

класс customAdapter:

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) 

С чем я должен инсталлировать прослушиватель CustomAdapter.OnItemClickListener в каталоге? Любые советы будут одобрены, спасибо!

ответ

1

что я должен инсталлировать CustomAdapter.OnItemClickListener прослушиватель в каталоге?

Поскольку забудьте инициализировать listener объект перед передачей его в CustomAdapter конструктор класса.сделайте это как:

listener=this; 
adapter = new CustomAdapter(listener, productsList, getActivity()); 
... 
+1

Работая, спасибо, сэр! – 2Stoned

+0

Создание объекта-слушателя совершенно не имеет значения в этой точке. Вы должны просто передать 'this' в конструкторе .. – vguzzi

+0

@vguzzi: Хорошее предложение, мой ответ в соответствии с проблемой, которую OP отправляет с вопросом 'onItemClicked (android.view.View) 'на ссылку нулевого объекта', потому что' слушатель есть null'. и ваш ответ тоже прав. Спасибо –

0

Надеется, что это помогает

Просто измените это в CatalogFragment

adapter = new CustomAdapter(listener, productsList, getActivity()); 

Для

adapter = new CustomAdapter(this, productsList, getActivity()); 

Вы получаете NPE, потому что вы передаете пустую ссылку вашего слушателя

+0

i can not customAdpater запрашивает OnItemClickListener. – 2Stoned

0

Вы проходите в пустом слушателе, а не в том, что вы внедрили в себе r Fragment экземпляр.

Изменить эту линию;

adapter = new CustomAdapter(listener, productsList, getActivity()); 

к этому;

adapter = new CustomAdapter(this, productsList, getActivity()); 

и удалите переменную слушателя.