Android如何通过单击ImageView从ArrayAdapter获取id

Android如何通过单击ImageView从ArrayAdapter获取id,android,Android,我在ArrayAdapter中放置了一个ImageView,列表如下所示: //... intent.putExtra(LearningCardActivity.CURRENT_CARD_LIST_ID, holder.position); //... 名称1 |图像视图| 名称2 |图像视图| 名称3 |图像视图| 以此类推 我不知道单击ImageView后如何获取项目id @Override public View getView(int position, View contextVi

我在ArrayAdapter中放置了一个ImageView,列表如下所示:

//...
 intent.putExtra(LearningCardActivity.CURRENT_CARD_LIST_ID, holder.position);
//...
名称1 |图像视图|

名称2 |图像视图|

名称3 |图像视图|

以此类推

我不知道单击ImageView后如何获取项目id

@Override
public View getView(int position, View contextView, ViewGroup parent) {
    final ViewHolder viewHolder;
    View rowView = contextView;
    final CardList list = _cardList.get(position);

    if (rowView == null) {
        LayoutInflater layoutInflater = _context.getLayoutInflater();
        rowView = layoutInflater.inflate(R.layout.cardlist_viewlist_tpl, null, true);
        viewHolder = new ViewHolder();
        viewHolder.tvCardListName = (TextView) rowView.findViewById(R.id.tvCardListName);
        viewHolder.btnCardListLearn = (ImageView) rowView.findViewById(R.id.btnCardListLearn);
        viewHolder.btnCardListLearn.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                Intent intent = new Intent(_context, LearningCardActivity.class);

                //!!!!!!!!!!!!!!!
                //this doesn't work, I always get 1st positon Id
                intent.putExtra(LearningCardActivity.CURRENT_CARD_LIST_ID, list.getId());
                //!!!!!!!!!!!!!!!!

                _context.startActivity(intent);
            }
        });

        rowView.setTag(viewHolder); 
    } else {
        viewHolder = (ViewHolder) rowView.getTag();
    }

    viewHolder.tvCardListName.setText(list.getName());

    return rowView;
}

似乎您正在使用
rowView/contextView
,并且只有在rowView等于
null
时才设置onClickListener。这基本上意味着
viewholder
对象上的侦听器只会在第一次调用
getView()
时设置。因此,您将始终看到相同的第一项id

如果要为每一行设置侦听器,则需要更改逻辑并移动
setOnClickListener()
调用

public View getView(int position, View contextView, ViewGroup parent) {
    View rowView = contextView;
    if (rowView == null) {
        // Code here will only be run the very first time 
        // (when the row view hasn't been constructed yet)
    } else {
        // Code here will be run after that, since we're 
        // re-using the row's view
    }
}

可以在ViewHolder类上添加属性,如:

static class ViewHolder {

   //...

   int position;

}
在返回视图之前设置此属性:

//...
viewHolder.position = position;
return rowView;
现在,您可以使用holder.position在侦听器上使用项目ID。 在您的情况下,应该是这样的:

//...
 intent.putExtra(LearningCardActivity.CURRENT_CARD_LIST_ID, holder.position);
//...
我不确定这是否是更好的方法,但它对我有效

基于: