2017-09-28 4 views
1

J'essayais de créer un simple ListView dans une application Android et de changer la couleur de fond des vues.Confusion à propos de la récupération des vues de ListView

J'ai réussi en écrasant simplement la méthode getView() de la classe ArrayAdapter définie et en la modifiant à l'intérieur.

ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, 
     android.R.layout.simple_list_item_1, Categories) { 
    @Override 
    public View getView(int pos, View v, ViewGroup vg) { 
    View view = super.getView(pos, v, vg); 

    switch (pos) { 
     case 0: 
     view.setBackgroundColor(Color.RED); 
     break; 
     case 1: 
     view.setBackgroundColor(Color.BLUE); 
     break; 
     default: 
     break; 
    } 

    return view; 
    } 
}; 

Cependant, si je supprime le commutateur déclaration et l'utiliser en dehors de cette fonction en vue de retour, les couleurs ne mettent pas à jour. Je veux dire quelque chose comme ceci: (lv est mon ListView)

lv.setAdapter(arrayAdapter); 
for (int i=0; i<2; ++i) { 
    View V = (View) lv.getAdapter().getView(i, null, lv); 

    switch (i) { 
    case 0: 
     V.setBackgroundColor(Color.RED); 
     break; 
    case 1: 
     V.setBackgroundColor(Color.BLUE); 
     break; 
    default: 
     break; 
    } 
} 

Il ne renvoie une référence à la vue, alors pourquoi cela ne fonctionne pas de cette façon?

+0

Pouvez-vous poster le code pour ceci: 'supprimer l'instruction-switch et l'utiliser en dehors de cette fonction avec la vue retournée'? Je ne suis pas sûr de comprendre ce que vous avez fait là-bas. –

+0

J'ai édité mon post pour le rendre plus clair. – Philipp317

+0

Vous avez ce code dans 'onCreate'? Aussi, recevez-vous une exception dans le deuxième cas? –

Répondre

1

Chaque fois que vous changez quelque chose appel:

ArrayAdapter.notifyDataSetChanged(); 

Quoi qu'il en soit, ce n'est pas la façon britannique bien de le faire, mais je suppose que chaque solution est une solution _ (ツ) _/¯

+0

Malheureusement, cela ne l'a pas réparé – Philipp317

+0

Pourriez-vous me montrer ce que vous avez essayé? –

+0

Ceci est partiellement vrai. Si vous modifiez les données de 'l'adaptateur' vous devez appeler' notifyDataSetChanged' pour refléter ces changements sur votre écran. Cependant, si vous avez une référence à la vue, vous pouvez changer la façon dont elle est affichée sans l'appeler. –

0

Je vous suggère d'utiliser RecyclerView au lieu de ListView. Une fois j'ai créé une liste colorée. Ici, je ne fais que copier mes codes.

public class MyListAdapter extends RecyclerView.Adapter<MyListAdapter.ViewHolder>{ 
    private final ArrayList<String> dataSet; 

    class ViewHolder extends RecyclerView.ViewHolder { 
     final TextView mTextView; 
     final CardView cardView; 
     ViewHolder(View v) { 
      super(v); 
      mTextView = (TextView) v.findViewById(R.id.info_text); 
      cardView = (CardView) v.findViewById(R.id.item_container); 
     } 
    } 

    public MyListAdapter(ArrayList<String> myDataset) { 
     dataSet = myDataset; 
    } 

    @Override 
    public MyListAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_card, parent, false); 
     return new ViewHolder(view); 
    } 


    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
     holder.mTextView.setText(dataSet.get(position)); 
     switch (position%11){ 
      case 0: holder.cardView.setCardBackgroundColor(0xFFB71C1C); 
       break; 
      case 1: holder.cardView.setCardBackgroundColor(0xFF880E4F); 
       break; 
      case 2: holder.cardView.setCardBackgroundColor(0xFF4A148C); 
       break; 
      case 3: holder.cardView.setCardBackgroundColor(0xFF311B92); 
       break; 
      case 4: holder.cardView.setCardBackgroundColor(0xFF1A237E); 
       break; 
      case 5: holder.cardView.setCardBackgroundColor(0xFF01579B); 
       break; 
      case 6: holder.cardView.setCardBackgroundColor(0xFF004D40); 
       break; 
      case 7: holder.cardView.setCardBackgroundColor(0xFF1B5E20); 
       break; 
      case 8: holder.cardView.setCardBackgroundColor(0xFF33691E); 
       break; 
      case 9: holder.cardView.setCardBackgroundColor(0xFF827717); 
       break; 
      case 10: holder.cardView.setCardBackgroundColor(0xFFE65100); 
       break; 
      default: holder.cardView.setCardBackgroundColor(0xFFBF360C); 
     } 
    } 

    @Override 
    public int getItemCount() { 
     return dataSet.size(); 
    } 
} 
0

Vous devez utiliser l'interface: Définir une interface YourAdapter.class:

public interface OnColorEvent{ 
    void change(View v,int position) 
} 

Réglez l'auditeur dans YourAdapter.class:

private OnColorEvent e; 
public void setOnColorEvent(OnColorEvent e) 
{ 
this.e=e; 
} 

Dans votre méthode getView():

@Override 
     public View getView(int pos, View v, ViewGroup vg) { 
     View view = super.getView(pos, v, vg); 
    if(null!=e) 
    { 
    e.change(v,pos); 
    } 
    } 
In YourActivity.class: 
listview.setOnColorEvent(new OnColorEvent{ 
@Overide 
public void change(View v,int position) 
{ 
switch (position) { 
    case 0: 
     V.setBackgroundColor(Color.RED); 
     break; 
    case 1: 
     V.setBackgroundColor(Color.BLUE); 
     break; 
    default: 
     break; 
    } 
} 
});