Android - Как получить элементы Holder в адаптере ListView

1

Я написал класс ListActivity, который использует настраиваемый ArrayAdapter и Holders. Я хочу иметь доступ к TextView, хранящемуся в каждой строке, но не увенчался успехом. Вот соответствующий код ArrayAdapter:

EDIT: написал неэффективный взлом для его решения


class SuperNewAdapter extends ArrayAdapter {

public View getView(int position, View convertView, ViewGroup parent) {
  // RowHolder is a simple inner class that stores two TextViews and a CheckBox
  RowHolder holder = new RowHolder();
  if (convertView == null) {
    convertView = layoutInflater.inflate(R.layout.listrow, null);
    holder.titleText = (TextView) convertView.findViewById(R.id.textTitle);
    holder.bottomText = (TextView) convertView.findViewById(R.id.textDescription;
    holder.checkBox = (CheckBox) convertView.findViewById(R.id.checkBox1);
    convertView.setTag(holder);
} else {
    holder = (RowHolder) convertView.getTag()
}
  holder.titleText.setText(stringArr1[position]);
  holder.bottomText.setText(stringArr2[position]);

  // Array to futilely attempt to get a reference to each textView
  titleTextArr.add(holder.titleText);
  /////////////////HACK ATTACK! rows is an ArrayList of Holders
  boolean flag=true;
  for (int i = 0; i &lt rows.size(); i++) {
    if (rows.get(i) == holder)
    flag=false;
   }
  if (flag) rows.add(holder);

  return convertView;
}

Я попытался сохранить Holders (есть ли несколько?), а также хранить TextViews и CheckBoxes в отдельных массивах, но каждый элемент в массиве является одним и тем же элементом. Код ListActivity:


public class SuperNewListActivity extends ListActivity {
  //used in the Adapter getView() to store elements
  public ArrayList titleTextArr = new ArrayList();

public void onListItemClick(View v, int position, long id) { // always prints the same thing while position varies System.out.println(titleTextArr.get(position)); } }

I also tried using convertView.getTag(position), to no avail. How do I get those widgets so I can modify them? I need my widgets. widgets. widgets. Thanks for looking.
Теги:
listview
widget

1 ответ

1
Лучший ответ

Следующее должно работать нормально. Из вашего метода getView():

класс SuperNewAdapter расширяет ArrayAdapter {

public View getView(int position, View convertView, ViewGroup parent) {
  // RowHolder is a simple inner class that stores two TextViews and a CheckBox
  RowHolder holder;
  if (convertView == null) {
    convertView = layoutInflater.inflate(R.layout.listrow, null);
    holder = new RowHolder();
    holder.titleText = (TextView) convertView.findViewById(R.id.textTitle);
    holder.bottomText = (TextView) convertView.findViewById(R.id.textDescription;
    holder.checkBox = (CheckBox) convertView.findViewById(R.id.checkBox1);
    convertView.setTag(holder);
  } else {
      holder = (RowHolder) convertView.getTag()
  }
  holder.titleText.setText(stringArr1[position]);
  holder.bottomText.setText(stringArr2[position]);
  return convertView;
}

И затем при нажатии:

public void onListItemClick(View v, int position, long id) {
  Log.i("foo", "Title text: " + ((RowHolder)v.getTag).titleText.getText());
}

Если вам просто нужен текст, вы можете сохранить его непосредственно в RowHolder как String, поэтому вам не нужно извлекать его из виджета TextView.

Или, наоборот, вам действительно не нужно использовать держатель для этого, так как у вас есть исходный массив, который вы использовали для заполнения списка:

public void onListItemClick(View v, int position, long id) {
  Log.i("foo", "Title text: " + stringArr1[position]);
}

Эта последняя форма действительно соответствует тому, как чаще используется ListView - он отображает некоторый набор данных, хранящийся в массиве или курсоре или таком; Адаптер отвечает за преобразование этих данных в правильное представление, чтобы показать пользователю; когда элемент щелкнут, вы знаете, какая вещь в наборе данных (как позиция, так и идентификатор) была нажата, поэтому можно просто перейти непосредственно к набору данных, чтобы получить его значение.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню