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

注意事项:点击了一次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;  
    }  
            
      }  





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值