我有一个带有自定义适配器的列表视图。 listView中的自定义行包含2个图像按钮,当我单击它时需要处理某些内容。 但它不能像我想的那样工作,因为当我启动应用程序并单击图像按钮然后没有任何反应,但如果我先点击该行然后在imageButton上,那么我的点击正在被处理。 我尝试了一些帮助其他用户的解决方案,但没有人遇到与我完全相同的问题,因为它在点击一行后得到处理。
FavoriteActivity
public class FavoriteActivity extends Activity {
private List<Favorite> favoriteItem = new ArrayList<Favorite>();
ViewHolder holder = new ViewHolder();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.favorite);
populateFavoriteList();
populateListview();
registerClickCallBack();
}
private void populateFavoriteList() {
favoriteItem.add(new Favorite(R.drawable.icon_camera, "item 1"));
favoriteItem.add(new Favorite(R.drawable.icon_camera, "item 2"));
favoriteItem.add(new Favorite(R.drawable.icon_camera, "item 3"));
favoriteItem.add(new Favorite(R.drawable.icon_camera, "item 4"));
favoriteItem.add(new Favorite(R.drawable.icon_camera, "item 5"));
favoriteItem.add(new Favorite(R.drawable.icon_camera, "item 6"));
favoriteItem.add(new Favorite(R.drawable.icon_camera, "item 7"));
favoriteItem.add(new Favorite(R.drawable.icon_camera, "item 8"));
}
private void populateListview() {
ArrayAdapter<Favorite> adapter = new MyListAdapter();
ListView list = (ListView) findViewById(R.id.favoriteList);
list.setAdapter(adapter);
}
private class MyListAdapter extends ArrayAdapter<Favorite> {
public MyListAdapter() {
super(FavoriteActivity.this, R.layout.favorite_row, favoriteItem);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// To be sure we have a view, because null is possible
View itemView = convertView;
if (itemView == null) {
itemView = getLayoutInflater().inflate(R.layout.favorite_row, parent, false);
}
// Find the item to work with
Favorite currentItem = favoriteItem.get(position);
// Filling the View
holder.thumbnail = (ImageButton) itemView.findViewById(R.id.favoriteThumbnail);
holder.thumbnail.setBackgroundResource(currentItem.getThumbnail());
holder.name = (TextView) itemView.findViewById(R.id.favoriteName);
holder.name.setText(currentItem.getName());
return itemView;
}
}
private void registerClickCallBack() {
ListView list = (ListView) findViewById(R.id.favoriteList);
list.setOnItemClickListener(new AdapterView.OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> parent, View viewClicked, int position, long id) {
final Favorite favoriteClicked = favoriteItem.get(position);
String msg = "Clicked position " + position + " which is " + favoriteClicked.getName();//Can I use my holder here to get the name back?? Because it wasn't working...
Toast.makeText(FavoriteActivity.this, msg, Toast.LENGTH_LONG).show();
ImageButton btnDirections = (ImageButton) viewClicked.findViewById(R.id.favoriteDirections);
ImageButton btnDelete = (ImageButton) viewClicked.findViewById(R.id.favoriteDelete);
btnDirections.setOnClickListener(new OnClickListener() {
String btnmsg = "getting directions for " + favoriteClicked.getName();
@Override
public void onClick(View v) {
Toast.makeText(FavoriteActivity.this, btnmsg, Toast.LENGTH_LONG).show();
}
});
btnDelete.setOnClickListener(new OnClickListener() {
String btnmsg = "getting delete for " + favoriteClicked.getName();
@Override
public void onClick(View v) {
Toast.makeText(FavoriteActivity.this, btnmsg, Toast.LENGTH_LONG).show();
}
});
}
});
}
static class ViewHolder {
ImageButton thumbnail;
TextView name;
}
}
FavoriteClass
public class Favorite {
private int favoriteThumbnail;
private String favoriteName;
public Favorite(int favoriteThumbnail, String favoriteName){
super();
this.favoriteThumbnail = favoriteThumbnail;
this.favoriteName = favoriteName;
}
public int getThumbnail(){
return favoriteThumbnail;
}
public String getName(){
return favoriteName;
}
}
favorite_row.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:weightSum="4"
android:descendantFocusability="blocksDescendants">
<ImageButton
android:layout_width="75dp"
android:layout_height="65dp"
android:contentDescription="thumbnail"
android:src="@drawable/icon_camera"
android:layout_weight="2"
android:id="@+id/favoriteThumbnail"
android:scaleType="fitXY"
style="@style/favoriteRowItems"
android:focusable="false"/>
<TextView
android:id="@+id/favoriteName"
android:layout_weight="2"
android:layout_gravity="center_vertical"
android:text="Name"
android:textSize="30sp"
style="@style/favoriteRowItems"/>
<ImageButton
android:contentDescription="Direction"
android:layout_weight="0.5"
android:src="@drawable/icon_directions"
android:id="@+id/favoriteDirections"
style="@style/favoriteRowItems"
android:focusable="false"/>
<ImageButton
android:contentDescription="Delete from favorite"
android:layout_weight="0.5"
android:src="@drawable/icon_delete"
android:id="@+id/favoriteDelete"
style="@style/favoriteRowItems"
android:layout_marginRight="5dp"
android:focusable="false"/>
</LinearLayout>
答案 0 :(得分:1)
将两个按钮添加到getView
方法,并将它们包含在您的处理程序中,然后通过getView
方法传递您想要分配点击侦听器,如下所示:
holder.btnDelete.setOnClickListener(new OnClickListener() {
String btnmsg = "getting delete for " + favoriteClicked.getName();
@Override
public void onClick(View v) {
Toast.makeText(FavoriteActivity.this, btnmsg, Toast.LENGTH_LONG).show();
}
});
所以你的ViewHolder
课程将如下所示:
static class ViewHolder {
ImageButton thumbnail;
TextView name;
ImageButton btnDelete;
ImageButton btnDirections;
}
然后根据其他视图
在getView()
方法中设置按钮
holder.btnDirections=(ImageButton)itemView.findViewById(R.id.favoriteDirections);
holder.btnDelete=(ImageButton)itemView.findViewById(R.id.favoriteDelete);
答案 1 :(得分:0)
好吧,你正在初始化ListView的onItemClickListener()
按钮的点击监听器,当然它只在你单击该行后才能工作。
您需要在getView()
方法中进行设置。但请注意,在ListView项目中提供可点击项目并不是真正的标准做法。