第一中优化的方法
在Adapter中,以后ViewHolder就调用一下方法
package com.wwl.canvas.adapter; import android.content.Context; import android.util.SparseArray; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; public class ViewHolder { private SparseArray<View> mViews; private int mPositon; private View mConvertView; public ViewHolder(Context context, ViewGroup parent, int layoutId, int position) { this.mPositon = position; this.mViews = new SparseArray<View>(); mConvertView = LayoutInflater.from(context).inflate(layoutId, parent, false); mConvertView.setTag(this); } public static ViewHolder get(Context context, View convertView, ViewGroup parent, int layoutid, int position) { if (convertView == null) { return new ViewHolder(context, parent, layoutid, position); } else { ViewHolder holder = (ViewHolder) convertView.getTag(); holder.mPositon =position; return holder; } } /** * 通过iewId获取控件 * @param viewId * @return */ 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 View getmConvertView() { return mConvertView; } }
然后Adapter继承CommAdapter<T>,如下方法
package com.wwl.canvas.adapter; import java.util.List; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; public abstract class CommonAdapter<T> extends BaseAdapter { protected Context mContext; protected List<T> mDatas; protected LayoutInflater inflater; public CommonAdapter(Context context,List<T> datas){ this.mContext =context; this.mDatas =datas; inflater =LayoutInflater.from(context); } public List<T> getList(){
return mDatas;
}
public void appendToList(List<T> list) {
if (list == null) {
return;
}
mDatas.addAll(list);
notifyDataSetChanged();
}
public void appendToTopList(List<T> list) {
if (list == null) {
return;
}
mDatas.addAll(0, list);
notifyDataSetChanged();
}
public void appendT(T object) {
if (object == null) {
return;
}
mDatas.add(object);
notifyDataSetChanged();
}
public void removeT(T object) {
if (object == null) {
return;
}
mDatas.remove(object);
notifyDataSetChanged();
}
public void clear() {
mDatas.clear();
notifyDataSetChanged();
}
@Override public int getCount() { // TODO Auto-generated method stub return mDatas.size()>0?mDatas.size():0; } @Override public Object getItem(int position) { // TODO Auto-generated method stub return mDatas.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public abstract View getView(int position, View convertView, ViewGroup parent); }
最后查看Adapter中的操作方法:
public class MyAdapter extends CommonAdapter<Bean>{ public MyAdapter(Context context,List<Bean> mDatas) { super(context, mDatas); } @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder = ViewHolder.get(mContext, convertView, parent, R.layout.list_item, position); Bean bean = mDatas.get(position); ((TextView)holder.getView(R.id.id_title)).setText(bean.getTitle()); ((TextView)holder.getView(R.id.id_desc)).setText(bean.getDesc()); ((TextView)holder.getView(R.id.id_time)).setText(bean.getTime()); ((TextView)holder.getView(R.id.id_phone)).setText(bean.getPhone()); return holder.getmConvertView(); } }
第二种优化的方法(在第一种的基础上继续优化)
ViewHolder类:
package com.wwl.canvas.adapter; import com.nostra13.universalimageloader.core.ImageLoader; import android.content.Context; import android.graphics.Bitmap; import android.util.SparseArray; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; public class ViewHolder { private SparseArray<View> mViews; private int mPositon; private View mConvertView; public ViewHolder(Context context, ViewGroup parent, int layoutId, int position) { this.mPositon = position; this.mViews = new SparseArray<View>(); mConvertView = LayoutInflater.from(context).inflate(layoutId, parent, false); mConvertView.setTag(this); } public static ViewHolder get(Context context, View convertView, ViewGroup parent, int layoutid, int position) { if (convertView == null) { return new ViewHolder(context, parent, layoutid, position); } else { ViewHolder holder = (ViewHolder) convertView.getTag(); holder.mPositon =position; return holder; } } public int getPositon() { return mPositon; } /** * 通过iewId获取控件 * @param viewId * @return */ 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 View getmConvertView() { return mConvertView; } /** * 如果Adapter是TextView ,设置TextView的值 * @param viewId * @param text * @return */ public ViewHolder setText(int viewId,String text){ TextView tv =getView(viewId); tv.setText(text); return this; } /** * 如果Adapter是ImageView ,设置图片1111111 * @param viewId * @param text * @return */ public ViewHolder setImageResource(int viewId,int resId){ ImageView view =getView(viewId); view.setImageResource(resId); return this; } /** * 如果Adapter是ImageView ,设置图片22222 * @param viewId * @param text * @return */ public ViewHolder setImageBitmap(int viewId,Bitmap bitmap){ ImageView view =getView(viewId); view.setImageBitmap(bitmap); return this; } /** * 如果Adapter是ImageView ,设置图片33333 * @param viewId * @param text * @return */ public ViewHolder setImageURL(int viewId,String url){ ImageView view =getView(viewId); ImageLoader.getInstance().displayImage(url,view); return this; } }
CommAdapter类:
package com.xyrr.android.adapter; import java.util.List; public abstract class CommonAdapter<T> extends BaseAdapter { protected Context mContext; protected List<T> mDatas; protected LayoutInflater inflater; protected int layoutId; public CommonAdapter(Context context,List<T> datas,int layoutId){ this.mContext =context; this.mDatas =datas; this.layoutId =layoutId; inflater =LayoutInflater.from(context); } public List<T> getList() { return mDatas; } public void appendToList(List<T> list) { if (list == null) { return; } mDatas.addAll(list); notifyDataSetChanged(); } public void appendToTopList(List<T> list) { if (list == null) { return; } mDatas.addAll(0, list); notifyDataSetChanged(); } public void appendT(T object) { if (object == null) { return; } mDatas.add(object); notifyDataSetChanged(); } public void removeT(T object) { if (object == null) { return; } mDatas.remove(object); notifyDataSetChanged(); } public void clear() { mDatas.clear(); notifyDataSetChanged(); } @Override public int getCount() { // TODO Auto-generated method stub return mDatas.size()>0?mDatas.size():0; } @Override public T getItem(int position) { // TODO Auto-generated method stub return mDatas.get(position); } @Override public long getItemId(int position) { // TODO Auto-generated method stub return position; } @Override public View getView(int position, View convertView, ViewGroup parent){ ViewHolders holder = ViewHolders.get(mContext, convertView, parent, layoutId, position); convert(holder, getItem(position)); return holder.getmConvertView(); }; public abstract void convert(ViewHolders holder,T t); }
MyAdapter类:
package com.wwl.canvas.adapter; import java.util.List; import android.content.Context; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.wwl.canvas.R; import com.wwl.canvas.view.Bean; public class MyAdapter extends CommonAdapter<Bean> { public MyAdapter(Context context, List<Bean> mDatas) { super(context, mDatas,R.layout.list_item); } @Override public void convert(ViewHolder holder, Bean bean) { holder.setText(R.id.id_title, bean.getTitle()) .setText(R.id.id_desc, bean.getDesc()) .setText(R.id.id_time, bean.getTime()) .setText(R.id.id_phone, bean.getPhone()); // ((TextView)holder.getView(R.id.id_title)).setText(bean.getTitle()); // ((TextView)holder.getView(R.id.id_desc)).setText(bean.getDesc()); // ((TextView)holder.getView(R.id.id_time)).setText(bean.getTime()); // ((TextView)holder.getView(R.id.id_phone)).setText(bean.getPhone()); } }
Bean类:
package com.wwl.canvas.view; import java.io.Serializable; public class Bean implements Serializable{ /** * */ private static final long serialVersionUID = 1L; private String title; private String desc; private String time; private String phone; private boolean isChecked; public boolean isChecked() { return isChecked; } public void setChecked(boolean isChecked) { this.isChecked = isChecked; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getDesc() { return desc; } public void setDesc(String desc) { this.desc = desc; } public String getTime() { return time; } public void setTime(String time) { this.time = time; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } }
MainActivity类实现:
package com.wwl.canvas; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.graphics.Bitmap; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.CheckBox; import android.widget.ListView; import com.nostra13.universalimageloader.core.DisplayImageOptions; import com.wwl.canvas.adapter.CommonAdapter; import com.wwl.canvas.adapter.ViewHolder; import com.wwl.canvas.view.Bean; public class MainActivity extends Activity { DisplayImageOptions options; private ListView listview; private List<Bean> mDatas; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // mLuckyPan =new CanvasDemo(this); // setContentView(mLuckyPan); setContentView(R.layout.activity_main); options = new DisplayImageOptions.Builder() .showImageOnLoading(R.drawable.ic_launcher) .showImageForEmptyUri(R.drawable.ic_launcher) .showImageOnFail(R.drawable.ic_launcher).cacheInMemory(true) .cacheOnDisc(true).bitmapConfig(Bitmap.Config.RGB_565).build(); listview =(ListView) findViewById(R.id.id_list); getDatas(); listview.setAdapter(new CommonAdapter<Bean>(MainActivity.this,mDatas,R.layout.list_item) { private List<Integer> mPos = new ArrayList<Integer>(); @Override public void convert(final ViewHolder holder, final Bean bean) { // TODO Auto-generated method stub holder.setText(R.id.id_title, bean.getTitle()) .setText(R.id.id_desc, bean.getDesc()) .setText(R.id.id_time, bean.getTime()) .setText(R.id.id_phone, bean.getPhone()); final CheckBox cb = holder.getView(R.id.id_cb); //第一种方法在bean中添加boolean类型的值,然后用cb.setChecked(bean.isChecked());以及点击的时候bean.setChecked(cb.isChecked());就可以了 // cb.setChecked(bean.isChecked()); //第二种方法:在adapter中获取mPosition的get方法。然后下面这个方法OK了 cb.setChecked(false); if (mPos.contains(holder.getPositon())) { cb.setChecked(true); } cb.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // bean.setChecked(cb.isChecked()); if (cb.isChecked()) { mPos.add(holder.getPositon()); }else{ mPos.remove((Integer)holder.getPositon()); } } }); } }); } private void getDatas() { mDatas = new ArrayList<Bean>(); for (int i = 0; i < 15; i++) { Bean mBean =new Bean(); mBean.setTitle("标题----"+(i+1)); mBean.setDesc("正文----"+(i+1)); mBean.setTime("时间----"+(i+1)); mBean.setPhone("电话----"+(i+1)); mDatas.add(mBean); } } }
list_item布局:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:descendantFocusability="blocksDescendants" android:orientation="vertical" > <CheckBox android:id="@+id/id_cb" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:layout_alignParentRight="true"/> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:id="@+id/id_title" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="标题。。。。。。。。。。"/> <TextView android:id="@+id/id_desc" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="正文"/> <TextView android:id="@+id/id_time" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="时间。。。。。。。。。。"/> <TextView android:id="@+id/id_phone" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="电话号码。。。。。。。。。。"/> </LinearLayout> </RelativeLayout>
相关推荐
当适配器(Adapter)创建一个新视图时,会调用ViewHolder的构造函数来初始化这些引用。在`getView()`方法(对于旧版的ListView)或`onBindViewHolder()`方法(对于RecyclerView)中,我们会使用ViewHolder来更新视图...
ViewHolder模式的核心思想是减少 findViewById() 方法的调用,因为这个方法在布局复用时会产生较大的性能开销。通过创建一个ViewHolder类,持有UI组件的引用,可以在需要更新视图时快速访问,避免频繁查找视图对象,...
ViewHolder模式是由Android开发团队提出的,它的核心思想是减少findViewById()方法的调用次数,因为这个方法在运行时会消耗一定的时间。在ListView中,每次滚动时,系统会复用已创建但不再显示的View,如果不使用...
ListView的高效渲染主要依赖于适配器(Adapter)机制,而ListViewAdapter和ViewHolder是实现这一机制的关键部分。本压缩包“listview适配器 ListViewAdapter和ViewHolder代码.rar”提供了一个简单的使用示例,帮助...
通常情况下,我们会在Adapter的getView方法中创建一个新的ViewHolder对象,然后绑定数据。然而,这样的写法可能会导致大量的对象创建,影响性能。现在,我们将介绍一种简洁的实现方式,利用SparseArray来存储并重用...
在适配器的`onCreateViewHolder`和`onBindViewHolder`方法中,我们分别创建和绑定ViewHolder对象,这样可以减少因频繁调用findViewById()方法导致的性能损耗。 ### ViewHolder的创建 1. **创建ViewHolder类**:...
ViewHolder设计模式的核心思想是减少findViewById()方法的调用,提升ListView滚动时的性能。当ListView滚动时,如果复用已有的convertView(列表项视图),而不需要每次都重新创建和绑定数据,就能显著减少内存分配...
ViewHolder模式的基本思想是缓存视图对象的引用,避免在每次getView()方法调用时查找对应的视图。这样,当数据绑定到视图时,可以直接使用已经缓存的视图对象,减少了大量的findViewById()操作,从而提高效率。 ...
2. Adapter:Adapter是连接数据源和RecyclerView的桥梁,负责填充ViewHolder并决定何时显示哪个数据。 3. LayoutManager:负责布局管理,如线性布局(LinearLayoutManager)、网格布局(GridLayoutManager)或瀑布...
它的核心组成部分包括`LayoutManager`、`Adapter`和`ViewHolder`。 1. **LayoutManager**:负责布局和滚动策略,如线性布局(LinearLayoutManager)、网格布局(GridLayoutManager)和瀑布流布局...
在没有使用`ViewHolder`的情况下,每次`getView()`被调用时,都需要通过`findViewById()`方法找到对应的UI元素,这会消耗大量的时间和CPU资源。当列表滚动时,频繁的`getView()`调用会导致性能下降,界面滚动变得...
2. **设置Adapter**:将Adapter设置到对应的AdapterView,如ListView或RecyclerView,通过调用`setAdapter(Adapter adapter)`方法。 3. **实现数据绑定**:在Adapter的`getView()`方法中,将数据项与视图元素进行...
在Adapter中,我们需要重写`getCount()`、`getItem()`、`getItemId()`和`getView()`方法。`getView()`方法是关键,它负责将数据转化为视图。 3. **数据源**:数据源可以是ArrayList、ArrayAdapter或其他集合类。...
1. **数据模型类**:定义列表项的数据结构,例如`DataModel`类,它可能包含各种属性和方法。 2. **ViewHolder**:继承自RecyclerView的`ViewHolder`类,负责绑定数据到布局的各个视图元素。创建一个泛型ViewHolder...
" 暗示了一个开源项目,它可能针对Android开发中的数据绑定技术,避免使用传统的ViewHolder和Adapter模式。在这个项目中,开发者可能提出了新的解决方案来简化列表或者网格视图的数据展示。下面将详细讨论相关知识点...
比如,如果列表项包含一个按钮,我们可以在ViewHolder中创建一个方法来设置按钮的点击事件,并在onBindViewHolder()中调用这个方法。这样,当用户点击按钮时,对应的回调方法会被触发。 筛选点击事件通常涉及到对...
当数据源发生变化时,调用Adapter的`notifyDataSetChanged()`或`notifyItemInserted/Removed/Changed()`方法通知RecyclerView更新。 优化方面,RecyclerView提供了多种优化手段: 1. 使用ViewHolder:ViewHolder...
3. **更新Adapter**:在Adapter中,根据传入的数据类型动态创建对应的ViewHolder实例,然后调用其`bindData()`方法填充数据。 ```java public class LowCouplingAdapter extends RecyclerView.Adapter...