Я написал класс 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 < 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.
Следующее должно работать нормально. Из вашего метода 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 - он отображает некоторый набор данных, хранящийся в массиве или курсоре или таком; Адаптер отвечает за преобразование этих данных в правильное представление, чтобы показать пользователю; когда элемент щелкнут, вы знаете, какая вещь в наборе данных (как позиция, так и идентификатор) была нажата, поэтому можно просто перейти непосредственно к набору данных, чтобы получить его значение.