讲解setOnItemClickListener中处理对象的逻辑

Explain the logic of dealing with objects in setOnItemClickListener

看下面的代码:

 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            word word = words.get(position);

            mMediaPlayer = MediaPlayer.create(FamilyActivity.this, word.getAudioResourceId());
            mMediaPlayer.start();

            //*************Releasing resources
            mMediaPlayer.setOnCompletionListener(mCompletionListener);
        }
    });
}

它属于一个列表视图。
单击该 ListView 中的一行时,此方法会拦截单击并播放该项目的相应歌曲。

在第四行你会看到这段代码:word word = words.get(position);

请解释一下这行代码好吗?


PS:有关更多详细信息,我将向您展示 "word" class 以及 "words" ArrayList,以防您需要查看它:

public class word {

//////Atributes
private String mDefaultTranslation;
private String mMiwokTranslation;
private int mImageResourceId=NO_IMAGE_PROVIDED;
private static final int NO_IMAGE_PROVIDED=-1;
private int mAudioResourceId;

//Constructor
public word(String defaultTranslation,String miwokTranslation,int audioResourceId){
    mDefaultTranslation=defaultTranslation;
    mMiwokTranslation=miwokTranslation;
    mAudioResourceId=audioResourceId;
}
public word(String defaultTranslation,String miwokTranslation,int ImageResourceId,int audioResourceId){
    mDefaultTranslation=defaultTranslation;
    mMiwokTranslation=miwokTranslation;
    mImageResourceId=ImageResourceId;
    mAudioResourceId=audioResourceId;

}

//Getters
public String getDefaultTranslation(){
    return mDefaultTranslation;
}
public String getMiwokTranslation(){
    return mMiwokTranslation;
}
public int getImageResourceId(){return mImageResourceId;}
public boolean hasImage(){return mImageResourceId != NO_IMAGE_PROVIDED;}
public int getAudioResourceId(){return mAudioResourceId;}

这是 "words" arraylist:

 final ArrayList<word> words = new ArrayList<word>();
    words.add(new word("father", "әpә", R.drawable.family_father, R.raw.family_father));
    words.add(new word("mother", "әṭa", R.drawable.family_mother, R.raw.family_mother));
    words.add(new word("son", "angsi", R.drawable.family_son, R.raw.family_son));
    words.add(new word("daughter", "tune", R.drawable.family_daughter, R.raw.family_daughter));
    words.add(new word("older brother", "taachi", R.drawable.family_older_brother, R.raw.family_older_brother));
    words.add(new word("younger brother", "chalitti", R.drawable.family_younger_brother, R.raw.family_younger_brother));
    words.add(new word("older sister", "teṭe", R.drawable.family_younger_sister, R.raw.family_older_sister));
    words.add(new word("ounger sister", "kolliti", R.drawable.family_younger_sister, R.raw.family_younger_sister));
    words.add(new word("grandmother", "ama", R.drawable.family_grandmother, R.raw.family_grandmother));
    words.add(new word("grandfather", "paapa", R.drawable.family_grandfather, R.raw.family_grandfather));

"Position"是列表项被点击的位置。就像您单击 "mother" 项目...位置将为 1,它从 0 开始。

.get(position) 是ArrayList 的方法.. 其中returns arraylist 的特定项取决于position.

是的,你可以这样保存word对象。

words是ArrayList,与ListView关联,所以调用onItemClicked时,取ListView中item的position。所以,如果你想获取特定对象,它与 position 上的 ListView 项相关联,你可以调用 ArrayList 的 get() 方法。您现在有 word 对象,它与 position 位置的列表项相关联。

Position 是您单击的项目在适配器中的视图数组中的索引。 get() 方法只是 returns 从数组中查看。

您可以引用部分视图并将它们的值保存为字符串、对象等。

What is "position"?

间接回答 - 想想点击监听器的目的。你在点击什么 - 一个项目。它需要知道您单击了 哪个 项目。因此,position

And what is ".get()" method?

这似乎是你自己回答的。 words 是一个数组列表。你如何 "get" Arraylist 中的项目?

无论哪种情况,JavaDoc 都可以回答这两个问题

can we save them in a word object?

什么是"them"?您 正在 获取 word 对象的实例,但是变量名称也恰好是 word

保存位置?我不建议这样做。当同一个对象可以在另一个列表中的某个不同位置时,将单词的位置存储在一个列表中有什么好处?

word 是引用类型。 ArrayList 单词包含对几个单词对象的引用。 words.get(position) returns 对 ArrayList 中该索引处的单词对象的引用,从 0 开始。 word word = words.get(position) 引用 ArrayList words 中位置的单词并将其分配给 word,因此 word 现在 'points' 到 ArrayList 中的对象.

在这行代码中:

word word = words.get(position);

"position"指的是列表中被点击的位置。你可以看到它作为一个int参数传递给了函数:

public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

这里的 get() 方法很可能是 Java 的 List get 方法,returns 列表中给定索引处的项目: Java List javadoc



把它们放在一起,这一行就是说 "give me the 'word' object from the ArrayList 'words' that was clicked on, based on the int 'position' "



注意:另一个编码注释,通常的做法是用 "Word" 的开头大写字母命名 classes 而不是 "word"。这将避免混淆什么是 class 和什么是变量。