Android:自定义ArrayAdapter中使用的资源ID是否相同?

时间:2018-07-20 03:30:59

标签: java android listview android-arrayadapter android-resources

我正在用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之外引用它们?

2 个答案:

答案 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)之类的方法的方法,您可以从中返回数据集的特定位置的对象。

根据我的理解,您应该首先了解ListViewViewHolder模式。 您可以阅读This Doc或类似的书。如果您不了解ListView背后的概念,那么这个答案可能太大了。因此最好您查看一些样本和文档。

PS :-立即抛弃ListView并开始使用RecyclerView。这是RecyclerView的{​​{3}}。

答案 1 :(得分:0)

ListView是视图的集合,必须使用Google-Sample进行填充。看起来您处在正确的轨道上,但您可能不了解此模式的所有组成部分。应该没有理由从适配器外部引用TextView。您使用的getView()方法负责扩大ListView中行的布局。在此处设置文本和行的任何其他可见元素。

getItem()方法(可以看到您正在调用,但尚未包含声明)在这里,您可以在其中访问项目的数据(在ArrayAdapter中考虑模型)。 / p>

这里是MVC pattern,可能会使它更容易理解。