listView的item变化以及颜色选择,点其它控件默认对listView的选中项,排序
第一次写CSDN的博客,写这个的原因是我看到网上很多千篇一律的listView选中后,text的改变是通过drawable里面的selector,我试过将近一周吧,没有任何作用,因为根本获取不到焦点。研究了一段时间,终于能做到根据position的改变,让那个position的item做相应的改变。废话不多说了,直接看代码吧,先把Adapter和贴出来:
package com.geonoon.parking.adapter;
import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
import com.geonoon.parking.util.UserConfig;
import com.geonoon.parking.view.ViewHolder;
import java.util.List;
/**
* Created by wyt on 2017/5/11.
*/
public abstract class CustomAdapter<T> extends BaseAdapter {
protected Context mContext;
protected List<T> mDatas;
private int layoutID = -1;
private View layoutView ;
public CustomAdapter(Context mContext, List<T> mDatas, int layoutID) {
super();
this.mContext = mContext;
this.mDatas = mDatas;
this.layoutID = layoutID;
}
public CustomAdapter(Context mContext, List<T> mDatas, View view) {
super();
this.mContext = mContext;
this.mDatas = mDatas;
this.layoutView = view;
}
@Override
public int getCount() {
return mDatas.size();
}
@Override
public T getItem(int position) {
return mDatas.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (layoutID == -1) {
holder = ViewHolder.getViewHolder(mContext, parent, convertView, layoutView, position);
}else{
holder = ViewHolder.getViewHolder(mContext, parent, convertView, layoutID, position);
}
if(UserConfig.HORIZONTAL_CLICK){
holder = ViewHolder.getFirstConvertView(mContext, parent, convertView, layoutView, 0);
TextView textView = (TextView) convertView.findViewById(layoutID);
convert(holder, getItem(position),0);
}else {
convert(holder, getItem(position),position);
}
return holder.getConvertView();
}
/**
* getView()用户自己实现
* @param holder
* @param t
*/
public abstract void convert(ViewHolder holder, T t, int position);
/**
* 根据搜索结果更新listview
* @param list
*/
public void updateListView(List<T> list) {
this.mDatas = list;
notifyDataSetChanged();
}
}
这俩是用来干啥,我就不多赘述了
package com.geonoon.parking.view;
import android.content.Context;
import android.graphics.Bitmap;
import android.text.SpannableStringBuilder;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import com.geonoon.parking.util.UserConfig;
/**
* Created by wyt on 2017/5/11.
*/
public class ViewHolder {
private SparseArray<View> mViews;
private View mConvertView;
private int mPosition;
// private static LoadImage mImageLoader = new LoadImage();
public ViewHolder(Context context, ViewGroup parent, int layoutID,
int position) {
this.mPosition = position;
mViews = new SparseArray<View>();
mConvertView = LayoutInflater.from(context).inflate(layoutID, parent,
false);
mConvertView.setTag(this);
}
public ViewHolder(Context context, ViewGroup parent, View view,
int position) {
this.mPosition = position;
mViews = new SparseArray<View>();
mConvertView = view;
mConvertView.setTag(this);
}
public static ViewHolder getViewHolder(Context context, ViewGroup parent,
View convertView, int layoutID, int position) {
if (convertView == null) {
return new ViewHolder(context, parent, layoutID, position);
} else {
ViewHolder holder = (ViewHolder) convertView.getTag();
holder.mPosition = position;
return holder;
}
}
public static ViewHolder getViewHolder(Context context, ViewGroup parent,
View convertView, View view, int position) {
if (convertView == null) {
return new ViewHolder(context, parent, view, position);
} else {
ViewHolder holder = (ViewHolder) convertView.getTag();
holder.mPosition = position;
return holder;
}
}
public View getConvertView() {
return mConvertView;
}
public static ViewHolder getFirstConvertView(Context context, ViewGroup parent,
View convertView, View view, int position) {
if (convertView == null) {
return new ViewHolder(context, parent, view, 0);
} else {
ViewHolder holder = (ViewHolder) convertView.getTag();
return holder;
}
}
public <T extends View> T getView(int viewID) {
View view = mViews.get(viewID);
if (view == null) {
view = mConvertView.findViewById(viewID);
mViews.put(viewID, view);
}
return (T) view;
}
/**
* 在网络上获取图片并设置给imageView
* @param viewID
* @param url
* @param resID 图片加载的时候默认显示的资源
* @return
*/
// public ViewHolder setImageForURL(int viewID, String url, int resID) {
// ImageView iv = getView(viewID);
// iv.setTag(url);
// iv.setImageResource(resID);
// mImageLoader.getBitmapFromAsyncTask(iv, url);
// return this;
// }
/**
* 为TextView设置文字抽取处理
*
* @param viewID
* @param text
* @return
*/
public ViewHolder setText(int viewID, String text) {
TextView tv = getView(viewID);
tv.setText(text);
return this;
}
public ViewHolder setText(int viewID, SpannableStringBuilder sb) {
TextView tv = getView(viewID);
tv.setText(sb);
return this;
}
public ViewHolder setVisibility(int viewID, int visibility) {
View view = getView(viewID);
view.setVisibility(visibility);
return this;
}
/**
* 为imageView设置图片、通过resource查找资源
*
* @param viewID
* @param resID
* @return
*/
public ViewHolder setImageResource(int viewID, int resID) {
ImageView iv = getView(viewID);
iv.setImageResource(resID);
return this;
}
/**
* 通过bitmap对象为imageView设置背景
*
* @param viewID
* @param bitmap
* @return
*/
public ViewHolder setImageBitmap(int viewID, Bitmap bitmap) {
ImageView iv = getView(viewID);
iv.setImageBitmap(bitmap);
return this;
}
/**
* 设置CheckBox选中状态
*
* @param viewID
* @param isChecked
* @return
*/
public ViewHolder setCheckBoxState(int viewID, boolean isChecked) {
CheckBox cb = getView(viewID);
cb.setChecked(isChecked);
return this;
}
public Boolean getCheckBoxState(int viewID) {
CheckBox cb = getView(viewID);
return cb.isChecked();
}
public ViewHolder setProgres(int viewID, int diff) {
ProgressBar bar = getView(viewID);
bar.setProgress(diff);
return this;//指定增加的进度
}
}
好了,现在来看主要代码吧,适配器的初始化和刷新方法,调用updateUI(),由于代码本身是公司项目,也不便上传demo。
顺道一提,公司需求我做的列表,前两个是固定不动的,“地图”和“全部”我用的是TextView定死,后面的是列表,如图
这里就涉及到第二个技术点了,比如说,我选择“医疗保健”后,点击楼层,我的列表会刷新,条目数肯定不是现在的条目数了,而且“医疗保健”的位置我也不知道会在第几个,那么我的焦点如何还保留在“医疗保健”上?
//通用适配器
// private FindShopEntity findShopEntity;
private CustomAdapter<AreaType> mAdapter;
private ArrayList<AreaType> mList = new ArrayList<>();
private ArrayList<AreaType> newList = new ArrayList<>();
private TextView oldView = null; //点击列表之后,上一个textView
private TextView firstTxt = null; //这个是公司需求,是左侧列表中的第一个textView
private void updateUI() {
if (mList.size() <= 0) {
if (mAdapter != null) {
mAdapter.updateListView(mList);
}
} else {
// layoutNoCard.setVisibility(View.GONE);
if (mAdapter == null) {
mAdapter = new CustomAdapter<AreaType>(FindShopActivity.this, mList, R.layout.item_findshop) {
@Override
public void convert(ViewHolder holder, final AreaType areaType, int position) {
holder.setText(R.id.item_fs_txt, areaType.getDesc());
final TextView txt = (TextView) holder.getConvertView().findViewById(R.id.item_fs_txt);
if (position == 0) {
firstTxt = (TextView) holder.getConvertView().findViewById(R.id.item_fs_txt);
}
if (firstTxt != null) {
// firstTxt.setTextColor(getResources().getColor(R.color.radioBtnBlue));
if ((!clickList && allClick)) {
firstTxt.setTextColor(getResources().getColor(R.color.radioBtnGray));
LogUtils.e("radioBtnGray");
}
}
holder.getView(R.id.item_fs_ll).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {