A. android list怎么缓存
要想优化ListView首先要了解它的工作原理,列表的显示需要三个元素:ListView、Adapter、显示的数据;
这里的Adapter就是用到了适配器模式,不管传入的是什么View在ListView中都能显示出来。
下面简单说下上图的原理:
1、如果你有几千几万甚至更多的选项(item)时,其中只有可见的项目(满屏显示的Item数目)存在内存(说的优化就是说在内存中的优化!)中,其他的在Recycler中
2、ListView先请求一个type1视图(getView)然后请求其他可见的项目。convertView在getView中是空(null)的,第一次都是为空的,只要显示过了convertView都不为空,会保存在Recycler中
3、当item1滚出屏幕,并且一个新的项目从屏幕低端上来时,ListView再请求一个type1视图。convertView此时不是空值了,它的值是item1。你只需设定新的数据然后返回convertView,不必重新创建一个视图,省去了inflate和findViewById的时间,性能就得到了优化。
AneData全能文件恢复,超强数据恢复工具 硬盘移动硬盘SD卡U盘相机手机内存卡全支持
查 看
了解了它的工作原理后,我们就可以重复利用convertView,只要不为空就直接使用,改变它的内容就行了。
使用ListView的时候都会搭配一个Adapter,为了使得性能更优,ListView会缓存行item(某行对应的View)。ListView通过Adapter的getView函数获得每行的item。
更多问题解决办法请参考android学习手册,例子、源码、文档全部搞定,采用androidstudo的目录结构,360手机助手中下载。
java">packagecom.dzt.listviewdemo;
importjava.util.ArrayList;
importandroid.app.Activity;
importandroid.content.Context;
importandroid.os.Bundle;
importandroid.view.LayoutInflater;
importandroid.view.View;
importandroid.view.ViewGroup;
importandroid.widget.BaseAdapter;
importandroid.widget.ImageView;
importandroid.widget.ListView;
importandroid.widget.TextView;
{
privateListAdapteradapter;
privateListViewlv=null;
privateArrayList<string>list=newArrayList<string>();
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv=(ListView)findViewById(R.id.lv_list);
adapter=newListAdapter();
for(inti=0;i<100;i++){
list.add(item+i);
}
lv.setAdapter(adapter);
}
{
;
ListAdapter(){
mInflater=(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
publicintgetCount(){
//TODOAuto-generatedmethodstub
returnlist.size();
}
@Override
publicObjectgetItem(intposition){
//TODOAuto-generatedmethodstub
returnlist.get(position);
}
@Override
publiclonggetItemId(intposition){
//TODOAuto-generatedmethodstub
returnposition;
}
@Override
publicViewgetView(intposition,ViewconvertView,ViewGroupparent){
//TODOAuto-generatedmethodstub
System.out.println(getView+position++convertView);
viewHolderholder=null;
if(convertView==null){
convertView=mInflater.inflate(R.layout.item,null);
holder=newviewHolder();
holder.text=(TextView)convertView.findViewById(R.id.tv_text);
holder.image=(ImageView)convertView
.findViewById(R.id.iv_img);
convertView.setTag(holder);
}else{
holder=(viewHolder)convertView.getTag();
}
holder.text.setText(list.get(position));
if(position%2==0){
holder.image.setImageResource(R.drawable.ic_launcher);
}else{
holder.image.setImageResource(R.drawable.icon);
}
returnconvertView;
}
}
/**
*使用一个类来保存Item中的元素
*
*@authorAdministrator
*
*/
publicstaticclassviewHolder{
publicTextViewtext;
publicImageViewimage;
}
}
B. 关于Android界面组件的基本用法
1.文本框(TextView)和编辑框(EditText)
文本框(TextView)不允许用户编辑文本内容,而编辑框(EditText)允许用户编辑文本内容
2.按钮(Button)和图片按钮(ImageButton)
Button显示文字,ImageButton显示图片。
为ImageButton指定android:text属性没用,不会显示文字
可以指定android:background为按钮增加背景图片,但这图片是固定的
可以指定android:src为图片按钮增加图片属性
其实,src才是设置图标,而background只是设置背景。
如果控件的大小是100 100 图片资源是80 80的话,那么用src,图片就会居中显示,如果使用background那么图片就会被拉伸充满控件。
重要的是,background是底层的图片资源,src是覆盖在background上面的资源,他们可以叠加使用,实现选中的效果。
3.单选按钮(RadioButton)和复选框(CheckBox)
多了一个android:checked属性,用于指定初始时是否被选中
4.计时器组件Chronometer用法
红色字体表示常用的方法
5.图像视图(ImageView)
它支持属性android:scaleType setScaleType(ImageView.ScaleType)
matrix(ImageView.ScaleType.MATRIX):使用matrix方式进行
fixXY(ImageView.ScaleType.FIX_XY):对图片横向纵向独立缩放,会改变纵横比
fitStart(ImageView.ScaleType.FIT_START):保持纵横比,图片较长的边长与ImageView相应的边长相等,缩放后放在左上角
fitCenter(ImageView.ScaleType.FIT_CENTER):保持纵横比,图片较长的边长与ImageView相应的边长相等,缩放后放在中央
fitEnd(ImageView.ScaleType.FIT_END):保持纵横比,图片较长的边长与ImageView相应的边长相等,缩放后放在右下角
center(ImageView.ScaleType.CENTER):放中间,不缩放
centerCrop(ImageView.ScaleType.CENTER_CROP):保持纵横比,使图片能完全覆盖ImageView
centerInside(ImageView.ScaleType.CENTER_INSIDE):保持纵横比,使ImageView能完全显示图片
6.spinner的功能和用法
如果可以确定spinner里面的列表项,那么直接在/res/layout/main.xml里面指定
然后在/res/value/string.xml里面指定
如果不确定里面的列表项,那么必须要提供一个Adapter,这个Adapter负责决定Spinner列表每项的内容
7.日期、时间选择器(DatePicker和TimePicker)
8.自动完成文本框(AutoCompleteTextView)
比普通文本框多了一个功能:当用户输入一定字符后,自动完成文本框会显示一个下拉菜单,供用户从中选择,当用户选择某个菜单后,组件会按用户选择自动填写该文本框
使用该组件很简单,只要为它设置一个Adapter,该Adapter封装了AutoCompleteTextView预设的提示文本
9.进度条(ProgressBar)
通过style属性可以为ProgressBar指定风格。该属性可以有如下的属性值:
1.@android:style/Widget.ProgressBar.Horizontal 水平进度条
2.@android:style/Widget.ProgressBar.Inverse 不断跳跃、旋转画面的进度条
3.@android:style/Widget.ProgressBar.Large 大进度条
4.@android:style/Widget.ProgressBar.Large.Inverse不断跳跃、旋转画面的大进度条
5.@android:style/Widget.ProgressBar.Small 小进度条
6.@android:style/Widget.ProgressBar.Small.Inverse不断跳跃、旋转画面的小进度条
ProgressBar提供如下方法来操作进度
1.setProgress(int) 设置进度的完成百分比
2.incrementProgressBy(int) 设置进度条的增加或减少。参数为正增加,参数为负减少
10.选项卡(TabHost)
TabHost仅仅只是一个简单的容器,它提供如下方法
1.newTabSpec(String tag) 创建选项卡
2.addTab(TabHost.TabSpec tabSpec) 添加选项卡
使用TabHost的一般步骤为:
• A. 在界面中定义TabHost组件,并为该组件定义该选项卡的内容
• B. Activity应该继承TabActivity
• C. 调用TabActivity的getTabHost()来获取TabHost对象
• D. 通过TabHost对象的方法来创建选项卡、添加选项卡
选项卡主要由TabHost、TabWidget、FrameLayout3个组件组成,三者缺一不可,想象一下选项卡的特点,多个卡重叠在一起,所以用FrameLayout即帧布局是必要的。另外需要注意的是TabHost、TabWidget、FrameLayout三个组件的android:id必须使用系统默认的名称,而不能自己随意定义,否则会出错。
11.图像切换器(ImageSwitcher)
12.网格视图(GridView)
使用GridView一般指定numColumn大于1,否则取默认值为1.那么GridView就变成了ListView
属性android:stretchMode支持如下属性
1.none 不拉伸
2.spacingWidth 仅拉伸元素之间的间距
3.spacingWidthUniform 表格、元素之间的间距一起拉伸
4.columnWidth 仅拉伸表格
13.画廊视图(Gallery)(现在已经被弃用了,不过还是列出来吧)
Gallery用法很简单——为它提供一个内容Adapter,该Adapter的getView方法所返回的View可作为Gallery的列表项。可以通过OnItemSelectedListener监听选择项的改变
14.列表试图(ListView和ListActivity)
1.创建ListView由两种方式:
2.直接使用ListView进行创建
让Activity继承ListActivity(继承了ListActivity的类无需调用setContentView()来显示页面,可以直接设置适配器)
一旦获得ListView后,就要创建显示的列表项了。需要借助内容Adapter,内容Adapter负责提供需要显示的列表项
创建ArrayAdapter时必须指定一个textViewResourceId,该参数决定每个列表项的外观
1.simple_list_item_1 每个列表项是普通的TextView
2.simple_list_item_2 每个列表项是普通的TextView(字体略大)
3.simple_list_item_checked 每个列表项是已勾选的列表项
4.simple_list_item_multiple_choice 每个列表项是带多选框的文本
5.simple_list_item_single_choice 每个列表项是带多单选按钮的文本
15.使用AlertDialog
1.创建AlertDialog.Builder对象,该对象是AlertDialog的创建器
2.调用AlertDialog.Builder方法为对话框设置图标、标题等
3.调用AlertDialog.Builder的create()方法创建AlertDialog对话框
4.调用AlertDialog的show()方法显示对话框
16.使用Toast显示提示框
步骤如下:
• 调用Toast构造器或makeText方法创建Toast对象
• 调用Toast方法来设置该消息的对齐方式等
• 调用Toast的show()方法显示出来
• Toast toast = Toast.makeText(ToastTest.this, "信息", Toast.LENGTH_LONG).show();
17.Notification(一般显示网络状态、电池状态、时间等)
使用Notification发送Notification步骤:
• 调用getSystemService(NOTIFICATION_SERVICE)方法获取系统的Notification Manager服务
• 通过构造器创建一个Notification对象
• 为Notification设置属性
• 通过Notification Manager发送Notification
C. android怎么传一个list集合
方法1: 直接让User类继承Serializable或者Parcelable接口即可,Intent只可以传输序列化的对象<pre t="code" l="java">//User类
public class User implements Serializable{
private String name;
.
}
//直接加入intent
List<User> list = new ArrayList<User>();
Intent intent = new Intent();
intent.putExtra("list",list);
方法2: 把list集合转为字符串表示,可以使用json格式,直接用Gson框架转换即可,再到另一个activity转换回来<pre t="code" l="java">List<User> list = new ArrayList<User>();
Type type = new TypeToken<ArrayList<User>()>(){}.getType();
String json = new Gson().toJson(list,type);
intent.putExtra("list",json);
//转换回List<User>
String json = getIntent.getStringExtra("list");
Type type = new TypeToken<ArrayList<User>()>(){}.getType();
List<User> list = new Gson().fromJson(json,type);
D. android里的List<Person> persons=new ArrayList<Person>(); 是什么意思在使用sqlite数据库时用到的。
ArrayList :数组链表,链表按数组形式存储元素。
new ArrayList<Person>():创建一个链表,<>表示链表内放Person类型数据。
List:链表抽象类,是ArrayList父类
List<Person> persons:一个List引用。
E. android List 在子线程添加了数据,但是在使用的时候发现里面没有数据
List里是有数据的,之前的ScrollView用的就是imageViewList导入数据的就没..
F. android里的List<Person> persons=new ArrayList<Person>(); 是什么意思在使用sqlite数据库时用到的。
在onItemClickListener里面有一个position的参数,也就是对应你在给ListView设置适配器的时候的Listlist之中的下标。你可以通过list中的map也好,还是类的对象也好,是map的话就是list.get(position).get("图片地址的key");是对象的话就是list.get(position).ImagePath;(比如说你在类中给对象定义的属性是imagePath)就可以或得到图片的链接。然后就是一个简单的Intent传值的问题了
G. android编程中 setListAdapter(listAdapter);什么意思 以及具体用法是什么
android编程中
setListAdapter(listAdapter);的意思是:
1、把数据映射到界面里边。这个应该是LIST放数据的基本方式,四种Adapter自己都可以选。
2、LIST上显示数据看,必须借助个Adapter也就是适配器,可以理解为映射也行。
H. 在android中 List 和ArrayList的区别,越详细越好
List是一个接口,而ArrayList是List的一个实现类,对于android和J2SE来讲,两者之间的区别不大。
I. android level-list怎么使用
只需要循环一下,判断即可。 示例代码: 1.遍历整个list集合 for(int i=0; i<list.size(); i++){ } 2.在for循环中增加判断代码 if(list.get(i).equals("指定")){} 3.得到每一个item进行判断即可。