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

来源:互联网 发布:西安爱知中学 编辑:程序博客网 时间:2024/05/20 03:41

首先,适配器必须不能用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;}@Overridepublic int getCount() {return list.size();}@Overridepublic Object getItem(int position) {// TODO Auto-generated method stubreturn list.get(position);}@Overridepublic long getItemId(int position) {// TODO Auto-generated method stubreturn position;}@Overridepublic 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的点击事件中的逻辑


@Overridepublic 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
原创粉丝点击