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

首先,适配器必须不能用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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值