自定义适配器:获取膨胀列表视图中单击项目的项目编号
我有一个自定义的基础适配器,它会延迟加载一些图像,然后膨胀布局,这样我最终会得到一个列表视图,其中图像和文本都在一行中。
当用户按下列表视图的一项时,例如项 0(顶部项),我想显示一个包含某些特定内容的对话框。此内容取决于项目编号 - 因此项目 0 显示的内容与项目 1 的内容不同,依此类推。
以下是自定义适配器的 getView
方法:
public View getView(int position, View convertView, ViewGroup parent)
{
View vi=convertView;
if(convertView==null)
{
vi = inflater.inflate(R.layout.facebook_item, null);
vi.setClickable(true);
vi.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
String s = "test";
Toast.makeText(myContext, s, Toast.LENGTH_SHORT).show();
}
});
}
TextView text=(TextView)vi.findViewById(R.id.text);
ImageView image=(ImageView)vi.findViewById(R.id.image);
text.setText(msg[position]);
text.getLineCount();
imageLoader.DisplayImage(data[position], image);
return vi;
}
这里重要的是 onClick
方法中发生的情况。我想要一个项目参数,但这对于这个 OnClickListener 来说是不可能的。我知道,普通列表视图是可能的。
那么 - 我怎样才能确定哪个项目被点击了呢?
PS:我尝试考虑使用某种 vi.setTag(<
,但我不知道如何在没有相同的情况下完成此操作为列表视图的所有项目设置标签。
I have a custom baseadapter which does some lazy loading of some images, and then inflating the layout so I end up with a listview where I have both image and text in one row.
When the user presses one item of the listview, say for example item 0 (top item), I want to show a dialog box with some specific content. This content depends on the item number - so the content shown for item 0 is not the same as for item 1, and so on.
Here is the getView
method of the custom adapter:
public View getView(int position, View convertView, ViewGroup parent)
{
View vi=convertView;
if(convertView==null)
{
vi = inflater.inflate(R.layout.facebook_item, null);
vi.setClickable(true);
vi.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
String s = "test";
Toast.makeText(myContext, s, Toast.LENGTH_SHORT).show();
}
});
}
TextView text=(TextView)vi.findViewById(R.id.text);
ImageView image=(ImageView)vi.findViewById(R.id.image);
text.setText(msg[position]);
text.getLineCount();
imageLoader.DisplayImage(data[position], image);
return vi;
}
What's important here is what's going on in the onClick
method. I would like to have an item parameter, but this is not possible for this OnClickListener. It's possible for normal listviews, I know that.
So - how can I determine which item is clicked?
PS: I've tried to think of using some sort of vi.setTag(<<number>>);
, but I don't see how this can be done without having the same tag set for all items of the listview.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
为什么不在 ListView 本身上使用 onItemClickListener ?
您的适配器应包含一种对象类型的列表(没有严格的规则,但它有助于更轻松地管理项目)。例如
,那么你的 CustomAdapter 将只包含
那么你的 getView 将看起来与此类似
,现在你的视图将把它作为一个对象来处理,而不是一个具有多个值的布局。
然后我们将所有点击操作移动到 ListView 所在的 Activity 中。
这也是我使用带有延迟加载 ImageView 的 ListView 的方式。然后您将能够访问与该视图关联的对象以及单击的位置。
如果您愿意将消息和数据分开。您可以使用 setTag(id, obj);对于这两个对象等。
更新:我的 CustomAdapter 内部活动示例
我处理项目单击操作
希望这能回答您的问题:)
Why not use onItemClickListener on ListView itself?
Your Adapter should contain a List of one Object type (there is no strict rule, but it helps managing the item much easier). For example
Then your CustomAdapter will only contain
Then your getView will looks similar to this
Now your view will handle this as one object instead of one layout with multiple values.
Then we move all the click action to the Activity which ListView resides in.
This is the way I have my ListView with Lazy load ImageView as well. Then you will be able to access the object tied to that view and also the position which is clicked.
If you are so wish to separate msg and data. You can use setTag(id, obj); for both object, etc.
UPDATE: Example of my CustomAdapter
Inside Activity I handle item click action with
Hope this answer your question :)
当您开始创建自定义适配器时,您希望尽可能使用 getItem(intposition) 引用您的项目。避免使用在 Adapter 构造函数中传递的实际数组来引用它。
尝试覆盖适配器上的
getItem(intposition)
和getItemId(intposition)
,并在getView
中使用它而不是数组本身。As you move towards creating a Custom adapter, you want to reference your items using getItem(int position) as much as possible. Avoid referencing it using the actual arrays you pass in your Adapter constructor.
Try overriding the
getItem(int position)
andgetItemId(int position)
on your adapter, and use that instead of the arrays themselves inside yourgetView
.