从片段中获取适配器中的活动上下文

时间:2013-06-03 13:26:04

标签: android android-listview android-fragments android-activity

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

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

mContext是我Context的{​​{1}},我在创建适配器时保存全局。 我收到了错误。

Fragment

方法unable to add window -- token null is not for an application不可用,以便如何获取getActivity()的{​​{1}}?

4 个答案:

答案 0 :(得分:26)

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

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

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

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

希望有所帮助。

答案 1 :(得分:15)

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

答案 2 :(得分:0)

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

答案 3 :(得分: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;
}