1. 程式人生 > >listview 通用模版

listview 通用模版

ViewHolder類

public class CommonViewHolder {

	private final SparseArray<View> mViews;
	private final int mLayoutId;
	private int mPosition;
	private final View mConvertView;

	public int getLayoutId() {
		return mLayoutId;
	}

	private CommonViewHolder(ViewGroup parent, int layoutId, int position) {
		this.mPosition = position;
		this.mViews = new SparseArray<>();
		this.mLayoutId = layoutId;
		// TODO
		mConvertView = LayoutInflater.from(parent.getContext()).inflate(layoutId, null);
		mConvertView.setTag(this);
	}

	public static CommonViewHolder get(View convertView,
                                       ViewGroup parent, int layoutId, int position) {
		CommonViewHolder holder;
		if (convertView == null || ((CommonViewHolder) convertView.getTag()).getLayoutId() != layoutId) {
			holder = new CommonViewHolder(parent, layoutId, position);
		} else {
			holder = (CommonViewHolder) convertView.getTag();
			holder.mPosition = position;
		}
		return holder;
	}

	public View getConvertView() {
		return mConvertView;
	}

    @SuppressWarnings("unchecked")
    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;
    }

	public CommonViewHolder setText(int viewId, String text) {
		TextView view = getView(viewId);
		view.setText(text);
		return this;
	}

	public CommonViewHolder setImageResource(int viewId, int drawableId) {
		ImageView view = getView(viewId);
		if (view != null) {
			view.setImageResource(drawableId);
		}

		return this;
	}

	public CommonViewHolder setImageBitmap(int viewId, Bitmap bm) {
		ImageView view = getView(viewId);
		view.setImageBitmap(bm);
		return this;
	}



	public int getPosition() {
		return mPosition;
	}

}

adapter類

public abstract class CommonAdapter<T> extends BaseAdapter {
	protected LayoutInflater mInflater;
	protected Context mContext;
	protected List<T> mDatas = new ArrayList<>();
	protected final int mItemLayoutId;

	public CommonAdapter(Context context, T[] datas, int itemLayoutId) {
		mContext = context;
		mInflater = LayoutInflater.from(mContext);
		mItemLayoutId = itemLayoutId;

		ArrayList<T> dataList = new ArrayList<>();
		if (datas != null) {
			Collections.addAll(dataList, datas);
		}

		mDatas.addAll(dataList);
	}

	public CommonAdapter(Context context, List<T> datas, int itemLayoutId) {
		mContext = context;
		mInflater = LayoutInflater.from(mContext);
		mDatas.addAll(datas);
		mItemLayoutId = itemLayoutId;
	}

	public void updateData(List<T> datas) {
		mDatas.clear();
		mDatas.addAll(datas);
		notifyDataSetChanged();
	}

	public void updateData(T[] datas) {
		mDatas.clear();
		if (datas != null && datas.length != 0) {
			Collections.addAll(mDatas, datas);
		}

		notifyDataSetChanged();
	}

	@Override
	public int getCount() {
		return mDatas == null ? 0 : mDatas.size();
	}

	@Override
	public T getItem(int position) {
		return mDatas == null ? null : mDatas.get(position);
	}

	@Override
	public long getItemId(int position) {
		return position;
	}

	@Override
	public View getView(final int position, View convertView, ViewGroup parent) {
		final CommonViewHolder viewHolder = getViewHolder(position, convertView, parent);
		convert(viewHolder, getItem(position));

		View view = viewHolder.getConvertView();
		if (parent instanceof ListView && !useCustomListSelector()) {
			view.setBackgroundResource(R.drawable.clickable_item_bg_selector);
		}

		return view;
	}

	public abstract void convert(CommonViewHolder helper, T item);

	public boolean useCustomListSelector() {
		return false;
	}

	public List<T> datas() {
		return mDatas;
	}

	private CommonViewHolder getViewHolder(int position, View convertView, ViewGroup parent) {
		return CommonViewHolder.get(convertView, parent, mItemLayoutId, position);
	}

	private OnItemClickListener<T> mItemClickListener;

	public void setOnItemClickListener(OnItemClickListener<T> listener) {
		mItemClickListener = listener;
	}

	public interface OnItemClickListener<T> {
		void onItemClick(int position, T data, View itemView);
	}

}

資原始檔

在drawable目錄中新增檔案clickable_item_bg_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<!--
  ~ Copyright (c) 2018. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
  ~ Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.
  ~ Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.
  ~ Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.
  ~ Vestibulum commodo. Ut rhoncus gravida arcu.
  -->

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_enabled="false" android:state_pressed="false">
		<color android:color="@android:color/white"/>
    </item>

    <item android:state_enabled="true" android:state_pressed="false">
		<color android:color="@android:color/white"/>
    </item>

    <item android:state_enabled="true" android:state_pressed="true">
        <color android:color="#D9D9D9"/>
    </item>

</selector>

在res目錄下建立目錄drawable-v21 ,新增檔案 clickable_item_bg_selector.xml

<ripple xmlns:android="http://schemas.android.com/apk/res/android"

    android:color="#D9D9D9">
    <item>
        <shape android:shape="rectangle">
            <solid android:color="@android:color/white" />
        </shape>
    </item>


</ripple>

在styles.xml檔案中新增以下樣式,主要是去掉預設的分割線

    <style name="defaultListView">
        <item name="android:listSelector">@android:color/transparent</item>
        <item name="android:divider">@null</item>
    </style>

使用listview模版

第一步,佈局檔案新增listview控制元件

    <ListView
        android:id="@+id/research_listview"
        style="@style/defaultListView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />

第二步,建立資料bean,例如Bean

第三步,新建一個weiget的類,集中處理item的ui,例如ListItem,繼承自通用的佈局,例如RelativeLayout



import android.content.Context;
import android.util.AttributeSet;
import android.widget.RelativeLayout;

import okhttp.example.com.okhttptest.activity.bean.Bean;

public class ListItem extends RelativeLayout {
    public ListItem(Context context) {
        super(context);
    }

    public ListItem(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ListItem(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
    
    public void setup(Bean bean){
        //TODO 初始化介面
        
    }
}

第四步,建立item的佈局檔案,例如R.layout.item,並且根佈局指向之前新建的weiget類

<xxx.ListItem 
xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="wrap_content">

    <ImageView
        android:id="@+id/image"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_centerVertical="true"/>

    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_toRightOf="@+id/image"/>
</xxx.ListItem >

第五步

在activity中例項化listview,

    private ListView mListView;
    private MyAdapter mAdapter;
    private List<Bean> mList = new ArrayList<>();


    @Override
    public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) {
        super.onCreate(savedInstanceState, persistentState);
        setContentView(R.layout.activity_main);
        mListView = findViewById(R.id.listview);
        //期間可以先設定header,根據需要來弄
        mAdapter = new MyAdapter(this,mList,R.layout.item);
        mListView.setAdapter(mAdapter);
    }


    private class  MyAdapter extends CommonAdapter<Bean>{

        public MyAdapter(Context context, List<Bean> datas, int itemLayoutId) {
            super(context, datas, itemLayoutId);
        }

        @Override
        public void convert(CommonViewHolder helper, Bean item) {
            ListItem widgetView = (ListItem) helper.getConvertView();
            widgetView.setup(item);
        }
    }

 

更新資料

  mAdapter.updateData(mList);