我正在用ListView创建一个自定义数组适配器,我注意到我在R.id.txt_item_eng
中分配给每个englishWordTextView
的资源ID itemListView
似乎是相同的吗?如果我在ListView中有一个视图列表,那么它们的ID是否应该有所不同?我只是想用一个新的英语单词来更新每个项目。
public class WordAdapter extends ArrayAdapter<Word> {
public WordAdapter(Context context, List objects) {
super(context, 0, objects);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View itemListView = convertView; //Recycle old view
....
// Word is a custom class
Word w = getItem(position); It's specified in `extends ArrayAdapter<Word>`
// Update English word
TextView englishWordTextView = (TextView) itemListView.findViewById(R.id.txt_item_eng);
englishWordTextView.setText(w.getEnglishWord());
return itemListView;
}
}
我猜这里还有一个问题,如果每个单词TextView
的ID为R.id.txt_item_eng
,我该如何在itemListView
之外引用它们?
答案 0 :(得分:1)
ListView
或任何AdapterView
的工作方式。相同的视图将为每个项目膨胀。每个在Android中具有Adapter
实现的小部件都有自己的方式来访问特定位置的项目。
例如,如果要单击每个位置,可以设置AdapterView.OnItemClickListener
。
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
// position is the item clicked
}
});
每个ListAdapter
类还具有访问getItem(position)
之类的方法的方法,您可以从中返回数据集的特定位置的对象。
根据我的理解,您应该首先了解ListView
和ViewHolder
模式。
您可以阅读This Doc或类似的书。如果您不了解ListView
背后的概念,那么这个答案可能太大了。因此最好您查看一些样本和文档。
PS :-立即抛弃ListView
并开始使用RecyclerView
。这是RecyclerView
的{{3}}。
答案 1 :(得分:0)
ListView是视图的集合,必须使用Google-Sample进行填充。看起来您处在正确的轨道上,但您可能不了解此模式的所有组成部分。应该没有理由从适配器外部引用TextView。您使用的getView()
方法负责扩大ListView中行的布局。在此处设置文本和行的任何其他可见元素。
getItem()
方法(可以看到您正在调用,但尚未包含声明)在这里,您可以在其中访问项目的数据(在ArrayAdapter中考虑模型)。 / p>
这里是MVC pattern,可能会使它更容易理解。