2012-11-11 14 views
5

Desidero aggiornare una singola riga nella mia listview con contenuti diversi dopo aver premuto un pulsante. So che posso usare notifydatasetchanged() ma questo aggiornerebbe l'intero listView.ListView Aggiornamento di una singola riga

Ho letto questo answer e si adatta perfettamente per quello che voglio fare.

Ho fatto un listview con 5 righe e quando premo il pulsante voglio aggiornare la 4a riga con un testo diverso. Non voglio impostare il testo in modo programmatico poiché questo è solo un progetto fittizio solo per vedere se è possibile aggiornare una singola riga e il mio vero progetto è molto più complesso di un semplice textview.

Quindi la mia domanda è: posso usare getView() per aggiornare una singola riga in un listview?

Ecco il mio codice:

mia attività:

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

      } 
     }); 

    } 

} 

mio adattatore:

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; 
    } 

} 

Questo è ciò che l'attività si presenta come:

Activity snapshot

Ma quando si preme il pulsante del mio nulla cambia

risposta

3

È non può chiamata GetView() il metodo della scheda da soli. Metodo GetView() dell'adattatore viene viene chiamato solo quando

  • ListView è creare
  • quando viene chiamata l'utente scorre la visualizzazione elenco
  • quando notifysetdatachanged().
    Tutti questi sono fatti dal sistema operativo. GetView() viene chiamato per tutte le righe nella listview. Non è richiesto solo una singola riga.Quindi, se vuoi cambiare le righe, devi fornire nuovamente i dati in un String[], ArrayList<> ecc.
    Se vuoi che venga visualizzato un testo diverso per una singola riga, onClick() di un pulsante, puoi farlo

    public class listAdapter estende 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; 
    } 
    

    }
    E nella vostra attività:

    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); 
    
        } 
    }); 
    


    C'è un altro modo di farlo anche come @Andy suggerito in uno dei commenti:

    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); 
         } 
        } 
    }); 
    

Ci scusiamo per il testo in grassetto. Per qualche motivo il CTRL + K non funziona per il codice precedente.

+0

Ottima risposta. Sono d'accordo con te. Un'altra cosa che potrebbe fare è semplicemente impostare su ItemClickListener su ListView stesso, e se la posizione è qualsiasi (supponendo che non si usi un pulsante), si aggiorna semplicemente l'elenco nell'adattatore. Ovviamente alla fine ha bisogno di capire quale opzione è meglio per lui. – Andy

+0

@Andy: hai ragione. In realtà sarebbe un'idea migliore. Ma dal momento che, in particolare, ha chiesto di modificare il contenuto della riga al clic di un pulsante, ci sono andato. – Ashwin

+0

:) Oh no, tecnicamente hai ragione @Ashwin solo perché è più efficiente. Non c'è lavoro inutile. Dal momento che vuole solo aggiornare una singola riga. Ma lui menziona che questo è solo un test, quindi immagino che dovrebbe anche avere un altro metodo nel caso in cui vuole essere aggiornato di più. – Andy

Problemi correlati