2015-11-06 76 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