关闭

实现单选的字体变色效果的listview

标签: androidlistviewlistview单选效果java
604人阅读 评论(0) 收藏 举报
分类:

首先,适配器必须不能用viewHolder类来复用,而且还要写一个public函数,供外部代码来调用传入要修改当前显示高亮字体的listview的item的position,然后再getview里面进行position的判断,并设置字体颜色。下面就是我的adapter代码

Shops_list_info_adapter.java

Shops_list_info_adapterpackage com.vvage.futuretown.adapter;

import java.util.ArrayList;
import java.util.List;
import java.util.zip.Inflater;

import com.vvage.futuretown.R;
import com.vvage.futuretown.model.Business;

import android.R.integer;
import android.content.Context;
import android.graphics.Color;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class Shops_list_info_adapter extends BaseAdapter {

	private List<Business.BusinessShopinfo> list;
	private Context mcontext;
	private List<integer> ischecked;
	private int checkPosition = -1;
	
	
	public Shops_list_info_adapter(Context context,
			List<Business.BusinessShopinfo> businessDate) {

		list = businessDate;
		mcontext = context;
		//ischecked=new ArrayList<R.integer>();
	}
	
	public void savaPosition(int checkPosition){
		this.checkPosition = checkPosition;
	}

	@Override
	public int getCount() {
		return list.size();
	}

	@Override
	public Object getItem(int position) {
		// TODO Auto-generated method stub
		return list.get(position);
	}

	@Override
	public long getItemId(int position) {
		// TODO Auto-generated method stub
		return position;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		Business.BusinessShopinfo business = list.get(position);
		View view = null;

		view = View.inflate(mcontext, R.layout.item_business_list, null);
		TextView textview=(TextView) view.findViewById(R.id.tv_business_name);
		textview.setText(business.name);

		if(checkPosition==position)
		{
			textview.setTextColor(mcontext.getResources().getColor(R.color.orange));
		}else {
			textview.setTextColor(mcontext.getResources().getColor(R.color.list_item_color));
		}
		
	
		return view;
	}

	class ViewHolder {

		public TextView tv_business_name;
	}

}


接下来就是处理listivew的点击事件,因为点击后,getview并不会调用,所以要在次调用getview才能显示出效果,但是,为了能点击后当时就显示出效果,只能在记录一下当前点击的position和上一次点击的position,然后获取他们的item,并且把里面的字体颜色进行改变。那么问题来了,由于listivew的复用机制 ,假如listview的长度为20,那么它可能并没有20个Itemview,这个时候你用getchildAt就会出现空指针,这个是头疼的问题,不过,我也找到了解决办法,通过我下面的这个函数来获取指定position的item就不会出现问题下面就是这个函数的代码


	/**
	 * 获取指定listview指定position的item
	 */
	private View getItemViewByPosition(int position,ListView listview)
	{
		
		final int firstListItemPosition = lv_search_list.getFirstVisiblePosition();
		final int lastListItemPosition = firstListItemPosition + lv_search_list.getChildCount() - 1;
		
		if (position < firstListItemPosition || position > lastListItemPosition ) {
			return lv_search_list.getAdapter().getView(position, null, lv_search_list);
		} else {
		    final int childIndex = position - firstListItemPosition;
		    return lv_search_list.getChildAt(childIndex);
		}
		
	}


这个是修改当前选中位置颜色的函数的逻辑


	/**
	 * 修改当前选中的item的color
	 */
	private void changeCurrentItemColor(int position, View view,
			AdapterView<?> parent) {

		  if(currentPosition!=prevPosition){
			  	TextView textview = (TextView) view.findViewById(R.id.tv_business_name);
				textview.setTextColor(mContext.getResources().getColor(R.color.orange));
				if(prevPosition!=-1){
					View preview=getItemViewByPosition(prevPosition, lv_search_list);
					TextView tv=(TextView) preview.findViewById(R.id.tv_business_name);
					tv.setTextColor(mContext.getResources().getColor(R.color.list_item_color));
				}
		  }
		  
		  prevPosition=currentPosition;
	}

再接下来就是listview的点击事件中的逻辑


	@Override
	public void onItemClick(AdapterView<?> parent, View view, int position,
			long id) {
		currentPosition = position;
		Log.d("33333", "782---->currentPosition is " + currentPosition);
		changeCurrentItemColor(position,view,parent);
		Shops_list_info_adapter.savaPosition(position);
		BusinessShopinfo info = BusinessShopinfoList.get(position);
		GeoPoint point = new GeoPoint((int) (Double.valueOf(info.lat) * 1E6),
				(int) (Double.valueOf(info.lon) * 1E6));
		Log.d("33333", "pointlat is " + point.getLatitudeE6()
				+ "  pointlon is " + point.getLongitudeE6());
		setOverlay(point);
		showBusinessInfoWindow(info, point);

	}


就这样就全部完成了

0
0

猜你在找
【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐(算法+实战)--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:37076次
    • 积分:904
    • 等级:
    • 排名:千里之外
    • 原创:50篇
    • 转载:12篇
    • 译文:0篇
    • 评论:25条
    最新评论