13

我有Fragment一个ListView。在适配器中我想创建一个对话框。

class ViewHolder {
...
  @Override
  public void onClick(View v) {
    ...
    AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
    ...
   }
...
}

mContextContext来自 my的Fragment,我在创建适配器时保存全局。我得到了错误。

unable to add window -- token null is not for an application

该方法getActivity()不可用,那么如何获取Context我的Activity

4

4 回答 4

27

如果您有自定义适配器,请将构造函数更改为 requireContext作为参数。

public CustomAdapter(Context context, List<Item> items) {   
}

然后,通过构造函数创建一个实例变量来存储上下文。

private Context mContext; //instance variable

public CustomAdapter(Context context, List<Item> items) {
    //some code
    this.mContext= context;
}

现在您可以在适配器中的任何位置使用该变量mContext

要创建适配器,只需传递“this”(如果是从活动创建的,或者getActivity()是从片段创建的)。

mAdapter = new CustomAdapter(this, mArrayItems);

希望有帮助。

于 2013-06-03T13:34:56.013 回答
17

当您创建适配器时,您将传递什么作为上下文?this如果您不这样做,请尝试通过。更多的代码也会有所帮助。

于 2013-06-03T13:30:17.730 回答
0

在我的适配器列表视图上

public View getView(final int position, View convertView, ViewGroup parent) {
    final ViewHolder holder;
    if (convertView == null) {
        convertView = layoutInflater.inflate(R.layout.custom_list_view, null);
        holder = new ViewHolder();
        holder.lsNama = convertView.findViewById(R.id.lsNama);
        holder.lsUid = convertView.findViewById(R.id.idPartner);
        convertView.setTag(holder);

    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    holder.lsUid.setText(listData.get(position).getUid());
    holder.lsNama.setText(listData.get(position).getNama());

    holder.lsNama.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            String uid = listData.get(position).getUid().toString();
            String nama =  listData.get(position).getUid().toString();
            Intent intent = new Intent(view.getContext(), MapsActivity.class);
            Bundle bundle = new Bundle();
            bundle.putString("bUid",uid);
            intent.putExtras(bundle);
            view.getContext().startActivity(intent);
        }
    });

    return convertView;
}
于 2018-04-30T23:30:04.073 回答
0
class ViewHolder {
...
  @Override
  public void onClick(View v) {
    ...
    AlertDialog.Builder builder = new AlertDialog.Builder(v.getContext());
    ...
   }
...
}
于 2018-04-10T16:01:58.900 回答