Android 自定义 布局 ListView BaseAadaper 单击高亮选中项








几天前,我在CSDN.NET博客上看到了,一篇关于 自定义BaseAadaper修改列表颜色 的文章

文章传送门:

http://blog.csdn.net/xys289187120/article/details/6636139


ListView原理:

http://blog.csdn.net/hhq163/article/details/8132723


其中的第四项demo 我发现有一个相当明显的bug

注:说实话,我已经记不清bug的详细了,调试调飞了!

Bugs:两只


Bug 描述:ListvView (由ListActivity实现)往下划屏时,无法正确响应单点事件。

抛出异常:java.lang.NullPointerException

初步分析:BaseAadaper 的GetView方法重写没有处理由划屏引发的ListvView重绘(简而言之,便是 这货没有按照ListView原理进行高效准确响应)


Bug 描述:ListvView (由ListActivity实现)往下划屏时,无法正确响应实现单击高亮选中项

抛出异常:java.lang.NullPointerException

初步分析:没有记录选择项位置“[position]” 而且GetView没有正确处理"[position]"的重绘请求(这里需要参看ListView原理,并深入理解)


解决方案:

注意:目前为止,没有发现有bug!如有bug提交,请通知我!

或者 您有什么先进的算法 和想象 请不吝赐教

import android.app.ListActivity;
import android.content.Context;
import android.graphics.Color;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

public class ListViewLibrayActivity extends  ListActivity {
	  	
		private int mIndex;//选择项纪录
	    private String[] mListTitle = { "姓名", "性别", "年龄", "居住地","邮箱"};
	    private String[] mListStr = { "Syudf", "男", "4792", "地球",
		    ":)@earth.com" };
	    
	    
	    ListView mListView = null;
	    MyListAdapter myAdapter = null;
	    @Override
	    protected void onCreate(Bundle savedInstanceState) {
		mListView = getListView();
		myAdapter = new MyListAdapter(ListViewLibrayActivity.this);
		setListAdapter(myAdapter);
		mIndex=-1;//未选中
		mListView.setOnItemClickListener(new OnItemClickListener() {
		    @Override
		    public void onItemClick(AdapterView<?> adapterView, View view, int position,
			    long id) {

		    	for (int i = 0; i < adapterView.getCount(); i++) {
		    		View v=adapterView.getChildAt(i);
		    		
		    		if (i==position) {
		    			mIndex = position;			//记录当前选择项
						v.setBackgroundColor(Color.BLACK);//设置当前选中项背景
					} else {
						v.setBackgroundColor(Color.BLUE);//设置其他未选择项背景
					}
				}
		
		    }
		});
		
		super.onCreate(savedInstanceState);
	    }
	    
	    class MyListAdapter extends BaseAdapter {
		
		

		public MyListAdapter(Context context) {
		    mContext = context;
		}

		public int getCount() {
		    return mListStr.length;
		}

		@Override
		public boolean areAllItemsEnabled() {
		    return false;
		}

		public Object getItem(int position) {
		    return position;
		}

		public long getItemId(int position) {
		    return position;
		}

		public View getView(int position, View convertView, ViewGroup parent) {
		   VeiwHolder holder = null;
		   
		    if (convertView == null) {
			convertView = LayoutInflater.from(mContext).inflate(R.layout.item, null);
			holder = new VeiwHolder();
			holder.iamge = (ImageView) convertView.findViewById(R.id.imageView1);
			holder.title =(TextView) convertView.findViewById(R.id.textViewName);
			holder.text= (TextView) convertView.findViewById(R.id.textViewSex);
			convertView.setTag(holder);
		    }else {
		    	holder = (VeiwHolder) convertView.getTag();
			} 
		    
			if (mIndex==position) {
				convertView.setBackgroundColor(Color.BLACK);//选中项的重绘背景
			}else {
				convertView.setBackgroundColor(Color.BLUE);//未选中项的重绘背景
			}	  
			
		    holder.title.setText(mListTitle[position]);
		    holder.text.setText(mListStr[position]);
		    holder. iamge.setImageResource(R.drawable.list);
		    return convertView;
		}

		private Context mContext=null;
	
	    }
	}
 class VeiwHolder{
	 ImageView iamge;
	    TextView title ;
	    TextView text ;
 }


友情提示:

转换字符串为颜色值   设置背景色

比如

listview.setBackgroundColor(Color.parseColor("#F0FFFF") );  // Azure 天蓝色


i

tem.xml 文件可以根据个人喜好适当自定义布局(我是用的RelativeLayout布局方式)





作为您看到这里的感谢,赠送上两则您可能需要的网页地址:

传送您到cnblogs.com 农民伯伯 Android API中文 (42)ListView 

传送门:http://www.cnblogs.com/over140/archive/2010/11/19/1881445.html

传送您到CSDN.NET博客  Android   的color值语句 setBackgroundColor(Color.parseColor("x") );用得上

传送门:http://blog.csdn.net/xinke87/article/details/6675114



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值