編輯:關於Android編程
public View getView(int pos, View convertView, ViewGroup parent){
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_item, null);
holder = new ViewHolder();
holder.text = (TextView) convertView.findViewById(R.id.text));
holder.icon = (ImageView) convertView.findViewButId(R.id.icon));
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.text.setText(DATA[pos]);
holder.icon.setImageBitmap((pos & 1) == 1 ? mIcon1 : mIcon2);
return convertView;
}
static class ViewHolder {
TextView text;
ImageView icon;
}
github鏈接:base-adapter-helper

可以看到BaseQuickAdapter繼承自BaseAdapter,同樣我們重點關注它的getView函數。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (getItemViewType(position) == 0) {
final H helper = getAdapterHelper(position, convertView, parent);
T item = getItem(position);
helper.setAssociatedObject(item);
convert(helper, item);
return helper.getView();
}
return createIndeterminateProgressView(convertView, parent);
}
private View createIndeterminateProgressView(View convertView, ViewGroup parent) {
if (convertView == null) {
FrameLayout container = new FrameLayout(context);
container.setForegroundGravity(Gravity.CENTER);
ProgressBar progress = new ProgressBar(context);
container.addView(progress);
convertView = container;
}
return convertView;
}
第3行代碼就是獲取該postion的Item類型,上面定義了兩種類型的Item,一種是我們需要顯示的View的Item,一種是底部的加載的View的Item。當Item類型為0是就為需要顯示的Item,當Item類型為1是就為底部加載的Item,上面的第11行代碼的createIndeterminateProgressView就是創建底部用來的加載的Item,可以看到它是一個ProgressBar。另外可以通過showIndeterminateProgress(boolean)來顯示或者隱藏這個item。
第4行代碼的getAdapterHelper獲取一個BaseAdapterHelper對象,我們可以看到,在BaseQuickAdapter類中,getAdapterHelper是一個抽象函數,所以我們來看看BaseQuickAdapter的子類QuickAdapter,在這個類中它實現了getAdapterHelper方法,執行的實質是BaseAdapterHelper的靜態get方法。另外需要提到的是,QuickAdapter類的構造函數有一個參數為layoutResId,它就是傳入我們要顯示Item的布局文件。
static BaseAdapterHelper get(Context context, View convertView, ViewGroup parent, int layoutId, int position) {
if (convertView == null) {
return new BaseAdapterHelper(context, parent, layoutId, position);
}
// Retrieve the existing helper and update its position
BaseAdapterHelper existingHelper = (BaseAdapterHelper) convertView.getTag();
existingHelper.position = position;
return existingHelper;
}
protected BaseAdapterHelper(Context context, ViewGroup parent, int layoutId, int position) {
this.context = context;
this.position = position;
this.views = new SparseArray();
convertView = LayoutInflater.from(context) //
.inflate(layoutId, parent, false);
convertView.setTag(this);
}
在BaseAdapterHelper的構造函數裡面,定義了一個views,它其實就是傳統Adapter裡面的那個ViewHolder用來存放Item裡面的各個view。convertView為我們要顯示的Item的View,接著通過setTag函數將BaseAdapterHelper對象本身關聯到convertView上面,所以我們知道每個Item對象都關聯了一個BaseAdapterHelper對象。public QuickAdapter(Context context, int layoutResId, List可以看到我們傳入Item布局的layoutResId和要顯示的數據data,data是List類型的。 第6行代碼是將我們向顯示的數據項與BaseAdapterHelper對象關聯起來。data) { super(context, layoutResId, data); }
protected BaseAdapterHelper(Context context, ViewGroup parent, int layoutId, int position) {
this.context = context;
this.position = position;
this.views = new SparseArray();
convertView = LayoutInflater.from(context) //
.inflate(layoutId, parent, false);
convertView.setTag(this);
}

當List向上滑動的時候,第一個Item移出List,底部就需要再顯示一個Item,這個時候getView裡面的convertView就是第一個移出的View,我們可以直接對它重用來顯示下一個Item,核心代碼為:
BaseAdapterHelper existingHelper = (BaseAdapterHelper) convertView.getTag(); existingHelper.position = position;他直接得到BaseAdapterHelper對象,然後重新設置它對應的位置postion,因為BaseAdapterHelper對象中引用到了重用的convertView,這樣就可以直接使用這個view的Item了。 下面來舉個簡單的例子:
public class MainActivity extends AppCompatActivity {
private ListView listView;
private List data = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
data.add("text1");
data.add("text2");
data.add("text3");
data.add("text4");
data.add("text5");
data.add("text6");
listView = (ListView) findViewById(R.id.listview);
QuickAdapter adapter = new QuickAdapter(this, R.layout.item, data) {
@Override
protected void convert(BaseAdapterHelper helper, String item) {
helper.setText(R.id.textView, item);
}
};
listView.setAdapter(adapter);
}
}
仿餓了嗎點餐界面ListView聯動的實現
在上篇文章給大家介紹了仿餓了嗎點餐界面兩個ListView聯動效果主要實現了2個ListView怎樣實現互相關聯,正好上篇博客review了ListView控件常規使用,
Android 屏幕旋轉 處理 AsyncTask 和 ProgressDialog 的最佳方案
1、概述 眾所周知,Activity在不明確指定屏幕方向和configChanges時,當用戶旋轉屏幕會重新啟動。當然了,應對這種情況,Android給
基於Android今日事今日畢的使用介紹
今日事今日畢,這是高效工作的最重原則。沒有什麼能比從待辦事項列表裡劃掉一些條目更讓人覺得舒服的事了。做為一個高效的人,您需要一個優秀的待辦事項管理工具,一個優秀的待辦事項
android性能優化實戰理論篇
第二篇:理論通過之前前篇介紹的工具,我們知道了應該怎麼樣去獲取要分析的數據,但是也僅僅局限在於怎麼樣獲取數據,而沒有深入數據分析,這一篇主要講解的是UI刷新這塊部分and