it-roy-ru.com

Получить контекст активности в адаптере из фрагмента

У меня есть Fragment с ListView. В адаптере я хочу создать диалог.

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

mContext - это Context из моего Fragment, который я сохраняю глобально при создании адаптера . Я получаю ошибку.

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

Метод getActivity() недоступен, так как получить Context моего Activity?

11
AdrianoCelentano

Когда вы создаете свой адаптер, что вы передаете в качестве контекста? Попробуйте передать this, если вы этого не делаете. Еще немного кода будет полезно.

15
Michał Z.

Если у вас есть пользовательский адаптер, измените конструктор, чтобы он требовал 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);

Надеюсь, это поможет. 

26
daniel_c05

В моем списке адаптеров

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;
}
0
Bachtiar Panjaitan
class ViewHolder {
...
  @Override
  public void onClick(View v) {
    ...
    AlertDialog.Builder builder = new AlertDialog.Builder(v.getContext());
    ...
   }
...
}
0
izak