androidlistviewAndroid中ListView的几种常见的优化方法是什么?
androidlistview 时间:2021-06-17 阅读:(
)
android 怎么显示listview中
public List findAllDate(){//我的一个方法 List list = new ArrayList(); SQLiteDatabase database = dbopenhelper.getWritableDatabase(); Cursor cursor = database.rawQuery("select date from health", new String[]{});//这边写上你的查询语句 while(cursor.moveToNext()){ list.add(cursor.getString(0)); } cursor.close(); database.close(); return list; } 之后就是把这个LIST显示在iew中; 如:SimpleAdapter adapter=new SimpleAdapter(iew.this,list ,R.layout.viewdate,new String[]{"date"}, new int[]{R.id.tdate}); iew.setAdapter(adapter); iew.setOnItemClickListener(new AdapterView.OnItemClickListener() { //事件 public void onItemClick(AdapterView> arg0, View arg1, int position, long arg3) { .... } }); 希望对你有用android ListView用法和属性
ListView是一个用来纵向显示条目的视图,这些条目内容来自于与该ListView相关联的ListAdapter.
android:divider//在列表条目之间显示的drawable或color
android:dividerHeight//用来指定divider的高度
android:entries//构成ListView的数组资源的引用。
对于某些固定的资源,这个属性提供了比在程序中添加资源更加简便的方式
android:footerDividersEnabled//当设为false时,ListView将不会在各个footer之间绘制divider.默认为true。
android:headerDividersEnabled//当设为false时,ListView将不会在各个header之间绘制divider.默认为true
android:cacheColorHint// 表明这个列表的背景始终以单一、固定的颜色绘制,可以优化绘制过程。
android:choiceMode//为视图指定选择的行为。
可选的类型有:none、singleChoice、multipleChoice、multipleChoiceModal。
android:drawSelectorOnTop// 若设为true,选择器将绘制在选中条目的上层。
默认为false。
android:fastScrollEnabled// 设置是否允许使用快速滚动滑块。
android:addStatesFromChildren// 设置这个ViewGroup的drawable状态是否包括子View的状态。
若设为true,当子View如EditText或Button获得焦点时,整个ViewGroup也会获得焦点。
android:alwaysDrawnWithCache// 设置ViewGroup在绘制子View时是否一直使用绘图缓存。
默认为true。
android:animationCache// 设置布局在绘制动画效果时是否为其子View创建绘图缓存。
若设为true,将会消耗更多的内存,要求持续时间更久的初始化过程,但表现更好。
默认为true。
android:clipChildren// 设置子View是否受限于在自己的边界内绘制。
若设为false,当子View所占用的空间大于边界时可以绘制在边界外。
默认为true。
android:clipToPadding//定义布局间是否有间距。
默认为true。
android:descendantFocusability// 定义当寻找一个焦点View的时候,ViewGroup与其子View之间的关系。
可选项为:
//(1)beforeDescendants ViewGroup会比其子View更先获得焦点;
//(2)afterDescendants 只有当无子View想要获取焦点时,ViewGroup才会获取焦点;
//(3)blockDescendants ViewGroup会阻止子View获取焦点
android:layoutAnimation//定义当ViewGroup第一次展开时的动画效果,也可人为地在第一次展开后调用。
android:persistentDrawingCache// 定义绘图缓存的持久性。
有如下可选项:
//(1)none 当使用过后不保留绘图缓存
//(2)animation 在layout animation之后保留绘图缓存
//(3)scrolling 在Scroll操作后保留绘图缓存
//(4)all always保留绘图缓存
android:listSelector// 设置选中项显示的可绘制对象,可以是图片或者颜色属性。
android:scrollingCache// 设置在滚动时是否使用绘制缓存。
若设为true,则将使滚动表现更快速,但会占用更内存。
默认为true。
android:smoothScrollbar// 为真时,列表会使用更精确的基于条目在屏幕上的可见像素高度的计算方法。
默认该属性为真,如果你的适配器需要绘制可变高的条目,他应该设为假。
当该属性为真时,你在适配器在显示变高条目时,滚动条的把手会在滚动的过程中改变大小。
当设为假时,列表只使用适配器中的条目数和屏幕上的可见条目来决定滚动条的属性。
android:stackFromBottom// 设置GridView和ListView是否将内容从底部开始显示。
android:textFilterEnabled// 当设为真时,列表会将结果过滤为用户类型。
前提是这个列表的Adapter必须支持Filterable接口。
android:transcriptMode//设置列表的transcriptMode.有如下选项可选:
//(1)disabled 禁用TranscriptMode,也是默认值;
//(2)normal 当新条目添加进列表中并且已经准备好显示的时候,列表会自动滑动到底部以显示最新条目;
//(3)alwaysScroll 列表会自动滑动到底部,无论新条目是否已经准备好显示.
目前推荐用的是 RecycleView如何实现 Android ListView
.test;
import android.app.ListActivity;
import android.os.Bundle;
import android.os.Handler;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.LinearLayout.LayoutParams;
public class test extends ListActivity implements OnScrollListener {
Aleph0 adapter = new Aleph0();
int lastItem = 0;
int mProgressStatus = 0;
private Handler mHandler = new Handler();
ProgressBar progressBar;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LinearLayout searchLayout = new LinearLayout(this);
searchLayout.setOrientation(LinearLayout.HORIZONTAL);
progressBar = new ProgressBar(this);
progressBar.setPadding(0, 0, 15, 0);
searchLayout.addView(progressBar, new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT));
TextView textView = new TextView(this);
textView.setText("加载中...");
textView.setGravity(Gravity.CENTER_VERTICAL);
searchLayout.addView(textView, new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.FILL_PARENT,
LinearLayout.LayoutParams.FILL_PARENT));
searchLayout.setGravity(Gravity.CENTER);
LinearLayout loadingLayout = new LinearLayout(this);
loadingLayout.addView(searchLayout, new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT));
loadingLayout.setGravity(Gravity.CENTER);
getListView().addFooterView(loadingLayout);
// Start lengthy operation in a background thread
// new Thread(new Runnable() {
// public void run() {
// while (mProgressStatus < 100) {
//
// // Update the progress bar
// mHandler.post(new Runnable() {
// public void run() {
// progressBar.setProgress(mProgressStatus);
// }
// });
// }
// }
// }).start();
registerForContextMenu(getListView());
setListAdapter(adapter);
getListView().setOnScrollListener(this);
}
public void onScroll(AbsListView v, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
//lastItem = firstVisibleItem + visibleItemCount - 1;
//System.out.println("lastItem:" + lastItem);
}
public void onScrollStateChanged(AbsListView v, int state) {
// if (lastItem == adapter.count
// && state == OnScrollListener.SCROLL_STATE_IDLE) {
// adapter.count += 10;
// adapter.notifyDataSetChanged();
// }
if (state == OnScrollListener.SCROLL_STATE_IDLE) {
adapter.count += 10;
adapter.notifyDataSetChanged();
}
}
class Aleph0 extends BaseAdapter {
int count = 10;
public int getCount() {
return count;
}
public Object getItem(int pos) {
return pos;
}
public long getItemId(int pos) {
return pos;
}
public View getView(int pos, View v, ViewGroup p) {
TextView view = new TextView(test.this);
view.setText("entry " + pos);
view.setHeight(90);
return view;
}
}
}Android中ListView的几种常见的优化方法是什么?
Android中的ListView应该算是布局中几种最常用的组件之一了,使用也十分方便,下面将介绍ListView几种比较常见的优化方法:
首先我们给出一个没有任何优化的iew的Adapter类,我们这里都继承自BaseAdapter,这里我们使用一个包含100个字符串的List集合来作为ListView的项目所要显示的内容,每一个条目都是一个自定义的组件,这个组件中只包含一个iew:
Activity:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
iewoptimize;
importjava.util.ArrayList;
importjava.util.List;
importandroid.app.Activity;
importandroid.os.Bundle;
importandroid.view.Menu;
importandroid.view.MenuItem;
importandroid.view.View;
importandroid.view.ViewGroup;
importandroid.widget.BaseAdapter;
importandroid.widget.ListView;
importandroid.widget.TextView;
lassMainActivity extendsActivity {
privateListView lv_demo;
privateList list;
@Override
protectedvoidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv_demo = (ListView) findViewById(R.id.lv_demo);
//list为要加载的条目文本的集合,这里总共是100条
list = newArrayList();
for(inti = 0; i < 100; i++) {
list.add("条目"+ i);
}
lv_demo.setAdapter(newMyAdapter());
}
privateclassMyAdapter extendsBaseAdapter {
@Override
publicintgetCount() {
returnlist.size();
}
@Override
publicView getView(intposition, View convertView, ViewGroup parent) {
//iew_item里只有一个iew
View view = View.inflate(MainActivity.this, iew_item, null);
//使用每一次都findviewById的方法来获得iew_item内部的组件
_item = (TextView) view.findViewById(_item);
_item.setText(list.get(position));
returnview;
}
@Override
publicObject getItem(intposition) {
returnnull;
}
@Override
publiclonggetItemId(intposition) {
return0;
}
}
}
优化一:
也是最普通的优化,就在MyAdapter类中的getView方法中,我们注意到,上面的写法每次需要一个View对象时,都是去重新inflate一个View出来返回去,没有实现View对象的复用,而实际上对于ListView而言,只需要保留能够显示的最大个数的view即可,其他新的view可以通过复用的方式使用消失的条目的view,而getView方法里也提供了一个参数:convertView,这个就代表着可以复用的view对象,当然这个对象也可能为空,当它为空的时候,表示该条目view第一次创建,所以我们需要inflate一个view出来,所以在这里,我们使用下面这种方式来重写getView方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
iewoptimize;
importjava.util.ArrayList;
importjava.util.List;
importandroid.app.Activity;
importandroid.os.Bundle;
importandroid.view.Menu;
importandroid.view.MenuItem;
importandroid.view.View;
importandroid.view.ViewGroup;
importandroid.widget.BaseAdapter;
importandroid.widget.ListView;
importandroid.widget.TextView;
lassMainActivity extendsActivity {
privateListView lv_demo;
privateList list;
@Override
protectedvoidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv_demo = (ListView) findViewById(R.id.lv_demo);
//list为要加载的条目文本的集合,这里总共是100条
list = newArrayList();
for(inti = 0; i < 100; i++) {
list.add("条目"+ i);
}
lv_demo.setAdapter(newMyAdapter());
}
privateclassMyAdapter extendsBaseAdapter {
@Override
publicintgetCount() {
returnlist.size();
}
@Override
publicView getView(intposition, View convertView, ViewGroup parent) {
//iew_item里只有一个iew
View view = View.inflate(MainActivity.this, iew_item, null);
//使用每一次都findviewById的方法来获得iew_item内部的组件
_item = (TextView) view.findViewById(_item);
_item.setText(list.get(position));
returnview;
}
@Override
publicObject getItem(intposition) {
returnnull;
}
@Override
publiclonggetItemId(intposition) {
return0;
}
}
}
优化二:
上面是对view对象的复用做的优化,我们经过上面的优化之后,我们不需要每一个view都重新生成了。
下面我们来解决下一个每一次都需要做的工作,那就是view中组件的查找:
_item = (TextView) view.findViewById(_item);
实际上,findViewById是到xml文件中去查找对应的id,可以想象如果组件多的话也是挺费事的,如果我们可以让view内的组件也随着view的复用而复用,那该是多美好的一件事啊。
。
实际上谷歌也推荐了一种优化方法来做应对,那就是重新建一个内部静态类,里面的成员变量跟view中所包含的组件个数类型相同,我们这里的view只包含了一个TextView,所以我们的这个静态类如下:
1
2
3
lassViewHolder {
Holder;
}
那么这个viewHolder类我们要如何使用才可以达到复用效果呢?基本思路就是在convertView为null的时候,我们不仅重新inflate出来一个view,并且还需要进行findviewbyId的查找工作,但是同时我们还需要获取一个ViewHolder类的对象,并将findviewById的结果赋值给ViewHolder中对应的成员变量。
最后将holder对象与该view对象“绑”在一块。
当convertView不为null时,我们让view=converView,同时取出这个view对应的holder对象,就获得了这个view对象中的TextView组件,它就是holder中的成员变量,这样在复用的时候,我们就不需要再去findViewById了,只需要在最开始的时候进行数次查找工作就可以了。
这里的关键在于如何将view与holder对象进行绑定,那么就需要用到两个方法:setTag和getTag方法了:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Override
publicView getView(intposition, View convertView, ViewGroup parent) {
View view;
ViewHolder holder;
// 判断convertView的状态,来达到复用效果
if(null== convertView) {
// 如果convertView为空,则表示第一次显示该条目,需要创建一个view
view = View.inflate(MainActivity.this, iew_item, null);
//新建一个viewholder对象
holder = newViewHolder();
//将findviewbyID的结果赋值给holder对应的成员变量
Holder = (TextView) view.findViewById(_item);
// 将holder与view进行绑定
view.setTag(holder);
} else{
// 否则表示可以复用convertView
view = convertView;
holder = (ViewHolder) view.getTag();
}
// 直接操作holder中的成员变量即可,不需要每次都findViewById
Holder.setText(list.get(position));
returnview;
}
经过上面的做法,可能大家感觉不太到优化的效果,根据Google的文档,实际优化效果在百分之5左右。
优化三:
上面的两个例子中ListView都是显示的本地的List集合中的内容,List的长度也只有100个,我们可以毫不费力一次性加载完这100个数据;但是实际应用中,我们往往会需要使用iew来显示网络上的内容,比如说我们拿使用ListView显示新闻为例:
其一:假如网络情况很好,我们使用的手机也许能够一下子加载完所有新闻数据,然后显示在ListView中,用户可能感觉还好,假如说在网络不太顺畅的情况下,用户加载完所有网络的数据,可能这个list是1000条新闻,那么用户可能需要面对一个空白的Activity好几分钟,这个显然是不合适的
其二:我们知道Android虚拟机给每个应用分配的运行时内存是一定的,一般性能不太好的机器只有16M,好一点的可能也就是64M的样子,假如说我们现在要浏览的新闻总数为一万条,即便是网络很好的情况下,我们可以很快的加载完毕,但是多数情况下也会出现内存溢出从而导致应用崩溃的情况。
那么为了解决上面的两个问题,我们需要进行分批加载,比如说1000条新闻的List集合,我们一次加载20条,等到用户翻页到底部的时候,我们再添加下面的20条到List中,再使用Adapter刷新ListView,这样用户一次只需要等待20条数据的传输时间,不需要一次等待好几分钟把数据都加载完再在ListView上显示。
其次这样也可以缓解很多条新闻一次加载进行产生OOM应用崩溃的情况。
实际上,分批加载也不能完全解决问题,因为虽然我们在分批中一次只增加20条数据到List集合中,然后再刷新到ListView中去,假如有10万条数据,如果我们顺利读到最后这个List集合中还是会累积海量条数的数据,还是可能会造成OOM的情况,这时候我们就需要用到分页,比如说我们将这10万条数据分为1000页,每一页100条数据,每一页加载时都覆盖掉上一页中List集合中的内容,然后每一页内再使用分批加载,这样用户的体验就会相对好一些。
目前在标准互联这边有两台香港云服务器产品,这不看到有通知到期提醒才关注到。平时我还是很少去登录这个服务商的,这个服务商最近一年的促销信息比较少,这个和他们的运营策略有关系。已经从开始的倾向低价和个人用户云服务器市场,开始转型到中高端个人和企业用户的独立服务器。在这篇文章中,有看到标准互联有推出襄阳电信高防服务器100GB防御。有三款促销方案我们有需要可以看看。我们看看几款方案配置。型号内存硬盘IP...
hostkey应该不用说大家都是比较熟悉的荷兰服务器品牌商家,主打荷兰、俄罗斯机房的独立服务器,包括常规服务器、AMD和Intel I9高频服务器、GPU服务器、高防服务器;当然,美国服务器也有,在纽约机房!官方网站:https://hostkey.com/gpu-dedicated-servers/比特币、信用卡、PayPal、支付宝、webmoney都可以付款!CPU类型AMD Ryzen9 ...
易探云怎么样?易探云是国内一家云计算服务商家,致力香港服务器、国内外服务器租用及托管等互联网业务,目前主要地区为运作香港BGP、香港CN2、广东、北京、深圳等地区。易探云服务器均选择当下热门线路,比如CN2 GIA、BGP线路、CN2线路等,所有云主机支持月付,并且首月优惠,年付优惠,优惠后香港沙田云服务器/独立ip/香港CN2线路,每月仅18元,188元/年。点击进入:易探云官方网站地址1、香港...
androidlistview为你推荐
youtube创始人李开复的创新工场是做什么的啊???各大网站有没有很好玩的网站啊avc是什么格式格式工厂转的[AS3 720 AVC]mp4是什么格式pat是什么格式如何把JPG图片变为PAT格式图片?java程序员招聘为什么Java程序员工资都很高gas是什么意思gc是什么意思啊?gbk内码高考姓名gbk内码查询gbk内码Gbk内码查询particular教程如何用AE做出花瓣从身体变出来的特效particular教程AE的particular的particle设置
国内ip代理 a5域名交易 warez 东莞电信局 腾讯云盘 cpanel主机 12306抢票攻略 sub-process http500内部服务器错误 xen 免费静态空间 轻量 mysql主机 dd444 godaddy域名证书 佛山高防服务器 美国免费空间 电信虚拟主机 metalink 卡巴斯基破解版 更多