gpt4 book ai didi

android - 如何在ListView中为ImageView设置onClick事件

转载 作者:行者123 更新时间:2023-11-29 18:57:59 26 4
gpt4 key购买 nike

我有一个显示歌曲标题的自定义 ListView,每个包含两个 ImageView,用于添加到收藏夹和分享歌曲。

自定义 ListView .xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<TextView android:id="@+id/song_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>

<ImageView
android:id="@+id/add_to_favorites"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>

<ImageView
android:id="@+id/share"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>

</LinearLayout>

activity_main:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="match_parent" />

</RelativeLayout>

要填充 ListView ,我需要使用 ArrayAdapter:

public class Media_adapter extends ArrayAdapter<Media> {

Context context;
int layoutResourceId;
Media data[] = null;


public Media_adapter(Context context, int layoutResourceId, Media[] data) {
super(context, layoutResourceId, data);
this.layoutResourceId = layoutResourceId;
this.context = context;
this.data = data;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
MediaHolder holder = null;

if(row == null)
{
LayoutInflater inflater = ((Activity)context).getLayoutInflater();
row = inflater.inflate(layoutResourceId, parent, false);

holder = new MediaHolder();
holder.song_title = (TextView)row.findViewById(R.id.song_title);
holder.add_to_favorites = (ImageView)row.findViewById(R.id.add_to_favorites);
holder.share = (ImageView)row.findViewById(R.id.share);

row.setTag(holder);

}
else
{
holder = (MediaHolder)row.getTag();
}

Media media = data[position];
holder.song_title.setText(media.title);
holder.add_to_favorites.setImageResource(media.image_favorite);
holder.share.setImageResource(media.image_share);

return row;
}

class MediaHolder
{
TextView song_title;
ImageView add_to_favorites, share;
}

}

类媒体:

package com...;

public class Media {

public String title;
public int image_favorite, image_share;

public Media() {
super();
}

}

为了播放歌曲,我调用了 setOnItemClickListener(...)

mylistview.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> av,
View view, int position, long l) {
//code for playing song
}
});

最后,我想为我在 Listview 的项目中使用的两个 ImageView add_to_favoritesshare 添加 onClick 事件。

最佳答案

您应该在适配器的构造函数中发送一个 View.onClickListener。然后将其分配给您感兴趣的 View 以单击它们然后在您的 Activity/fragment 中实现 onClickListener。

public class Media_adapter extends ArrayAdapter<Media> {

Context context;
int layoutResourceId;
Media data[] = null;
View.onClickListener listener;

public Media_adapter(Context context, int layoutResourceId, Media[] data,View.onClickListener) {
super(context, layoutResourceId, data);
this.layoutResourceId = layoutResourceId;
this.context = context;
this.data = data;
this.listener = listener;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
MediaHolder holder = null;

if(row == null)
{
LayoutInflater inflater = ((Activity)context).getLayoutInflater();
row = inflater.inflate(layoutResourceId, parent, false);

holder = new MediaHolder();
holder.song_title = (TextView)row.findViewById(R.id.song_title);
holder.add_to_favorites = (ImageView)row.findViewById(R.id.add_to_favorites);
holder.share = (ImageView)row.findViewById(R.id.share);
**holder.share.setTag(position);
holder.share.setOnClickListener(listener);**
row.setTag(holder);

}
else
{
holder = (MediaHolder)row.getTag();
}

Media media = data[position];
holder.song_title.setText(media.title);
holder.add_to_favorites.setImageResource(media.image_favorite);
holder.share.setImageResource(media.image_share);

return row;
}

class MediaHolder
{
TextView song_title;
ImageView add_to_favorites, share;
}

}

在您的 Activity 中,您将实现 View.onClicklistener

public class MyActivity extends Activity implements View.onClickListener
{

when you create your adapter send **this** as the last parameter of the adapter constructor.


public void onClick(View view) {
switch (view.getId())
{
case R.id.share:

//here you need to retrieve the position of the item
int position = (int)view.getTag();
Media med = media[position];
//here just use med where you want to use it.

do the same thing for other componenets in your adapter layout.

break;
}

}

需要注意的几点:

  1. 我推荐你使用recycleview(它有点复杂但了解它非常有用)而不是使用listview

  2. 我没有在我的电脑上测试我只是在我的记事本里写的代码,也许你会得到一些语法错误

更新

我创建了一个简单的项目,其功能与您正在寻找的相同,并且一切正常

主 Activity

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

private ListView mList;
private Media_adapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

mList = (ListView)findViewById(R.id.listview);

Media[] data = new Media[5];
for(int i=0;i<data.length;i++)
{
data[i] = new Media();
data[i].title = "pos"+i;
data[i].image_favorite = R.mipmap.ic_launcher;
data[i].image_share = R.mipmap.ic_launcher;
}

mAdapter = new Media_adapter(this,R.layout.custom_listview,data,this);
mList.setAdapter(mAdapter);
}

@Override
public void onClick(View view) {
int position;
switch (view.getId())
{
case R.id.add_to_favorites:
position = (int) view.getTag(); Log.d("test", position + " add_to_favorites");
break;
case R.id.share:
position = (int) view.getTag(); Log.d("test", position + " share");
break;
}

}
}

媒体适配器

public class Media_adapter extends ArrayAdapter<Media>
{

Context context;
int layoutResourceId;
Media data[];
View.OnClickListener listener;

public Media_adapter(Context context, int layoutResourceId, Media[] data, View.OnClickListener listener)
{
super(context, layoutResourceId, data);
this.layoutResourceId = layoutResourceId;
this.context = context;
this.data = data;
this.listener = listener;
}

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
View row = convertView;
MediaHolder holder;

if (row == null)
{
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
row = inflater.inflate(layoutResourceId, parent, false);

holder = new MediaHolder();
holder.song_title = (TextView) row.findViewById(R.id.song_title);
holder.add_to_favorites = (ImageView) row.findViewById(R.id.add_to_favorites);
holder.share = (ImageView) row.findViewById(R.id.share);

holder.add_to_favorites.setTag(position);
holder.add_to_favorites.setOnClickListener(listener);
holder.share.setTag(position);
holder.share.setOnClickListener(listener);

row.setTag(holder);

}
else
{
holder = (MediaHolder) row.getTag();
}

Media media = data[position];
holder.song_title.setText(media.title);
holder.add_to_favorites.setImageResource(media.image_favorite);
holder.share.setImageResource(media.image_share);

return row;
}

class MediaHolder
{
TextView song_title;
ImageView add_to_favorites, share;
}
}

关于android - 如何在ListView中为ImageView设置onClick事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49601058/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com