【问题标题】:How to make an dialog in android RecyclerView onClick adapter [duplicate]如何在android RecyclerView onClick适配器中制作对话框[重复]
【发布时间】:2018-08-02 04:21:43
【问题描述】:

我想在RecyclerView 中列出的项目的onClick 事件中打开一个对话框。

这是Activity 代码:

public class EventPage extends AppCompatActivity {
EventAdapter adapter;
private RecyclerView recyclerView;
ArrayList<String> ticketName=new ArrayList<String>();
ArrayList<String>ticketPrice=new ArrayList<String>();
ArrayList<String>ticketCode=new ArrayList<String>();

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

    setContentView(R.layout.eventfinished);

    recyclerView = (RecyclerView) findViewById(R.id.rvUserProfile);
    adapter = new EventAdapter(ticketName, ticketPrice,getApplicationContext(),recyclerView);
    recyclerView.setHasFixedSize(true);
    recyclerView.setAdapter(adapter);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    adapter.notifyDataSetChanged();

这是Adapter 代码:

public class EventAdapter extends RecyclerView.Adapter<info.androidhive.uplus.EventAdapter.MyViewHolder> {
private ArrayList<String> mDataset=new ArrayList<String>();
private ArrayList<String> mPrice=new ArrayList<String>();
Context ctx;
RecyclerView rec;
Uri uri;

public EventAdapter(ArrayList<String> mDataset,ArrayList<String> mPrice ,Context ctx,RecyclerView rec){
    this.mDataset   = mDataset;
    this.mPrice     = mPrice;
    this.ctx        = ctx;
    this.rec        =rec;
}

public static class MyViewHolder extends RecyclerView.ViewHolder{
    // public CardView mCardView;
    public TextView mTextView, mTicketPrice;
    public RelativeLayout relativeLayout;// mCardView;
    public MyViewHolder(View v, final Context context,final ArrayList<String>eventName, final ArrayList<String>eventPrice,final RecyclerView rcc){
        super(v);
        mTextView       = (TextView) v.findViewById(R.id.ticketName1);
        mTicketPrice    = (TextView) v.findViewById(R.id.ticketamount);
        v.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int p=rcc.indexOfChild(v);
                try
                {
                    final Dialog dialog = new Dialog(context);
                    dialog.setCancelable(true);
                    dialog.setContentView(R.layout.bookticket);
                    dialog.show();
                    Toast.makeText(context,"Clicked"+eventName.get(p),Toast.LENGTH_LONG).show();
                }
                catch (Exception ex)
                {
                    ex.printStackTrace();
                }
            }
        });
    }
}


@Override
public info.androidhive.uplus.EventAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType){
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.eventitem, parent, false);
    info.androidhive.uplus.EventAdapter.MyViewHolder vh = new info.androidhive.uplus.EventAdapter.MyViewHolder(v, this.ctx, this.mDataset, this.mPrice, this.rec);
    return vh;
}

@Override
public void onBindViewHolder(final info.androidhive.uplus.EventAdapter.MyViewHolder holder, final int position){
    holder.mTextView.setText(mDataset.get(position));
    holder.mTicketPrice.setText(currencyConverter(mPrice.get(position)));

}

这是我在单击列表中的元素时遇到的错误:

android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application

【问题讨论】:

  • 你是如何初始化你的 Recycler 视图适配器的?您可以添加该代码吗?我怀疑您传递的上下文可能为空。
  • 感谢@SripadRaj,请检查我是否添加了完整代码
  • 好的,现在你如何在你的活动中初始化你的适配器?你能添加那部分代码吗?
  • @SripadRaj 我刚刚添加了如何从我的活动中启动我的适配器的代码。

标签: java android android-recyclerview android-dialog


【解决方案1】:

您的上下文为空,请按照以下步骤在 java 类中引入上下文

 public static Context contextOfApplication;  // create variable

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

         contextOfApplication = getApplicationContext();
}

Oncreate之外的创建方法

public static Context getContextOfApplication(){
        return contextOfApplication;
    }

现在在您的适配器类中添加上下文

final Dialog dialog = new Dialog("youractivityname".getContextOfApplication());

(OR) @SachinVarma 建议

只需使用这个 v.getContext()

【讨论】:

  • 他们不能在 onCreateViewHolder 中使用 parent.getContext() 吗?
  • 对于活动,是的,getApplicationContext() 可以工作,但它在回收视图适配器中是如何工作的。
  • @LanceToth 是的,我们可以使用....
  • 谢谢@SachinVarma 它工作我只需要通过 v.getCONtext() 非常感谢你
  • @GowthamanM 用于简单的 A 类传递上下文,但确保在完成 A 类时将其删除,即完成后 context=null。此外,永远不要将上下文作为静态数据传递。它会导致内存泄漏,这是一回事,但静态有时会在手机内存不足的情况下变为 NULL。在前面提到的这种情况下,通过构造函数传递上下文。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-01
  • 2017-02-10
  • 1970-01-01
相关资源
最近更新 更多