2017-09-05 2 views
0

Donc, je voulais personnaliser les éléments de ma Listview et j'ai fait un adaptateur personnalisé.Les éléments n'apparaissent pas avec l'adaptateur personnalisé pour 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; 
} 
} 

Voici mon activité principale

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

     } 
    }); 

} 

Je ne comprends pas pourquoi il ne montre pas ma liste si je me sers de mon adaptateur (élément), mais il fonctionne très bien si je l'utilise arrayadapter.

using arrayadapter using element

Dans la première image que je me sers arrayadapter et dans le deuxième élément. Je veux mentionner que cela ne plante pas ou ne donne aucune erreur.

+0

Je trouve le gonfleur de disposition «statique» suspect. Consultez également https://possiblemobile.com/2013/05/layout-inflation-as-intended/ pour savoir comment passer la vue parent à la méthode 'inflate'. – frozenkoi

+0

Le tableau sauvegardant votre 'elementList'' Adapter' n'est jamais changé/mis à jour. Vous faites une copie de tableau de 'lists'' List' une fois quand il est vide, mais ne modifiez jamais le tableau après cela. Mettre à jour que 'List' ne va rien faire pour ce tableau. Pourquoi ne pas faire votre 'Adapter' personnalisé prendre une' List' à la place, de sorte que vous pouvez le mettre à jour de la même manière que vous êtes le 'ArrayAdapter'? –

+0

Partagez votre fichier task.xml –

Répondre

0

La raison est que l'appel à la fonction de rappel ValueEventListener modifie tasks, mais l'adaptateur element n'utilise pas tasks comme source de données. Il utilise un tableau copié à partir de celui-ci obtenu en appelant .toArray()

0

Au lieu de transmettre les valeurs de liste sous la forme d'un tableau. Passez la tâche Arraylist à l'adaptateur personnalisé que vous modifiez dans la méthode showTasks().

Utilisez cette

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

au lieu de

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

Et changer votre carte personnalisée contructor prendre la valeur de arraylist au lieu de tableau de chaînes.