点击ListView的Button修改Button本身的背景

来源:互联网 发布:ps cc mac中文破解版 编辑:程序博客网 时间:2024/09/21 06:33

注意事项:点击了一次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;@Overrideprotected 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();      }      @Overridepublic Object getItem(int position) {// TODO Auto-generated method stubreturn 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。但我这里没用。@Overridepublic void onClick(View v) {// TODO Auto-generated method stubif (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;      }                    }  


0 0