listView 在每次仅绘制可视范围内的item,这样当你滚动listview的实际上他是动态加载的。
避免listView滚动刷新getView,所以就需要缓存ListView 中item中的view。
具体实现如下:
定义ViewCache
import android.view.View;
public class ViewCache {
private View baseView;
public ViewCache() {
}
public ViewCache(View baseView) {
this.baseView = baseView;
}
public View getBaseView() {
return baseView;
}
public void setBaseView(View baseView) {
this.baseView = baseView;
}
}
定义ListAdapter
import java.util.List;
import org.json.JSONArray;
import org.json.JSONException;
import com.Practice.ui.R;
import com.Practice.util.ViewCache;
import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;
public class ListAdapter extends BaseAdapter {
private ListView listView;
private LayoutInflater mInflater;
private List list;
public static final String TAG = "ListAdapter";
public ListAdapter(Context paramContext, ListView paramListView,
List paramList) {
listView = paramListView;
list = paramList;
mInflater = (LayoutInflater) paramContext
.getSystemService("layout_inflater");
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return list.get(position).getId();
}
@Override
public View getView(int position, View view, ViewGroup parent) {
ViewCache viewCache = new ViewCache();
JSONArray positionArray;
if (view != null) {
// 使用缓存获取view
viewCache = (ViewCache) view.getTag();
view = viewCache.getBaseView();
Log.i(TAG, "使用viewCache");
} else {
view = mInflater.inflate(R.layout.item, null);
//设置缓存
viewCache.setBaseView(view);
//设置view 的tag为viewCache
view.setTag(viewCache);
Log.i(TAG, "创建view");
}
return view;
}
}
分享到:
相关推荐
当一个View滚动出可视区域,系统会将其保存在一个缓存队列中,当需要新的View时,首先查看这个队列,如果存在可复用的View,就直接取出并进行数据更新,而不是新建View。这种机制使得ListView即使在处理大量数据时也...
6. **优化滚动性能**:ListView在滚动时,可以复用已创建的View,所以需要确保在getView方法中正确处理图片加载状态,避免重复加载和内存泄漏。 此外,为了进一步提高性能,还可以考虑以下优化措施: - 使用高效的...
ListView的工作流程可以这样描述:它维护了一个叫做`convertView`的缓存,当需要绘制一个新的item时,首先检查缓存中是否有可用的View。如果有,就直接拿来使用,调整其内容以匹配新的数据;如果没有,才会创建一个...
本资料包“安卓listview相关相关-listview获取网络图片缓存优化.zip”主要探讨的就是如何在ListView中高效地加载和缓存网络图片。 首先,我们需要理解ListView的工作机制。ListView通过复用convertView(即...
在Android开发中,ListView是一种常用的组件,用于展示可滚动的多行数据列表。要改变ListView选中行的字体颜色和图片,我们需要理解ListView的工作原理,以及如何自定义其Adapter和视图。以下是一些关键知识点的详细...
ViewHolder缓存了ListView项视图中的子View引用,避免频繁的findViewById()操作: ```java @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder viewHolder; if ...
比如,它可能包含了一个自定义的ListView适配器,适配器内部有一个专门处理图片加载的类,这个类负责从网络获取图片,将其缩放并存储到内存缓存中,然后在主线程中更新UI。 总之,"ListView利用内存缓存异步加载...
在本项目中,"listview的上拉加载下拉刷新+本地缓存+简单的头尾布局"是一个典型的移动应用功能实现,涉及到的技术点主要包括以下几个方面: 1. 上拉加载与下拉刷新:这是移动应用中常用的功能,提升用户体验,让...
但是,VideoView在ListView中可能会遇到播放卡顿、内存泄漏等问题,因为它会在内存中缓存所有视图。因此,更推荐使用ExoPlayer,这是一个由Google开发的高性能、灵活的媒体播放库。ExoPlayer支持多种格式的音频和...
在`ListViewDemo缓存`这个项目中,我们可能看到以下文件: 1. `ListViewDemo.java`:主Activity,包含ListView的初始化和Adapter的设置。 2. `ListAdapter.java`:自定义的Adapter,实现了View Holder模式,并处理...
2. **View Holder模式**:这是一种设计模式,通过在ListView的视图中保存数据的引用,减少查找子视图的时间。在`getView()`中,我们先检查ViewHolder是否已经存在,如果存在就直接使用,否则创建新的ViewHolder并...
在res/layout目录下创建一个新的布局文件(如item_list_radio.xml),该文件将定义ListView每行的视图。在这个布局中,除了其他视图元素,我们将包含一个RadioButton。例如: ```xml android:layout_width=...
Adapter是连接ListView和数据源的关键,它负责创建View并填充数据。在这个Demo中,Adapter可能已经实现了对不同类型的条目进行适配,展示了如何动态地组合视图元素。 6. **性能优化**: 除了LruCache,还有其他...
在Android开发中,ListView是一种非常常见且重要的组件,它用于展示大量的列表数据。"ListView实现动态加载"这个主题,涉及到的是如何高效地处理大量数据并根据用户滚动时动态加载更多内容的技术。动态加载通常用于...
- 父ListView的适配器需要为每一项数据创建一个View,这个View中包含了一个子ListView。因此,你需要创建一个自定义的View类,比如`NestedListViewItem`,在这个View中初始化并设置子ListView。 - 子ListView的...
ViewHolder是一个简单的类,用于存储ListView项View的引用,这样在填充数据时就可以直接访问已缓存的View,而无需每次都查找。 最后,如果需要在滑动过程中执行其他操作,如加载更多数据或执行动画,可以在...
- **ViewHolder模式**: 为了进一步提升性能,可以采用ViewHolder模式,将GridView中的单元格视图缓存起来,避免频繁的findViewById操作。 - **异步加载数据**: 如果数据量大,可以考虑使用异步加载策略,如AsyncTask...