listView的item变化以及颜色选择,点其它控件默认对listView的选中项,排序

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) {
        
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值