Я хочу обновить одну строку в своем списке с разным содержимым, как только я нажму кнопку. Я знаю, что могу использовать 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;
}
}
Это то, что деятельность выглядит следующим образом:
Но когда я нажимаю мой кнопку ничего не меняет
Отличный ответ. Я с тобой согласен. Еще одна вещь, которую он мог бы сделать, - просто установить onItemClickListener на сам ListView, и если позиция какая-то (при условии, что вы не используете кнопку), вы просто обновляете список в адаптере. Конечно, в конечном счете ему нужно выяснить, какой вариант лучше для него. – Andy
@ Энди: Вы правы. На самом деле это была бы лучшая идея. Но поскольку он специально попросил изменить содержимое строки нажатием кнопки, я пошел на это. – Ashwin
:) О нет, ты технически прав @ Ашвин только потому, что он более эффективен. Нет никакой ненужной работы. Поскольку он только хочет обновить одну строку. Но он упоминает, что это всего лишь тест, поэтому я полагаю, что он также должен иметь другой метод, если он хочет, чтобы его больше обновляли. – Andy