2016-08-10 2 views
1

Ich brauchte Hilfe mit einem meiner neuen Android-Projekte. Lass mich nur kurz die Struktur erklären.Greifen Sie auf getContentResolver() in einem BaseAdapter zu

Mein Projekt hat eine MainActivity und innerhalb der Aktivität habe ich 3 Fragmente, die über die Tabs auf der App zugänglich sind. Auf meinem allerletzten Tab/Fragment versuche ich alle Kontakte auf dem Telefon zusammen mit einem Bild, Namen und Nummer aufzulisten. Ich kam in dem folgenden Code für den Namen und die Nummer:

Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null); 
     while (phones.moveToNext()) { 
      String name = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); 
      String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); 
      //Toast.makeText(getApplicationContext(),name, Toast.LENGTH_LONG).show(); 

      String full = name + " " + phoneNumber; 


     } 

Der folgende Code wie ein Zauber funktioniert, wenn ich es in meinem Fragment und Namensänderung bestimmter Verweise wie getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null); zu getActivity().getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);

ohnehin platzieren, so Ich konnte das zur Arbeit bringen, aber fiel auf Probleme wie das Auflisten der Kontakte mit Bildern auf der linken Seite, so stieß ich auf ein YouTube-Tutorial Android BaseAdapter Tutorial. Nach vielen Facepalm-Momenten und dem Versuch, herauszufinden, was in der Welt vor sich geht (ich bin neu in der Android-Entwicklung), habe ich endlich die ersten beiden Tutorials durchgestanden und bin auf ein kleines Problem gestoßen.

Beim Versuch, Zugriff auf die Kontakte (mit dem ersten Block des Codes in dieser Frage) zu erstellen, entdeckte ich, dass ich nicht tun kann, da die Funktion getContentResolver() nicht zugänglich ist, es sei denn, es ist innerhalb einer Aktivität. Hier ist mein aktueller Code für meinen BaseAdapter: Android BaseAdapter Test Code - Paste Bin.

Es würde mir so sehr helfen, wenn mich jemand auf die beste Weise ansprechen könnte.

Nebenbei, gibt es eine bessere Möglichkeit, auf Kontakte zuzugreifen und sie einfach mit Bild, Name und Nummer aufzulisten? Eine Bibliothek vielleicht? Alles super einfache Arbeiten; WhatsApp wie Kontaktliste sogar oder Viber? Vielen Dank!

+0

Fügen Sie dem Konstruktor des Adapters ein Kontextargument hinzu und speichern Sie es in der Instanz. Solange Ihr Adapter nicht statisch gespeichert ist oder den Kontext in einer statischen Variable speichert, ist dies der einfachste Weg. Noch besser, die Kontakte außerhalb des Adapters bekommen und dann die Liste einfach dem Adapter zuweisen. – GPuschka

Antwort

1

Um getContentResolver() zu rufen, benötigen Sie ein Context Objekt Ihrer Aktivität, Sie müssen Möglichkeiten, dies zu tun, wenn Sie die BaseAdapter Klasse verwenden.

1. Pass es über Konstruktor -
In Ihrem Adapter:

public class MyBaseAdapter extends BaseAdapter { 
    private Context context; 

    public MyBaseAdapter (Context context) { 
     this.context = context; 
    } 

    // Do your stuff 
} 

In Ihrer Aktivität:

MyBaseAdapter myBaseAdapter = new MyBaseAdapter(getApplicationContext()); 

2. den Kontext aus dem

view- Get
public class MyBaseAdapter extends BaseAdapter { 

     //BaseAdpter stuff 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      if(inflater == null){ 
      Context context = parent.getContext(); 
      } 
      //BaseAdpter stuff 
      return convertView; 
     } 

} 

Dann rufen Sie einfach context.getContentResolver().

+0

Schöne Lösung hat wirklich gut funktioniert! – user282190

Verwandte Themen