2016-07-12 20 views
2

Ich sah einige verwandte Fragen über diese Art von Situation, aber konnte keine Lösung finden, so mein Problem geht so.So rufen Sie DialogFragment von RecyclerView.ViewHolder (mit Schnittstelle implementieren)

I tabLayout haben die vier Fragmente des halten, Im Daten an Benutzer in der Splitter Nummer 3 (Katalog), das frag halten recyclerView für cardView im Liefern versuchen, für die Karte implementieren onclicklistner die dialogFragment berufen wird, verstehe ich die effizienteste Weg, um tun Sie es, verwendet Schnittstelle für den ViewHolder, ich stelle ein Problem der RecyclerView Adapter Konstruktor.

Hier ist der der Katalog frag:

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"); 
} 

der Adapter mit 3 params instanziiert, mit customadapter.

die customAdapter Klasse:

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???? 
      } 
     }); 
    } 
} 

die 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; 

} 

}

Als i i Programm auf der Karte klicken, erhalten :(geschlossen

Hier ist das Protokoll:

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) 

Womit sollte ich den Listener CustomAdapter.OnItemClickListener im Katalogfragment einrichten? Jeder Rat würde geschätzt werden, danke!

Antwort

1

Wie sollte ich den Listener CustomAdapter.OnItemClickListener im Katalogfragment einrichten?

Da vergessen listener Objekt zu initialisieren, bevor es zu CustomAdapter Klasse Konstruktor übergeben.tun Sie es als:

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

Arbeiten, danke, mein Herr! – 2Stoned

+0

Das Erstellen eines Listener-Objekts ist zu diesem Zeitpunkt völlig irrelevant. Sie sollten einfach 'this 'im Konstruktor übergeben. – vguzzi

+0

@vguzzi: Guter Vorschlag, meine Antwort ist nach Problem, das OP mit Frage' onItemClicked (android.view.View)' auf eine Null-Objekt-Referenz 'da' Listener gebucht wird ist null'. und deine Antwort ist auch Richtig. Danke –

0

Hope it

Genau dies hilft in Ihrem CatalogFragment ändern

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

Um

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

Sie NPE bekommen, weil Sie null Bezug Ihrer Zuhörer sind vorbei

+0

ich kann nicht customAdpater fragt nach OnItemClickListener. – 2Stoned

0

Du gibst einen leeren Zuhörer, nicht den, den du in dir implementiert hast r Fragment Instanz.

Ändern Sie diese Zeile;

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

zu diesem;

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

und löschen Sie Ihre Listener-Variable.

Verwandte Themen