如何从自定义列表适配器获取listview的行索引?

时间:2012-04-16 13:19:24

标签: android

我有两个布局

  1. main.xml -----使用单个ListView(比如listview_01)。
  2. row.xml -----使用ImageView(比如imageView_01)&一个TextView(比如textView_01)
  3. 我使用我拥有的数组数据填充listview_01 row.xml作为行 我希望在onclick() imageView_01事件中执行操作,其工作正常 我在onClick() imageView_01的{​​{1}} getView()添加了CustomlistAdapter

    但是有人能告诉我如何在CustomListAdapter的行图像的listview_01的onClick()事件中获取行索引吗?

    这是我的代码

    道歉,但我无法上传我的整个活动&适配器代码

    某些活动代码

    listView_episodesList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
            // TODO Auto-generated method stub
    
            mQuickAction.show(arg1);
    
        }
    });
    

    某些适配器代码

    ImageView imageView_EpisodePic = (ImageView) convertView.findViewById(R.id.imageView_episode_pic);
    drawableManager.fetchDrawableOnThread(episodeTemp.episodeImage, imageView_EpisodePic);
    
    imageView_EpisodePic.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View arg0) {
            // TODO Auto-generated method stub
            Toast.makeText(context, "Click on image", Toast.LENGTH_LONG).show();
        }
    });
    

    从我的活动中,我可以访问我点击的listView行索引。但从适配器我不能。 我只想点击ListView(main.xml)

    ImageView (row.xml)中获取行索引

5 个答案:

答案 0 :(得分:1)

您可以在mListView.getPositionForView(v);中尝试onClick(View v),它将返回listview项的索引。 (注意:我不知道适配器,我猜你可以使用它)

答案 1 :(得分:0)

您的onItemSelectedListeneter()将具有适配器视图和位置以及ID ..您所需的位置(arg1

答案 2 :(得分:0)

我遇到了同样的问题,并且惊讶于我无法在自定义适配器类中找到更好的方法来执行此操作。 Nikola的解决方案可以在Activity或Fragment类中工作,但据我所知,不在自定义适配器中。

我在我的对象的ImageView属性上设置标记时遇到问题,其中第一个索引[0]无法正确返回,但是设置我对象的'name'属性的标记完美无瑕。我将继续寻找一种更好的方法来做到这一点,但是现在这似乎工作正常。

     public View getView(int position, View convertView, ViewGroup parent) {
        View view = null;

        if (convertView == null) {
            LayoutInflater inflator = context.getLayoutInflater();
            view = inflator.inflate(R.layout.row_project, null);

            final ViewHolder viewHolder = new ViewHolder();
            viewHolder.name = (TextView)view.findViewById(R.id.textProjectName);
            viewHolder.desc = (TextView)view.findViewById(R.id.textProjDesc);
            viewHolder.image = (ImageView)view.findViewById(R.id.imgProj);           
            viewHolder.name.setTag(position);

            Log.d(TAG, "Position: " + position);


            viewHolder.image.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Log.d(TAG, "Image Selected at Index: " + viewHolder.name.getTag());
                }

            });

            view.setTag(viewHolder);
        }
        else {
            view = convertView;
            ((ViewHolder) view.getTag()).name.setTag(list.get(position));
        }

        ViewHolder holder = (ViewHolder) view.getTag();
        holder.name.setText(list.get(position).getName());
        holder.desc.setText(list.get(position).getDescription());

        return view;
    }
} 

答案 3 :(得分:0)

列表中项目的行ID被设置为&#34; convertView&#34;的ID。

  

convertView.setId(位置)

当按下/选择某个项目时,该项目的行ID将在OnClickListener中获取。

      convertView.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // item position is fetched here. this is exactly the same position of the selected item in your list
                int selectedPosition = v.getId();
            }
        });

您可以为convertView的任何子级设置id。例如,

  

convertView.imageView.setId(位置);

然后按以下方式获取id

    imageView.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            int selectedPosition = v.getId();
        }
    });

全功能

public View getView(int position, View convertView, ViewGroup vg) {

    if (convertView == null) {
        convertView = inflater.inflate(R.layout.row_book_item, null);
        viewHolder = new ViewHolder();

        // ...

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

    if (listItems.size() > 0) {
        // item position is set here. this is exactly the same position of your item in the list
        convertView.setId(position);
        convertView.imageView.setId(position);

        // ...

        convertView.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // item position is fetched here. this is exactly the same position of the selected item in your list
                int selectedPosition = v.getId();
            }
        });

        imageView.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // item position is fetched here. this is exactly the same position of the selected item in your list
                int selectedPosition = v.getId();
            }
        });


    }
    return convertView;
}

答案 4 :(得分:-1)

在我的自定义适配器中,我有:

public View getView(final int position, View convertView, ViewGroup parent) {

其中position是单击行的索引。这应该可以在onClick()方法中使用。