昨天在ListView Item上添加ImageButton时,发现item点击没响应,上网查找时发现有的文章认为不能使用simpleAdapter为ListView的item添加按钮响应事件,有的则认为simpleAdapter可以。下面一起解决这两个问题:
1.亲测可以分别使用simpleAdapter和baseAdapter为ListView的Item添加按钮响应事件。
(1)使用simpleAdapter为listView的item添加按钮响应事件
MainActivity.java
package com.example.arrayadapter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.Toast;
/**
* 继承simpleAdapter实现listView每个Item上面的按钮添加事件
*
*/
public class MainActivity extends Activity {
private ListView lv ; //声明一个列表
/* 显示ListView的两种方法:
* 1)在activity对应的布局里声明ListView控件,使用findViewById初始listView对象,最后listView.setAdapter显示listVIew
* 2)直接初始化ListVIew = new ListView(this),setAdapter后,通过setContentView(listView)把listView显示出来
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView)findViewById(R.id.listview) ;
// lv = new ListView(this) ;
//String[]的img 要和int[]的img名称一致
MySimpleAdapter adapter = new MySimpleAdapter(this,getData(),R.layout.item,
new String[]{"view1","view2","img","imageButton"},
new int[]{R.id.view1,R.id.view2,R.id.img,R.id.imageButton}) ;
lv.setAdapter(adapter) ;
// setContentView(lv) ;
//添加监听器
lv.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(AdapterView> arg0, View arg1, int arg2,
long arg3) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "点击的是ListView的item:"+arg2, Toast.LENGTH_LONG).show() ;
}
}) ;
}
private ArrayList
MySimpleAdapter.java
package com.example.arrayadapter;
import java.util.List;
import java.util.Map;
import android.content.Context;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.SimpleAdapter;
import android.widget.Toast;
public class MySimpleAdapter extends SimpleAdapter {
Context context ;
public MySimpleAdapter(Context context,
List extends Map> data, int resource, String[] from,
int[] to) {
super(context, data, resource, from, to);
this.context = context ;
// TODO Auto-generated constructor stub
}
/* (non-Javadoc)
* @see android.widget.SimpleAdapter#getView(int, android.view.View, android.view.ViewGroup)
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
View view= super.getView(position, convertView, parent);
ImageButton btn=(ImageButton) view.findViewById(R.id.imageButton);
btn.setTag(position);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), "点击的是ImageButton"+v.getTag(), 1).show();
}
});
return view;
}
protected Context getApplicationContext() {
// TODO Auto-generated method stub
return context;
}
}
activity_main.xml
item.xml
(2)使用baseAdapter为listView的item添加按钮响应事件
MainActivity.java
package com.example.listviewdemo;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
/**
* @author Devel_000
*使用baseAdapter为listView的item添加按钮响应事件
*/
public class MainActivity extends Activity {
private ListView lv ; //声明一个列表
ArrayList> listData ;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView)findViewById(R.id.listview) ;
listData = getData() ;
MyAdapter myAdapter = new MyAdapter(this,listData) ;
lv.setAdapter(myAdapter) ;
//添加监听器
lv.setOnItemClickListener(new OnItemClickListener(){
@Override
public void onItemClick(AdapterView> arg0, View arg1, int arg2,
long arg3) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "点击的是ListView的item:"+arg2, Toast.LENGTH_LONG).show() ;
}
}) ;
}
//Item的内容
private ArrayList> getData()
{
ArrayList> data = new ArrayList>() ;
Map item ;
item = new HashMap() ;
item.put("view1", "张三") ;
item.put("view2", "23") ;
item.put("img", R.drawable.ic_launcher) ;
item.put("imageButton", R.drawable.ic_launcher) ;
data.add(item) ;
item = new HashMap() ;
item.put("view1", "李四") ;
item.put("view2", "20") ;
item.put("img", R.drawable.ic_launcher) ;
item.put("imageButton", R.drawable.ic_launcher) ;
data.add(item) ;
return data ;
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
MyAdapter.java
package com.example.listviewdemo;
import java.util.ArrayList;
import java.util.Map;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
public class MyAdapter extends BaseAdapter {
private LayoutInflater mInflater ;
private ArrayList> listData ;
private Context context ;
public MyAdapter(Context context,ArrayList> listData)
{
mInflater = LayoutInflater.from(context) ;
this.listData = listData ;
this.context = context ;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return listData.size() ;
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return 0;
}
//这里arg0被定义为final是java语法规范(Cannot refer to a non-final variable arg0 inside an inner class defined in a different method)
@Override
public View getView(final int arg0, View arg1, ViewGroup arg2) {
// TODO Auto-generated method stub
ViewHolder holder = null ;
if(arg1 == null)
{
holder = new ViewHolder() ;
arg1 = mInflater.inflate(R.layout.item, null);
//需要为每个控件指定内容,如指定textView的显示文字(这就是引用的listData作用)
holder.imageButton = (ImageButton)arg1.findViewById(R.id.imageButton) ;
holder.imageView = (ImageView)arg1.findViewById(R.id.img) ;
holder.textView1 = (TextView)arg1.findViewById(R.id.view1) ;
holder.textView1.setText(listData.get(arg0).get("view1").toString()) ;
holder.textView2 = (TextView)arg1.findViewById(R.id.view2) ;
holder.textView2.setText(listData.get(arg0).get("view2").toString()) ;
arg1.setTag(holder) ;
}
else
{
holder = (ViewHolder)arg1.getTag();
}
holder.imageButton.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(getApplicationContext(), "点击的是ImageButton "+arg0, 1).show();
}});
return arg1;
}
protected Context getApplicationContext() {
// TODO Auto-generated method stub
return context;
}
public class ViewHolder
{
public ImageView imageView ;
public TextView textView1 ;
public TextView textView2 ;
public ImageButton imageButton ;
}
}
activity_main.xml
item.xml
运行截图:
在此过程中可能会遇到的问题(上述代码是可正常运行的,没有问题的):
1.为listView添加button等控件时,点击item没响应:
解决方法:在ListView的Item的xml文件中添加如下属性:
1)整个xml文件的根元素如LinearLayout中添加属性android:descendantFocusability="blocksDescendants"
2)被点击的控件如ImageButton中添加属性android:focusable="false"和android:clickable="true"
2.点击listView item中的空白地方没响应:
解决方法:在含ListView的布局中将listView的layout_width设置为fill_parent或match_parent,而不是“wrap_content”
仅供参考