首先,适配器必须不能用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);
}
就这样就全部完成了