2012-11-11 6 views
5

Je souhaite mettre à jour une seule ligne dans ma liste avec du contenu différent une fois que j'appuie sur un bouton. Je sais que je peux utiliser notifydatasetchanged() mais cela mettrait à jour l'ensemble listView.ListView Mise à jour d'une seule ligne

J'ai lu ce answer et il correspond parfaitement à ce que je veux faire.

J'ai fait un listview avec 5 lignes et quand j'appuie sur le bouton je veux mettre à jour la 4ème ligne avec un texte différent. Je ne veux pas mettre le texte par programme car c'est juste un projet factice juste pour voir si rafraîchir une seule ligne est possible et mon vrai projet est beaucoup plus complexe qu'un simple textview.

Donc ma question est: puis-je utiliser getView() pour mettre à jour une seule ligne dans un listview?

Voici mon code:

mon activité:

public class MainActivity extends Activity { 

    public ListView list1; 
    public listAdapter adapter; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     list1 = (ListView) findViewById(R.id.my_list); 
     adapter = new listAdapter(this); 
     list1.setAdapter(adapter); 

     Button button1 = (Button) findViewById(R.id.my_button); 
     button1.setOnClickListener(new OnClickListener() { 

      public void onClick(View v) { 
       adapter.setText("Different text"); 
       View row2Update = list1.getChildAt(3); 
       list1.getAdapter().getView(3, row2Update, list1); 

      } 
     }); 

    } 

} 

Mon adaptateur:

public class listAdapter extends BaseAdapter{ 

    public Activity activity; 
    public String text="Normal Text"; 

    public listAdapter(Activity activity){ 

     this.activity = activity; 
    } 

    public void setText(String text){ 
     this.text = text; 
    } 

    public int getCount() { 
     return 5; 
    } 

    public Object getItem(int position) { 

     return null; 
    } 

    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = activity.getLayoutInflater(); 
     LinearLayout rowView = (LinearLayout) inflater.inflate(R.layout.row_layout, null); 
     TextView textView = (TextView) rowView.findViewById(R.id.row_text); 
     textView.setText(text); 
     return rowView; 
    } 

} 

C'est ce que l'activité ressemble à:

Activity snapshot

Mais quand je presse mon bouton rien ne change

Répondre

3

Vous ne pouvez pas appel du getView() méthode de l'adaptateur vous-même. La méthode de l'adaptateur getView() est appelée est que, lorsque

  • ListView est de créer
  • lorsque l'utilisateur fait défiler la vue liste
  • quand notifysetdatachanged() est appelée.
    Tout cela est fait par le système d'exploitation. GetView() est appelé pour toutes les lignes de la liste. Il n'est pas appelé pour une seule ligne.Donc, si vous voulez changer les lignes, vous devez fournir à nouveau les données dans un String[], ArrayList<> etc.
    Si vous voulez que le texte différent apparaisse pour une seule ligne, onClick() d'un bouton - vous pouvez le faire

    listAdapter public class étend BaseAdapter {

    public Activity activity; 
    public ArrayList<String> text; 
    
    public listAdapter(Activity activity){ 
    
        this.activity = activity; 
    } 
    
    public void setText(ArrayList<String> text){ 
        this.text = text; 
    } 
    
    public int getCount() { 
        return 5; 
    } 
    
    public Object getItem(int position) { 
    
        return null; 
    } 
    
    public long getItemId(int position) { 
        // TODO Auto-generated method stub 
        return 0; 
    } 
    
    public View getView(int position, View convertView, ViewGroup parent) { 
        LayoutInflater inflater = activity.getLayoutInflater(); 
        LinearLayout rowView = (LinearLayout) inflater.inflate(R.layout.row_layout, null); 
        TextView textView = (TextView) rowView.findViewById(R.id.row_text); 
        textView.setText(text[position]); 
        return rowView; 
    } 
    

    }
    Et dans votre activité:

    list1 = (ListView) findViewById(R.id.my_list); 
    adapter = new listAdapter(this); 
    String[] entries={"Normal Text","Normal Text","Normal Text","Normal text","Normal text"}; 
    ArrayList<String> text=Arrays.asList(entries); 
    adapter.setText(text); 
    list1.setAdapter(adapter); 
    
    Button button1 = (Button) findViewById(R.id.my_button); 
    button1.setOnClickListener(new OnClickListener() { 
    
        public void onClick(View v) { 
         text.set(3,"Different Text"); 
         adapter.setText(text); 
         list1.setAdapter(adapter); 
    
        } 
    }); 
    


    Il y a une autre façon de le faire aussi @Andy suggéré dans l'un des commentaires:

    listViewPeople.setOnItemClickListener(new ListView.OnItemClickListener() { 
         @Override 
        public void onItemClick(AdapterView<?> a, View v, int position, long l) { 
          //IF YOU WANT TO CHANGE THE CONTENT OF THE ROW CLICKED 
         if(position == someNumber) { 
           text.set(position,"different Text"); 
           list1.setAdapter(text); 
         } 
        } 
    }); 
    

Désolé pour le texte en gras. Pour une raison quelconque, le CTRL + K ne fonctionne pas pour le code ci-dessus.

+0

Bonne réponse. Je suis d'accord avec toi. Une autre chose qu'il pourrait faire est juste de définir onItClickListener à la ListView lui-même, et si la position est quelque chose (en supposant que vous n'utilisez pas un bouton), vous venez de mettre à jour la liste dans l'adaptateur. Bien sûr, il doit finalement trouver l'option qui lui convient le mieux. – Andy

+0

@Andy: Vous avez raison. En fait ce serait une meilleure idée. Mais depuis, il a demandé spécifiquement de changer le contenu de la ligne sur le clic d'un bouton, je suis allé pour cela. – Ashwin

+0

:) Oh non, techniquement, vous avez raison @Ashwin simplement parce que c'est plus efficace. Il n'y a pas de travail inutile à faire. Comme il veut seulement mettre à jour une seule ligne. Mais il mentionne que c'est seulement un test, donc je me dis qu'il devrait aussi avoir une autre méthode au cas où il voudrait plus d'être mis à jour. – Andy

Questions connexes