2015-11-06 26 views
8

Używam RecyclerView do wypisania jakiegoś tekstu, a teraz chcę, aby po kliknięciu przez użytkownika pojawiło się własne okienko alertu.Niestandardowe okno dialogowe z RecyclerView

Próbowałem tego do tej pory, ale otrzymałem wyjątek NullPointerException; co tu może być nie tak?

+0

Sprawdź jeśli identyfikator użytkownika 'custom_dialog',', 'image' text' i' dialogButtonOK' są poprawnie napisane –

+0

Tak, to pokazuje nullpointer i wskazuje na to jako problem: final Dialog dialog = new Dialog (context); –

+0

gdzie jest twoja inicjalizacja kontekstu.? – Emil

Odpowiedz

4

Nevermind zapomniałem inicjalizacji mój kontekstowe

context = itemView.getContext();

3

To nie jest odpowiedź na zapytanie, ale lepszy sposób na obsłużenie tego scenariusza.

Użyj metod wywołania zwrotnego.

W swojej działalności:

To będzie implementować interfejs, które mamy w naszej Adapter. W tym przykładzie zostanie wywołany, gdy użytkownik kliknie element w polu RecyclerView.

public class MyActivity extends Activity implements AdapterCallback { 

    private MyAdapter mMyAdapter; 

    @Override 
    public void onMethodCallback() { 
     // Show your alert 
    } 

    @Override 
    protected void onCreate(final Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     this.mMyAdapter = new MyAdapter(this); 
    } 
} 

W adaptera:

w działalności, rozpoczęliśmy naszą Adapter i podał to jako argument do konstruktora. To zainicjuje nasz interfejs dla naszej metody wywołania zwrotnego. Widzimy, że używamy naszej metody wywołania zwrotnego dla kliknięć użytkowników.

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

    private AdapterCallback mAdapterCallback; 

    public MyAdapter(Context context) { 
     try { 
      this.mAdapterCallback = ((AdapterCallback) context); 
     } catch (ClassCastException e) { 
      throw new ClassCastException("Activity must implement AdapterCallback."); 
     } 
    } 

    @Override 
    public void onBindViewHolder(final MyAdapter.ViewHolder viewHolder, final int i) { 
     // simple example, call interface here 
     // not complete 
     viewHolder.itemView.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       try { 
        mAdapterCallback.onMethodCallback(); 
       } catch (ClassCastException exception) { 
        // do something 
       } 
      } 
     }); 
    } 

    public static interface AdapterCallback { 
     void onMethodCallback(); 
    } 
} 

uprzejmości:Call Activity method from adapter

2
final Dialog dialog = new Dialog(your_activity_context); 
0

Używasz context który zerowy więc przekazać context w ViewHolder konstruktora i CBAdapter konstruktor także jak poniżej:

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

List<AdapterData> mItems; 
Context context; 

public CBAdapter(Context context) { 
    super(); 
    this.context = context; 
    ..... 
    } 

I ViewHolder klasy

class ViewHolder extends RecyclerView.ViewHolder{ 

    public TextView textOne; 
    private Context mcontext; 


    public ViewHolder(View itemView, Context mcontext) { 
     super(itemView); 
     this.mcontext = mcontext; 
     .... 
    } 
-2

napisać ten kod:

final Dialog dialog = new Dialog(CBAdapter.this); 

zamiast

final Dialog dialog = new Dialog(context); 

(lub)

context = CBAdapter.this; // Initialize context 

Mam nadzieję, że to pomaga.

Szczęśliwy Coding :)

+0

nie zapewnia to odpowiedzi na pytanie, a klasa adaptera nie może mieć kontekstu dostępnego oprócz działania –

0

Nie jest bezpośrednio związane z pytaniem, chociaż błagam: NIE ustawiaj wewnątrz adapteraClickListener-s!

ten sposób powinno się to odbywać:

private class ItemDataHolder extends RecyclerView.ViewHolder implements View.OnLongClickListener{ 

    private final String TAG = ItemDataHolder.class.getSimpleName(); 

    /** 
    * Define view's elements 
    */ 

    /** 
    * Define object instance 
    */ 
    private Item mData; 

    // Constructor 
    public MessageDataHolder(View itemView) { 
     super(itemView); 
     /** 
     * Init elements 
     */ 
     itemView.setOnLongClickListener(this); 
    } 

    /** 
    * Method to handle long click on the item 
    * @param v View to handle click on 
    * @return 
    */ 
    @Override 
    public boolean onLongClick(View v) { 
     Log.v(TAG, "Long click fired!"); 
     return false; 
    } 

    /** 
    * Function to update view's elements 
    * @param message Good data to be updated to 
    */ 
    public void bindData(Item message) { 
     mData = message; 
     /** 
     * Set values of views here 
     **/ 
    } 
} 

nadzieję, że moja odpowiedź pomoże ktoś napisać lepszy kod :)

+0

. Jeśli tak konkretnie nie chcesz ustawiać opcji onClickListeners w adapterze, czy mógłbybyś powiedzieć nam, dlaczego tak jest, abyśmy mogli wszyscy uczą się na podstawie swojej wiedzy? Ponadto, jak mielibyśmy dwa przyciski, które robią różne rzeczy? – Timmiej93