EasyListView
每次用到 ListView 時候都需要寫一個Adapter;令人惡心的是需要在getView() 方法中添加一堆代碼,無論是維護(hù)還是從頭開始寫都非常不便。該項目能夠極大的簡化代碼,使得代碼更加模塊化,且只需要三步就可以實現(xiàn)一個 Adapter。
GitHub : https://github.com/jqzhang/EasyListView
實現(xiàn)思路:
- 根據(jù)不同的 viewType 創(chuàng)建 View
- 綁定(項目中用Buttetknife 實現(xiàn))
- 更新View
主要代碼:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder vh;
// 如果view為null 或者 類型不符則重新創(chuàng)建
if (null == convertView || ((convertView.getTag() != null) && (((ViewHolder) convertView.getTag()).getType() != getItemViewType(position)))) {
vh = onCreateViewHolder(parent, position);
vh.setType(getItemViewType(position));
} else {
vh = (ViewHolder) convertView.getTag();
}
if (null == vh) {
return null;
}
vh.updateView(vh.getConvertView(), getItem(position), position);
return vh.getConvertView();
}
注意:項目中用到 butterknife
單一樣式
-
實現(xiàn) Adapter
class SingleTypeAdapter extends EasyBaseAdapter { List<Result> list = new ArrayList<>(); @Override protected List getList() { if (list.size() > 0) { return list; } // 構(gòu)造數(shù)據(jù) for (int i = 0; i < 60; i++) { SingleTypeActivity.Result result = new SingleTypeActivity.Result(); list.add(result); } return list; } // 構(gòu)造 Item ViewHolder @Override protected EasyBaseAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int position) { // 創(chuàng)建 ItemView View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_1, null); return new SingleTypeViewHolder(view); } } -
實現(xiàn)ViewHolder
class SingleTypeViewHolder extends EasyBaseAdapter.ViewHolder<Result> {@Bind(R.id.textView) TextView textView; public SingleTypeViewHolder(View view) { super(view); } @Override protected void updateView(View convertView, Result data, int position) { // 更新View textView.setText(data.txt + position + " " + (null == convertView)); } } 完成
listView.setAdapter(new SingleTypeAdapter());
多樣式
-
實現(xiàn)Adapter
class MutiTypeAdapter<Result> extends EasyBaseAdapter {// 一定要實現(xiàn)該方法 @Override public int getViewTypeCount() { return 2; } // 一定要實現(xiàn)該方法 @Override public int getItemViewType(int position) { if (0 == position % 2) { return 0; } else { return 1; } } List<MutiTypeActivity.Result> list = new ArrayList<>(); @Override protected List<MutiTypeActivity.Result> getList() { if (list.size() > 0) { return list; } // 構(gòu)造數(shù)據(jù) for (int i = 0; i < 60; i++) { MutiTypeActivity.Result result = new MutiTypeActivity.Result(); list.add(result); } return list; } // 構(gòu)造 Item ViewHolder @Override protected EasyBaseAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int position) { // 根據(jù) ViewType 創(chuàng)建 ItemView if (0 == getItemViewType(position)) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_1, null); return new MutiTypeViewHolder1(view); } else { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_2, null); return new MutiTypeViewHolder2(view); } } } -
實現(xiàn)ViewHolder
class MutiTypeViewHolder1 extends EasyBaseAdapter.ViewHolder<Result> {@Bind(R.id.textView) TextView textView; public MutiTypeViewHolder1(View view) { super(view); } @Override protected void updateView(View convertView, Result data, int position) { // 更新View textView.setText("刺激 + " + position + " " + (null == convertView)); } } class MutiTypeViewHolder2 extends EasyBaseAdapter.ViewHolder<Result> { @Bind(R.id.imageView) ImageView imageView; public MutiTypeViewHolder2(View view) { super(view); } @Override protected void updateView(View convertView, Result data, int position) { // 更新View imageView.setImageResource(R.mipmap.rr); } } 完成
listView.setAdapter(new SingleTypeAdapter());
注意:多樣式ListView 的 Adapter 中一定要實現(xiàn) getViewTypeCount() 和 getItemViewType()這兩個方法。其余照搬就好。