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

原创 2015年07月08日 13:06:55

首先,适配器必须不能用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);

	}


就这样就全部完成了

版权声明:本文为博主原创文章,未经博主允许不得转载。

设置 listview为单选模式平且设置选中的item的背景颜色为系统主题颜色

listview设置单选模式:mListView.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 当然还有很多其他的模式可以选择,如ListView.CHOI...

关于ListView 单选模式下 改变 选中的item的背景色

listview 单选模式 修改选中项的背景色

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Android 当listview某项被选中时,改变字体的颜色,采用XML来配置

最近在做android的文件管理器功能,将读取到的文件名依次存放到listview中进行显示时,如何表示用户选中了某一个文件呢,即当listview某项被选中时,改变字体的颜色。先上效果图: 具体...

android如何改变listview中item选中时文字的颜色

当listview的某个item选中时,默认有个选中的高亮显示,如果你要自定义选中时的高亮显示效果,可以在listview中设置属性 1 android...

ListView单选文字变色

  • 2016年01月20日 11:16
  • 3.97MB
  • 下载

ListView实现颜色变化的单选效果

  • 2016年03月04日 14:14
  • 6.26MB
  • 下载

ListView利用CheckedTextViewr实现条目单选效果

最近遇到的一个小需求,可以简化为该模型,因此写一个Demo以记录。其实比较简单,主要利用Selector,只是网上找了一番也没找到ListView在点击后背景色一直是checked的,大多数是pres...

用CheckBox实现ListView单选效果

写此功能主要是因为朋友有个需求是选择单个支付方式,so......代码很简单,就不做多余的解释,如下就是实现详情: 首先是布局文件: activity_main:     xmlns:t...

CheckedTextView实现ListView的单选效果

CheckedTextView实现ListView的单选效果 1.activity_main.xml代码如下:
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:实现单选的字体变色效果的listview
举报原因:
原因补充:

(最多只允许输入30个字)