2012-11-11 7 views
5

Я хочу обновить одну строку в своем списке с разным содержимым, как только я нажму кнопку. Я знаю, что могу использовать notifydatasetchanged(), но это обновит все listView.ListView Обновление одной строки

Я прочитал это answer, и он идеально подходит для того, что я хочу делать.

Я сделал список с 5 строками, и когда я нажимаю кнопку, я хочу обновить 4-ю строку другим текстом. Я не хочу, чтобы текст был запрограммирован, потому что это всего лишь фиктивный проект, чтобы увидеть, возможно ли обновление одной строки, и мой реальный проект намного сложнее, чем просто textview.

Так что мой вопрос: могу ли я использовать getView() для обновления одной строки в listview?

Вот мой код:

моя активность:

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

      } 
     }); 

    } 

} 

Мой адаптер:

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

} 

Это то, что деятельность выглядит следующим образом:

Activity snapshot

Но когда я нажимаю мой кнопку ничего не меняет

ответ

3

Вы не можете звонка GetView() метод адаптера самостоятельно. Метод адаптера, GetView() является только называется, когда

  • элемент управления ListView является создание
  • , когда пользователь прокручивает список вид
  • когда notifysetdatachanged() называется.
    Все это делается ОС. GetView() вызывается для всех строк в списке. Он не называется только одной строкой.Таким образом, если вы хотите изменить строки, вы должны снова предоставить данные в String[], ArrayList<> и т. Д.
    Если вы хотите, чтобы для текста отображался один текст, onClick() кнопки - вы можете сделать это

    общественного класса listAdapter расширяет 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; 
    } 
    

    }
    А в вашей деятельности:

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


    Существует еще один способ сделать это также, как @Andy предложено в одном из комментариев:

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

Извините за жирным шрифтом. По какой-то причине CTRL + K не работает для вышеуказанного кода.

+0

Отличный ответ. Я с тобой согласен. Еще одна вещь, которую он мог бы сделать, - просто установить onItemClickListener на сам ListView, и если позиция какая-то (при условии, что вы не используете кнопку), вы просто обновляете список в адаптере. Конечно, в конечном счете ему нужно выяснить, какой вариант лучше для него. – Andy

+0

@ Энди: Вы правы. На самом деле это была бы лучшая идея. Но поскольку он специально попросил изменить содержимое строки нажатием кнопки, я пошел на это. – Ashwin

+0

:) О нет, ты технически прав @ Ашвин только потому, что он более эффективен. Нет никакой ненужной работы. Поскольку он только хочет обновить одну строку. Но он упоминает, что это всего лишь тест, поэтому я полагаю, что он также должен иметь другой метод, если он хочет, чтобы его больше обновляли. – Andy

Смежные вопросы