注意事项:点击了一次Button之后,ListView的焦点会失去,从而点击ListView会没有反应,需要在List的Item添加android:descendantFocusability="blocksDescendants".
Demo下载地址:点击打开链接
效果图:
activity:
package com.example.listviewbuttondemo;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.widget.ListView;
public class LampSwitchActivity extends FragmentActivity {
ArrayList<Map<String, Object>> mData;
Context context;
@Override
protected void onCreate(Bundle arg0) {
super.onCreate(arg0);
context = this;
init();
}
//初始化
private void init() {
setContentView(R.layout.lampswitch_main);
mData = new ArrayList<Map<String,Object>>();
putData();
ListView listView = (ListView)findViewById(R.id.lampList);
LampSwithAdapter lampSwithAdapter = new LampSwithAdapter(context, mData);
listView.setAdapter(lampSwithAdapter);
}
//添加List数据。
void putData(){
for (int i = 0; i <15; i++) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("name", "Lamp"+i);
map.put("isOpen", false);
mData.add(map);
}
}
}
adapter:
package com.example.listviewbuttondemo;
import java.util.ArrayList;
import java.util.List;
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.TextView;
public class LampSwithAdapter extends BaseAdapter
{
public List<Map<String, Object>> mData;
private LayoutInflater mInflater;
Context context;
public LampSwithAdapter(Context context,ArrayList<Map<String, Object>> mData) {
this.context =context;
this.mInflater = LayoutInflater.from(context);
this.mData = mData;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return mData.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
//点击Button时,更改状态,如果灯开着则改成灯关着。
public void turnOnOff(int position) {
Boolean boolean1 =(Boolean)(mData.get(position).get("isOpen"));
mData.get(position).put("isOpen", !boolean1);
//更改完数据,需要刷新一下。
this.notifyDataSetChanged();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
MyClockListener myClockListener=null;
if (convertView == null) {
holder=new ViewHolder();
//可以理解为从vlist获取view 之后把view返回给ListView
convertView = mInflater.inflate(R.layout.lampswitch_listview_item, null);
holder.name = (TextView)convertView.findViewById(R.id.lampswitch_listview_item_name);
holder.viewBtn = (ImageButton)convertView.findViewById(R.id.lampswitch_listview_item_btn);
convertView.setTag(holder);
}else {
holder = (ViewHolder)convertView.getTag();
}
holder.name.setText((String)mData.get(position).get("name"));
holder.isOpen = (Boolean) mData.get(position).get("isOpen");
holder.viewBtn.setTag(position);
//给Button添加单击事件 添加Button之后ListView将失去焦点 需要在ListView的Item布局上设置永远焦点。
//给Button设置正确的图片
if (holder.isOpen) {
holder.viewBtn.setBackgroundResource(R.drawable.onlamp);
}else {
holder.viewBtn.setBackgroundResource(R.drawable.offlamp);
}
myClockListener=new MyClockListener(position,holder);
holder.viewBtn.setOnClickListener( myClockListener);
return convertView;
}
class MyClockListener implements OnClickListener{
int mPosition;
ViewHolder viewHolder;
//在这里为了方便,我设置了参数Position和holder,这样方便一点。
public MyClockListener(int inPosition,ViewHolder viewHolder){
mPosition= inPosition;
this.viewHolder= viewHolder;
}
//v.getTag()可以也可以获取到holder,因为之前设置了tag。但我这里没用。
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (viewHolder.isOpen) {
((ImageButton)v).setBackgroundResource(R.drawable.offlamp);
}else {
((ImageButton)v).setBackgroundResource(R.drawable.onlamp);
}
turnOnOff(mPosition);
}
}
final public class ViewHolder {
public TextView name;
public Boolean isOpen;
public ImageButton viewBtn;
}
}