ListView优化总结(二)--Android

3.使用Activity和Delegate与适配器交互

这个内容是从书里看到的,通过托付模式帮助开发人员把全部的业务逻辑从适配器中移到Activity中。

以下是加入电话号码的样例,列表中每一行都有一个removebutton,用于删除电话号码,在适配器中实现“Remove”button的点击处理器,可是。并不在适配器中实现删除对象的方法,我们通过一个托付接口调用Activity的方法删除对象。

适配器的代码:

public class NumbersAdapter extends ArrayAdapter<Integer> {

public static interface NumbersAdapterDelegate {   //定义托付接口

void removeItem(Integer value);

}

private LayoutInflater mInflator;

private NumbersAdapterDelegate mDelegate;

public NumbersAdapter(Context context, List<Integer> objects) {

super(context, 0, objects);

mInflator = LayoutInflater.from(context);

}

@Override

public View getView(int position, View cv, ViewGroup parent) {

if (null == cv) {

cv = mInflator.inflate(R.layout.number_row, parent, false);

}

final Integer value = getItem(position);

TextView tv = (TextView) cv.findViewById(R.id.numbers_row_text);

tv.setText(value.toString());

View button = cv.findViewById(R.id.numbers_row_button);

button.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

if (null != mDelegate) {

mDelegate.removeItem(value);   //删除对象

}

}

});

return cv;

}

public void setDelegate(NumbersAdapterDelegate delegate) {  //为适配器设置托付对象

mDelegate = delegate;

}

}

Activity的代码:

public class MainActivity extends Activity implements

NumbersAdapter.NumbersAdapterDelegate {        //实现NumbersAdapterDelegate接口

private static final String TAG = MainActivity.class

.getCanonicalName();

private ListView mListView;

private ArrayList<Integer> mNumbers;

private NumbersAdapter mAdapter;

private EditText mEditText;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

mEditText = (EditText) findViewById(R.id.main_edittext);

mListView = (ListView) findViewById(R.id.main_listview);

mNumbers = new ArrayList<Integer>();

mAdapter = new NumbersAdapter(this, mNumbers);

mListView.setAdapter(mAdapter);

}

@Override

protected void onResume() {

super.onResume();

mAdapter.setDelegate(this);   //在onResume方法中注冊托付对象

}

@Override

protected void onPause() {

super.onPause();

mAdapter.setDelegate(null);  //在onPause方法中取消注冊托付对象

}

@Override

public void removeItem(Integer value) {   //从列表中移除指定项,然后通知适配器绑定的数据发生变化

mNumbers.remove(value);

Toast

.makeText(this, "Removed object: " + value, Toast.LENGTH_SHORT)

.show();

mAdapter.notifyDataSetChanged();

}

public void addNumber(View v) {

String value = mEditText.getText().toString().trim();

try {

mNumbers.add(Integer.valueOf(value));

mEditText.setText("");

mAdapter.notifyDataSetChanged();

} catch (NumberFormatException e) {

Log.e(TAG, "Couldn‘t convert to integer the string: " + value);

}

}

}

没有在onCreate方法中设置托付对象,而在onResume方法中设置托付对象。目的是为了确保仅仅在Activity显示在屏幕上的时候才作为托付对象使用。

时间: 2024-10-25 14:14:43

ListView优化总结(二)--Android的相关文章

Android学习笔记二十四之ListView列表视图二

Android学习笔记二十四之ListView列表视图二 前面一篇我们介绍了常用的几种适配器的简单实现和ListView的简单使用,这一篇中,我们介绍一下ListView的优化和一些其它的问题. ListView优化方法一 在ListView中,我们最常用的就是自定义Adapter,在我们自定义Adapter中,需要实现两个比较重要的方法getCount()和getView(),前者是负责计算ListView的总Item数,后者是生成Item,有多少个Item就会调用getView()方法多少次

Android 常驻与很驻型广播的差别,及ListView优化,Android新手基本知识巩固

1.常驻型广播 常驻型广播,当你的应用程序关闭了,假设有广播信息来,你写的广播接收器相同的能接受到. 他的注冊方式就是在你的应用程序中的AndroidManifast.xml进行注冊. 通常说这样的方式是静态注冊 以下是配置样例 2<receiver android:name=".widget.DeskWidgeWeather"> 3<meta-data android:name="android.appwidget.provider" andro

又优化了一下 Android ListView 异步加载图片

写这篇文章并不是教大家怎么样用listview异步加载图片,因为这样的文章在网上已经有很多了,比如这位仁兄写的就很好: http://www.iteye.com/topic/685986 我也是因为看了这篇文章而受到了启发. 先说说这篇文章的优点把,开启线程异步加载图片,然后刷新UI显示图片,而且通过弱引用缓存网络加载的图片,节省了再次连接网络的开销. 这样做无疑是非常可取的方法,但是加载图片时仍然会感觉到轻微的卡屏现象,特别是listview里的item在进行快速滑动的时候. 我找了一下原因,

Android MaoZhuaWeiBo Adapter ListView优化及发送微博 - 4

这一篇主要给大家说说Adapter ListView优化及发送微博,我们都知道Android在一些比较耗内存的类里,为了尽量避免浪费内 存,我们需要对我们的组件之类的进行优化,使其节约不必要的资源浪费 自定义适配器: package com.neweriweibo.adapter; /** * 适配器 * @author Engineer-Jsp * @date 2014.10.28 * */ import java.util.ArrayList; import com.neweriweibo.

Android 学习笔记之十 Listview 优化原理

听到这,大家觉得应该是再熟悉不过了吧,当然或许很多人已经知道 ListView 的优化.我在这里就再详细的讲一遍.顺便让ListView分类显示. 之前咋网上仿照别人写过一个,但是不知道原理, 今天看到了一篇写的不错,收藏了. 先来看看效果: 可以看到数据有100个(0-99),奇数和偶数分类显示,并给每类数据加了一个头 这里写图片描述 可以看到数据有100个(0-99),奇数和偶数分类显示,并给每类数据加了一个头 步骤: ①在布局文件中添加ListView组件 <RelativeLayout

Android 常驻与非常驻型广播的区别,及ListView优化,Android新手基本知识巩固

1.常驻型广播 常驻型广播,当你的应用程序关闭了,如果有广播信息来,你写的广播接收器同样的能接受到, 他的注册方式就是在你的应用程序中的AndroidManifast.xml进行注册.通常说这种方式是静态注册 下面是配置例子 2<receiver android:name=".widget.DeskWidgeWeather"> 3<meta-data android:name="android.appwidget.provider" android

10熟练掌握listview优化

熟练掌握listview优化,获取网络图片异步加载,分批加载,分页显示,图片缓存等优化方式 ListView的工作原理 首先来了解一下ListView的工作原理(可参见http://mobile.51cto.com/abased-410889.htm),如图: ListView 针对每个item,要求 adapter "返回一个视图" (getView),也就是说ListView在开始绘制的时候,系统首先调用getCount()函数,根据他的返回值得到ListView的长度,然后根据这

listView优化以及内存泄露问题

最经开发app使出现了由于ListView产生的内存泄露问题.我们知道内存泄露时很不好的.意味着,代码写的有点失败,需要做些优化改动. 经过这次的教训,以及在网上找了些资料,总结了一下,关于ListView的优化: listview优化问题: 首先,listview必须严格按照convertView及viewHolder格式书写,这样可以基本保证数据最优. 其次,如果自定义Item中有涉及到图片等等的,一定要做图片优化.bitmap释放可以不做. 第三,尽量避免在BaseAdapter中使用st

【转】带checkbox的ListView实现(二)——自定义Checkable控件的实现方法

原文网址:http://blog.csdn.net/harvic880925/article/details/40475367 前言:前一篇文章给大家展示了传统的Listview的写法,但有的时候我们并不想在DataHolder类中加一个标识是否选中的checked的成员变量,因为在项目开发中,大部分的ListItemLayout布局都是大家共用的,有些人根本不需要checkbox控件,所以会在初始化的时候把这个控件给隐藏掉,但我们的DataHolder在构造的时候以及ListItemAdapt

Adaptert Listview 优化

这次是关于Listview的优化的,之前一直采用愚蠢的方式来使用listview,出现的情况就是数据多的话下拉的时候会出现卡顿的情况,内存占用多.所以学习了关于listview的优化,并且这也是普遍使用的方法.我们一般来说创建listview的话更常用的是继承BaseAdapter的方式进行实现,因为这样可以自定义list没一个item的布局,根据程序的需求进行定制,一般来说listview所展示的数据都是比较多的,一般也有比较少的.所以,不对adapter进行优化的话,那么每一次拖动listv