webentwicklung-frage-antwort-db.com.de

Aktivitätskontext in einem Adapter von einem Fragment abrufen

Ich habe eine Fragment mit einer ListView. Im Adapter möchte ich einen Dialog anlegen.

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

mContext ist das Context von meinem Fragment, das ich beim Erstellen des Adapters global speichere . Ich erhalte den Fehler.

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

Die Methode getActivity() ist nicht verfügbar. Wie kann ich das Context meines Activity abrufen?

11

Wenn Sie Ihren Adapter erstellen, was übergeben Sie als Kontext? Versuchen Sie, this zu übergeben, wenn Sie es nicht tun. Ein bisschen mehr Code wäre auch hilfreich.

15
Michał Z.

Wenn Sie über einen benutzerdefinierten Adapter verfügen, ändern Sie den Konstruktor so, dass Context als Parameter erforderlich ist. 

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

Erstellen Sie dann eine Instanzvariable, um den Kontext über den Konstruktor zu speichern. 

private Context mContext; //instance variable

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

Jetzt können Sie die Variable mContext von überall in Ihrem Adapter verwenden. 

Um den Adapter zu erstellen, übergeben Sie einfach 'this', wenn Sie aus einer Aktivität erstellt werden, oder getActivity(), wenn Sie aus einem Fragment erstellt werden. 

mAdapter = new CustomAdapter(this, mArrayItems);

Hoffentlich hilft das. 

26
daniel_c05

Auf meiner Adapterliste

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