Java泛型應用之打造Android的萬能ViewHolder
在ListView的Adapter中的getView()方法中的繁瑣寫法
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = null;
if (convertView == null) {
convertView = LayoutInflater.from(context)
.inflate(R.layout.item, parent, false);
viewHolder = new ViewHolder();
viewHolder.name = (TextView) convertView.findViewById(R.id.name);
convertView.setTag(viewHolder);
}else{
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.name.setText("sss");
return convertView;
}
private static class ViewHolder
{
TextView name;
}</code></pre>
先了解一下SparseArray
SparseArray(稀疏數組).他是Android內部特有的api,標準的jdk是沒有這個類的.在Android內部用來替代HashMap<Integer,E>這種形式,使用SparseArray更加節省內存空間的使用,SparseArray也是以key和value對數據進行保存的.使用的時候只需要指定value的類型即可.并且key不需要封裝成對象類型.
最后經過優化和簡化后的代碼
- 代碼
/**
- Created by yuandl on 2016-10-13.
*/
import android.util.SparseArray;
import android.view.View;
/**
- 萬能的ViewHolder
*
@author
*/
public class CommonViewHolder {
/**
- @param view 所有緩存View的根View
- @param id 緩存View的唯一標識
@return
*/
public static <T extends View> T get(View view, int id) {
SparseArray<View> viewHolder = (SparseArray<View>) view.getTag();
//如果根view沒有用來緩存View的集合
if (viewHolder == null) {
viewHolder = new SparseArray<View>();
view.setTag(viewHolder);//創建集合和根View關聯
}
View chidlView = viewHolder.get(id);//獲取根View儲存在集合中的孩紙
if (chidlView == null) {//如果沒有改孩紙
//找到該孩紙
chidlView = view.findViewById(id);
viewHolder.put(id, chidlView);//保存到集合
}
return (T) chidlView;
}
}</code></pre>
-
用法(可以看到省去了好多代碼)
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = LayoutInflater.from(context)
.inflate(R.layout.item, parent, false);
}
TextView name= ViewHolder.get(convertView, R.id.name);
name.setText("sss");
return convertView;
}</code></pre> </li>
</ul>
來自:http://www.jianshu.com/p/43d5994e55b6