2015-11-06 71 views
8

我使用RecyclerView列出了一些文本,現在我想讓它在用戶點擊文本時彈出一個自定義警報對話框。使用RecyclerView的自定義警報對話框

我已經嘗試過目前爲止,但得到一個NullPointerException;這裏有什麼可能是錯誤的?

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

List<AdapterData> mItems; 

public CBAdapter() { 
    super(); 
    mItems = new ArrayList<>(); 
    AdapterData data = new AdapterData(); 
    data.setTextOne("Many Bows"); 
    mItems.add(data); 

    data = new AdapterData(); 
    data.setTextOne("Pardon"); 
    mItems.add(data); 

    data = new AdapterData(); 
    data.setTextOne("Fall To Knees & Beg"); 
    mItems.add(data); 

    data = new AdapterData(); 
    data.setTextOne("Backflips"); 
    mItems.add(data); 



} 

@Override 
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
    View v = LayoutInflater.from(viewGroup.getContext()) 
      .inflate(R.layout.test3, viewGroup, false); 
    return new ViewHolder(v); 
} 

@Override 
public void onBindViewHolder(ViewHolder viewHolder, int i) { 
    AdapterData data = mItems.get(i); 
    viewHolder.textOne.setText(data.getTextOne()); 

} 


@Override 
public int getItemCount() { 

    return mItems.size(); 
} 

class ViewHolder extends RecyclerView.ViewHolder{ 

    public TextView textOne; 
    private Context context; 





    public ViewHolder(View itemView) { 
     super(itemView); 
     textOne = (TextView)itemView.findViewById(R.id.textView1); 

     itemView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       final Dialog dialog = new Dialog(context); 
       dialog.setContentView(R.layout.custom_dialog); 
       dialog.setTitle("Title"); 

       TextView text = (TextView) dialog.findViewById(R.id.text); 
       text.setText("hello world"); 

       ImageView image = (ImageView) dialog.findViewById(R.id.image); 
       image.setImageResource(R.drawable.ic_launcher); 

       Button dialogButton = (Button) dialog.findViewById(R.id.dialogButtonOK); 

       dialogButton.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         dialog.dismiss(); 
        } 
       }); 

       dialog.show(); 
      } 
     }); 


    } 
} 
} 
+0

檢查ID的'custom_dialog','text','image'和' dialogBu​​ttonOK'寫入正確 –

+0

是的,它是顯示空指針,並指出這是問題:最終對話框對話框=新的對話框(上下文); –

+0

你的'context'初始化在哪裏? – Emil

回答

4

沒關係我忘了初始化我的上下文

上下文= itemView.getContext();

3

這不是您查詢的答案,而是更好的方法來處理這種情況。

使用回調方法。

在你的活動:

這將實現我們在我們的Adapter接口。在這個例子中,當用戶點擊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); 
    } 
} 

在適配器:

活動中,我們開始我們的Adapter並通過以此爲參數構造函數。這將啓動我們的回調方法的界面。你可以看到我們使用我們的回調方法進行用戶點擊。

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

禮貌:Call Activity method from adapter

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

您正在使用context這是所以通過在contextViewHolder構造和CBAdapter構造也喜歡如下:

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

List<AdapterData> mItems; 
Context context; 

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

而在ViewHolder類

class ViewHolder extends RecyclerView.ViewHolder{ 

    public TextView textOne; 
    private Context mcontext; 


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

寫這樣的代碼:

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

,而不是

final Dialog dialog = new Dialog(context); 

(或)

context = CBAdapter.this; // Initialize context 

希望這有助於。

編碼快樂:)

+0

這不會提供問題的答案,並且Adapter類除了活動 –

0

與問題沒有直接關係,雖然我求求你:不要在onListener中設置onClickListener-s!

這是怎麼了應該做的事:

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 
     **/ 
    } 
} 

希望我的回答可以幫助別人寫更好的代碼:)

+0

之外不能提供上下文如果您對在適配器內部設置onClickListeners非常具體,是否介意告訴我們爲什麼這樣,那麼我們可以都從你的知識中學習?另外,我們怎麼會有兩個按鈕做不同的事情? – Timmiej93