2017-09-05 3 views
0

Also wollte ich Elemente aus meiner Listview anpassen und ich habe einen benutzerdefinierten Adapter.Elemente zeigt nicht mit benutzerdefinierten Adapter für ListView

public class elementList extends BaseAdapter { 

Context context; 
String[] data; 
private static LayoutInflater inflater = null; 

public elementList(Context context, String[] data) { 
    this.context = context; 
    this.data = data; 
    inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
} 

@Override 
public int getCount() { 
    return data.length; 
} 

@Override 
public Object getItem(int position) { 
    return data[position]; 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View vi = convertView; 
    if(vi == null) 
     vi = inflater.inflate(R.layout.task, null); 
    TextView text = (TextView)vi.findViewById(R.id.title); 
    Log.d("TAG", "DA"); 
    text.setText(data[position]); 
    return vi; 
} 
} 

Hier ist meine Haupttätigkeit

private void showTasks(){ 
    final ArrayList<String> taskList = new ArrayList<String>(); 

    ListView listView = (ListView)findViewById(R.id.listView); 

    final List<String> tasks = new ArrayList<String>(taskList); 
    final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, tasks); 
    final elementList element = new elementList(this, tasks.toArray(new String[0])); 
    listView.setAdapter(element); 

    FirebaseAuth mAuth = FirebaseAuth.getInstance(); 
    FirebaseUser user = mAuth.getCurrentUser(); 
    FirebaseDatabase database = FirebaseDatabase.getInstance(); 
    DatabaseReference adress = database.getReference("users/" + user.getUid() + "/tasksList"); 
    adress.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      try{ 
       if(dataSnapshot.getValue() != null){ 
        Map<String, String> value = (Map<String, String>)dataSnapshot.getValue(); 
        for (Map.Entry<String, String> entry : value.entrySet()){ 
         tasks.add(entry.getValue()); 
         Log.d("VALOARE", entry.getValue()); 
         element.notifyDataSetChanged(); 
        } 
       } 
      } 
      catch (Exception e){ 
       e.printStackTrace(); 
      } 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }); 

} 

Ich verstehe nicht, warum es nicht meine Liste nicht angezeigt, wenn ich meinen Adapter verwende (Element), aber es funktioniert gut, wenn ich Arrayadapter.

using arrayadapter using element

Im ersten Bild, das ich arrayadapter und in dem zweiten Elemente verwenden. Ich möchte erwähnen, dass es nicht abstürzt oder irgendeinen Fehler gibt.

+0

Ich finde das 'statische' Layout inflator verdächtig. Überprüfen Sie auch https://possiblemobile.com/2013/05/layout-inflation-as-intended/, wie Sie die Elternansicht an die Methode "inflate" übergeben können. – frozenkoi

+0

Das Array, das den 'ElementList'' Adapter unterstützt, wird nie geändert/aktualisiert. Sie erstellen einmal eine Array-Kopie der 'tasks'' List', wenn sie leer ist, aber ändern Sie das Array danach nie. Das Aktualisieren dieser 'Liste' wird nichts mit diesem Array tun. Warum nehmen Sie Ihren benutzerdefinierten 'Adapter' nicht stattdessen zu einer' Liste', damit Sie ihn genauso aktualisieren können wie den 'ArrayAdapter'? –

+0

Teilen Sie Ihr task.xml-Layout –

Antwort

0

Der Grund dafür ist, dass der Anruf an den ValueEventListener Rückruf tasks ändert, aber die element Adapter sind nicht tasks als Datenquelle verwendet wird. Es verwendet ein Array, das davon kopiert wird, das durch Aufrufen .toArray()

0

erhalten wird, statt die List-Werte als ein Array zu übergeben. Übergeben Sie die Arraylist-Aufgabe an den benutzerdefinierten Adapter, den Sie in der showTasks() -Methode ändern.

verwenden

final elementList element = new elementList(this, tasks); 

statt

final elementList element = new elementList(this, tasks.toArray(new String[0])); 

Und Ihre benutzerdefinierten Adapter contructor ändern Sie den Wert von Arraylist statt String-Array zu nehmen.

Verwandte Themen