Android listview 专题
- 格式:docx
- 大小:1.01 MB
- 文档页数:75
Android基础篇之在ListView中显示网络图片大家知道ImageView 类虽然有一个setImageUri 方法,但不能直接接受一个由网络地址生成的uri 作为参数从而显示图片,我们只好使用其 setImageBitmap 方法,如view plaincopy to clipboardprint?1.BitmapmBitmap=null;2.3.URLurl=new URL(imageUrl);4.5.HttpURLConnectionconn=(HttpURLConnection)url.openConnection();6.7.InputStream is=conn.getInputStream();8.9.mBitmap=BitmapFactory.decodeStream(is);在SimpleAdapter中需要一个数据源,用来存储数据的,在显示图片时我们要用HashMap<>存储一个Bitmap;但仅存取了Bitmap时在ListView中是无法显示图片的,我们需要对SimpleAdapter进行处理 。
如下是对SimpleAdaptr处理的主要代码:view plaincopy to clipboardprint?1.adapter.setViewBinder(new ViewBinder(){2.3.publicboolean setViewValue(Viewview,Objectdata,4.StringtextRepresentation){5.//判断是否为我们要处理的对象6.if(view instanceof ImageView&&data instanceof Bitmap){7.ImageViewiv=(ImageView)view;8.9.iv.setImageBitmap((Bitmap)data);10.returntrue;11.}else12.returnfalse;13.}14.});看API对Android.widget.SimpleAdapter.ViewBinder的解释:This class can be used by external clients of SimpleAdapter to bind values to views. You should use this class to bind values to views that are not directly supported by SimpleAdapter or to change the way binding occurs for views supported by SimpleAdapter.你可以使用该类来处理SimpleAdapter不直接支持的数据;下面来看看完整的代码:main.xml 中就是一个ListView , list_item.xml 是为ListView中控件提供布局 ,就是一个ImageView。
Android⼊门教程之ListView的具体使⽤详解⽬录ListView 的简单⽤法定制 ListView 的界⾯提升 ListView 的运⾏效率ListView 的点击事件ListView 的简单⽤法在布局中加⼊ ListView 控件还算简单,先为 ListView 指定⼀个 id,然后将宽度和⾼度都设置为 match_parent,这样ListView 就占满了整个布局的空间<LinearLayout xmlns:android="/apk/res/android"xmlns:tools="/tools"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><ListViewandroid:id="@+id/listView"android:layout_width="match_parent"android:layout_height="match_parent" /></LinearLayout>接下来修改 MainActivity 中的代码class MainActivity : AppCompatActivity() {private val data = listOf("Apple", "Banana", "Orange", "Watermelon","Pear", "Grape", "Pineapple", "Strawberry", "Cherry", "Mango","Apple", "Banana", "Orange", "Watermelon", "Pear", "Grape","Pineapple", "Strawberry", "Cherry", "Mango")override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(yout.activity_main)val adapter = ArrayAdapter<String>(this, yout.simple_list_item_1, data)listView.adapter = adapter}}先将数据准备好,然后借助适配器将数据传递给 ListView。
安卓ListView的使⽤1.简单介绍ListViewlistview是⼀个以垂直⽅式在项⽬中显⽰视图的列表。
是⼀种不能实现确定视图中的内容的适配器视图(adapter view)。
数据和视图的绑定,需要通过继承ListViewAdapter接⼝的适配器实现。
确保当上下滚动的时候,能够动态刷新视图内容。
通常我们都会⾃定义⼀个继承⾃BaseAdapter(已继承ListViewAdapter),ArrayAdapter(继承⾃BaseAdapter),SimpleAdapter(继承⾃BaseAdapter)的类,重写getView()⽅法,实现⾃⼰想要的功能。
getView⽅法详情View getView (int position, View convertView, ViewGroup parent)Get a View that displays the data at the specified position in the data set.You can either create a View manually or inflate it from an XML layout file.When the View is inflated, the parent View (GridView, ListView...) will applydefault layout parameters unless you use inflate(int, android.view.ViewGroup, boolean) tospecify a root view and to prevent attachment to the root备注:使⽤适配器构建布局。
如果布局的内容是属于动态或未预先确定的内容,您可以使⽤这样⼀种布局:在运⾏时通过⼦类 AdapterView⽤视图填充布局。
AdapterView类的⼦类使⽤ Adapter将数据与其布局绑定。
Android优化系列之ListView优化⽼⽣常谈本⽂内容:adapter,listview的优化,RecycleBi,google⼤会推荐优化,实现ListView的过程,Adapter起到了⾄关重要的作⽤,不仅仅因为getview()⽅法。
那么,先从Adapter说起~Adapter: 它在ListView和数据源之间起到桥梁的作⽤,避免listview和数据源直接接触,⽽导致因为数据源的复杂性使listview显得臃肿。
Adapter,适配器,把复杂的数据源适配给listview,很容易联想到适配器模式。
下⾯是⼏种常⽤的Adapter: ArrayAdapter:简单易⽤的Adapter,通常⽤于数组或list集合的数据源(多个值包装成多个列表项)。
simpleAdapter:并不见得、功能强⼤的Adapter,可⽤于list集合的多个对象包装成多个列表项。
simpleCursorAdapter:与上相似,但是⽤于包装jCursor(数据库游标)提供的数据源。
BaseAdapter:通常⽤于被扩展。
扩展BaseAdapter可以对各列表项进⾏最⼤限度的定制。
下⾯是listview的优化:增加优化⼀:convertView的使⽤,主要优化加载布局问题 1.listivew每次滚动都会调⽤gitview()⽅法,所以优化gitview是重中之重。
下⾯是getview()在Adapter类的源码,这个没有实现,要看重点部分已经颜⾊标记。
⽆⾮是View convertView的介绍~/*** Get a View that displays the data at the specified position in the data set. You can either* create a View manually or inflate it from an XML layout file. When the View is inflated, the* parent View (GridView, ListView...) will apply default layout parameters unless you use* {@link youtInflater#inflate(int, android.view.ViewGroup, boolean)}* to specify a root view and to prevent attachment to the root.** @param position The position of the item within the adapter's data set of the item whose view* we want.* @param convertView The old view to reuse, if possible. Note: You should check that this view* is non-null and of an appropriate type before using. If it is not possible to convert* this view to display the correct data, this method can create a new view.* Heterogeneous lists can specify their number of view types, so that this View is* always of the right type (see {@link #getViewTypeCount()} and* {@link #getItemViewType(int)}).* @param parent The parent that this view will eventually be attached to* @return A View corresponding to the data at the specified position.*/View getView(int position, View convertView, ViewGroup parent);⼤家对于 convertView = null优化⽅法的使⽤已经了然于胸,但是我那个纠结,就知道是缓存了listview⾥⾯已经加载好的view(下⽂会讲解)。
海文国际Android之ListView一、列表(ListView)在android开发中ListView是比较常用的组件,它以列表的形式展示具体内容,并且能够根据数据的长度自适应显示。
二、列表(ListView)的显示需要三个元素1.ListView 用来展示列表的View。
2.适配器用来把数据映射到ListView上的中介。
3.数据具体的将被映射的字符串,图片,或者基本组件。
根据列表的适配器类型,列表分为三种,ArrayAdapter,SimpleAdapter和SimpleCursorAdapter其中以ArrayAdapter最为简单,只能展示一行字。
SimpleAdapter有最好的扩充性,可以自定义出各种效果。
SimpleCursorAdapter可以认为是SimpleAdapter 对数据库的简单结合,可以方面的把数据库的内容以列表的形式展示出来。
ListView lstView;三、ListView事件setOnItemClickListener(点击触摸屏有效)当项被点击后触发setOnItemSelectListener(点击手机键盘有效,4.*后点击也有效)ListView lstCourse;四、ListView提升效率由于展示空间有限,即使有多个item,界面上只能展示有限的个数,这个时候只海文国际 需要把有限个View展示在界面上就可以了.最上方划出的View被接下来的进入界面的最下面的View重复利用的话,就可以大幅度的减少创建View的次数,这样效率得到了提升.getView方法我们是实现者,android的ListView是调用者,ListView会为我们传入convertView的值.当有可以重复利用的View时候,convertView为这个View的值,否则为null.通过持有者模式优化布局,进行动态加载(使用到ConvertView)在convertView中保存持有者对象,convertView.setTag(wrapper)再从缓存中获取持有者对象wrapper = (ViewWrapper)convertView.getTag()建立持有者类ViewWrapper(自定义,主要进行所有视图控件的存放),产生对象wrapper海文国际五、ListActivity当Activity只涉及到一个列表,那么应该考虑将Activity创建成为ListActivity 的子类,而不是以Activity为基类.当你想自定义布局时候,只需要把ListView标示为@android:id/list,ListActivity 就知道哪个部件是这个活动的主列表.海文国际。
1. 下面的代码是mars老师视频教程里的代码,我把它注释了一下。
2. 创建两个XML布局文件main.xml和user.xml。
main.xml文件为系统自动创建main.xml布局文件代码:[html]view plaincopy1.<?xml version="1.0"encoding="utf-8"?>2.<LinearLayout xmlns:android="/apk/res/android"3.android:orientation="vertical"4.android:layout_width="fill_parent"5.android:layout_height="fill_parent">6.7.<LinearLayout android:id="@+id/listLinearLayout"<!-- 设置LinearLayout的ID -->8.android:layout_width="fill_parent"<!-- 设置LinearLayout宽度为填满整个屏幕 -->9.android:layout_height="wrap_content"<!-- 设置LinearLayout高度适应内部控件的高度 -->10.android:orientation="vertical"><!-- 设置LinearLayout的排列方式为纵向排列 -->11.12.<!-- 在LinearLayout里嵌套一个ListView控件 -->13.<ListView android:id="@id/android:list"<!-- 设置ListView控件的ID,这个ID为android系统内置ID -->14.android:layout_width="fill_parent"<!-- 设置ListView控件的宽度为填满整个屏幕 -->15.android:layout_height="wrap_content"<!-- 设置ListView控件的高度为自适应 -->16.android:drawSelectorOnTop="false"<!-- 设置ListView控件条目被按下时背景颜色在文字背后,设置成True时背景色会覆盖文字 -->17.android:scrollbars="vertical"/><!-- 设置ListView控件滚动条的方向为纵向 -->18.19.</LinearLayout>20.</LinearLayout>ListViw控件中的ID (android:id="@id/android:list") 是Android系统内置的ID,不能改为其他。
Android滚动菜单ListView实例详解本⽂实例为⼤家分享了Android使⽤ListView实现滚动菜单的具体代码,供⼤家参考,具体内容如下说明:滚动菜单ListView及点击事件代码结构:1、创建⼀个list展⽰模型app\src\main\res\layout\fruit_item.xml<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:orientation="horizontal"android:layout_width="match_parent"android:layout_height="match_parent"><ImageViewandroid:id="@+id/fruit_image"android:layout_width="wrap_content"android:layout_height="wrap_content"/><TextViewandroid:id="@+id/fruit_name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:gravity="center_vertical"android:layout_marginLeft="10dp"/></LinearLayout>2、主界⾯引⽤⼀下app\src\main\res\layout\activity_main.xml<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"xmlns:app="/apk/res-auto"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><ListViewandroid:id="@+id/list_view"android:layout_width="match_parent"android:layout_height="match_parent" /></LinearLayout>3、创建fruit类app\src\main\java\com\example\listviewtest\Fruit.javapackage com.example.listviewtest;public class Fruit {private String name;private int imageId;public Fruit(String name,int imageId){ = name;this.imageId = imageId;}public String getName(){return name;}public int getImageId(){return imageId;}}4、创建适配器app\src\main\java\com\example\listviewtest\FruitAdapter.javapackage com.example.listviewtest;import android.content.Context;import youtInflater;import android.view.View;import android.view.ViewGroup;import android.widget.ArrayAdapter;import android.widget.ImageView;import android.widget.TextView;import java.util.List;public class FruitAdapter extends ArrayAdapter<Fruit> {private int resourceId;public FruitAdapter(Context context,int textViewResourceId,List<Fruit> object){super(context,textViewResourceId,object);resourceId = textViewResourceId;}public View getView(int position, View converView, ViewGroup parent){Fruit fruit = getItem(position);View view = LayoutInflater.from(getContext()).inflate(resourceId,parent,false);ImageView fruitImage = (ImageView) view.findViewById(R.id.fruit_image);TextView fruitName = (TextView) view.findViewById(R.id.fruit_name);fruitImage.setImageResource(fruit.getImageId());fruitName.setText(fruit.getName());return view;}}5、主内容app\src\main\java\com\example\listviewtest\MainActivity.javapackage com.example.listviewtest;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.AdapterView;import android.widget.ArrayAdapter;import android.widget.ListView;import android.widget.Toast;import java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity {private List<Fruit> fruitList = new ArrayList<>();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);initFruits();//初始化⽔果数据FruitAdapter adapter = new FruitAdapter(MainActivity.this,yout.fruit_item,fruitList); ListView listView = (ListView) findViewById(R.id.list_view);listView.setAdapter(adapter);//响应点击事件listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {Fruit fruit = fruitList.get(i);Toast.makeText(MainActivity.this,fruit.getName(),Toast.LENGTH_SHORT).show(); }});}private void initFruits(){for (int i=0;i<2;i++){Fruit apple = new Fruit("Apple",R.drawable.apple_pic);fruitList.add(apple);Fruit banana = new Fruit("Banana",R.drawable.banana_pic);fruitList.add(banana);Fruit cherry = new Fruit("Cherry",R.drawable.cherry_pic);fruitList.add(cherry);Fruit grape = new Fruit("Grape",R.drawable.grape_pic);fruitList.add(grape);Fruit mango = new Fruit("Mango",R.drawable.mango_pic);fruitList.add(mango);Fruit orange = new Fruit("Orange",R.drawable.orange_pic);fruitList.add(orange);Fruit pear = new Fruit("Pear",R.drawable.pear_pic);fruitList.add(pear);Fruit pineapple = new Fruit("Pineapple",R.drawable.pineapple_pic);fruitList.add(pineapple);Fruit strawberry = new Fruit("Strawberry",R.drawable.strawberry_pic);fruitList.add(strawberry);Fruit watermeion = new Fruit("Watermeion",R.drawable.watermeion_pic);fruitList.add(watermeion);}}}运⾏展⽰:以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
ListView用法介绍public class ListView extends AbsListViewng.Objectandroid.view.Viewandroid.view.ViewGroupandroid.widget.AdapterView<T extends android.widget.Adapter> android.widget.AbsListViewandroid.widget.ListView直接子类ExpandableListView (使用竖滚动条查看的两级列表视图)类概述通过竖滚动条查看的列表视图。
ListAdapter里包含的内容和此视图相关联。
参见List View tutorial。
内部类class ListView.FixedViewInfo表示一个列表中的固定视图,如放在最顶部的页眉和最底部的页脚XML属性常量Int CHOICE_MODE_MULTIPLE(常量值为2)列表允许同时选取多项Int CHOICE_MODE_NONE(常量值为0)普通列表,不指明选取模式Int CHOICE_MODE_SINGLE(常量值为1)列表只允许选取最多一项公共方法public void addFooterView (View v)加一个固定显示于list底部的视图。
如果此方法被调用超过一次,所加的几个视图将按照它们加入的顺序排列。
加入的视图可取得焦点。
注意:在调用setAdapter之前调用此方法。
这样的话,可以利用点击光标来收起有header view和footer view的ListView。
参数v 要加的视图public void addFooterView (View v, Object data, boolean isSelectable)加一个固定显示于list底部的视图。
如果此方法被调用超过一次,所加的几个视图将按照它们加入的顺序排列。
加入的视图可取得焦点。
Android列表控件ListView详解ListView绝对可以称得上是Android中最常⽤的控件之⼀,⼏乎所有应⽤程序都会⽤到它。
由于⼿机屏幕空间都⽐较有限,能够⼀次性在屏幕上显⽰的内容并不多,当我们的程序中有⼤量的数据需要展⽰的时候,就可以借助ListView来实现。
----------------------------------------------ListView简易⽤法------------------------------------------------------创建⼀个ListViewTest项⽬,让Android Studio⾃动创建好活动。
然后修改activity_main.xml中的代码,如下:引⼊了ListView后,即使你的ListView没有内容,可视化编辑器preview仍然会这样显⽰:接下来修改MainActivity中的代码,如下所⽰:直接在MainActivity中定义字符串数组虽然可以达到⽬的,但是不便于管理。
可以在res⽬录下的values⽂件夹下新建⼀个array.xml⽂件,内容如下:通过Resources对象获得array.xml的内容:最终结果如下:-----------------------------------------------------适配器的介绍------------------------------------------------------既然ListView是⽤于展⽰⼤量数据的,这些数据可以是从⽹上下载的,也可以是从数据库中读取的,应该视具体的应⽤场景来决定。
数组中的数据是⽆法直接传递给ListView的,还需要借助适配器来完成。
Android中提供了很多的适配器的实现类,其中最简单的就是ArrayAdapter(注意不是SimpleAdapter)。
它可以通过泛型来指定要适配的数据类型,然后在构造函数中把要适配的数据传⼊即可。
android listview 用法Android ListView 用法概述ListView是Android中最常用的控件之一,它可以展示一组垂直滚动的项目列表。
本文将介绍ListView的用法和一些常见的实例。
基本用法1.首先,在XML布局中添加ListView控件。
2.在Java代码中,通过findViewById方法获取ListView对象的引用。
3.创建一个适配器Adapter,并将其与ListView关联。
4.定义一个数据集,用于存储要显示的项目。
5.将数据集与适配器关联。
6.最后,调用ListView的setAdapter方法来设置适配器。
适配器的使用1.ArrayAdapter:用于将数组或List对象中的数据逐一显示在ListView上。
2.SimpleAdapter:用于将Map对象中的数据显示在ListView上。
3.BaseAdapter:是一个抽象类,需要继承并实现其中的方法,以自定义数据和布局的显示方式。
列表项的点击事件1.使用setOnItemClickListener方法为ListView设置一个项目点击事件的监听器。
2.在监听器中重写onItemClick方法,用于处理项目点击事件。
列表项的自定义布局1.创建一个XML布局文件,定义列表项的样式。
2.在适配器的getView方法中,使用LayoutInflater类将XML布局文件转换为View对象。
3.返回View对象作为列表项的显示。
列表项的滑动删除1.实现列表项的滑动删除功能,可以使用SwipeRefreshLayout和RecyclerView组合方法。
2.在RecyclerView的Adapter中,为列表项绑定一个滑动删除的动作。
3.在动作中,更新数据集并通知列表刷新。
列表项的滑动加载更多1.使用RecyclerView和分页加载的方法实现列表项的滑动加载更多功能。
2.在滑动到列表底部时,触发加载更多的操作。
android listview 用法(一)Android ListView 用法1. 介绍ListView 是 Android 开发中常用的控件,用于展示大量的数据列表。
它可以显示垂直方向的单列或多列列表,并且支持滚动、点击等交互操作。
2. 基本用法•在 XML 布局文件中添加 ListView 控件。
<ListViewandroid:id="@+id/list_view"android:layout_width="match_parent"android:layout_height="match_parent"/>•在 Java 代码中获取 ListView 的引用,并为其设置适配器。
ListView listView = findViewById(_view); ArrayAdapter<String> adapter = new ArrayAdapter<>(this, _list_item_1, dataList);(adapter);3. 自定义布局ListView 默认使用系统提供的简单布局_list_item_1来展示数据。
如果需要自定义布局,可以创建一个新的布局文件,并在适配器中指定。
•创建自定义布局文件list_。
<LinearLayout xmlns:android="android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"><ImageViewandroid:id="@+id/image_view"android:layout_width="50dp"android:layout_height="50dp" /><TextViewandroid:id="@+id/text_view"android:layout_width="wrap_content"android:layout_height="wrap_content" /></LinearLayout>•在适配器中指定自定义布局。
列表详解列表的显示需要三个元素:1.ListV eiw,用来展示列表的View。
2.适配器,用来把数据映射到ListView 上的中介。
3.数据,具体的将被映射的字符串、图片、或者基本组件。
知识点:1.ListView,是Android中比较常用的组件,它以列表的形式展示具体内容,并且能够根据数据的长度自适应显示。
2.Adapter:Android中的Adapter可以这样理解,它是数据List和视图ListView之间的桥梁,数据在Adapter中做处理,然后显示到视图上面来。
Adapter有很多种。
列表的适配器分为三种类型:ArrayAdapter,SimpleAdapter和SimpleCursorAdapter。
●ArrayAdapter最为简单,只能展示一行字。
●SimpleCursorAdapter可以认为是SimpleAdapter对数据库的简单结合,可以方便地把数据库的内容以列表的形式展示出来。
●SimpleAdapter有最好的扩充性,可以自定义出各种效果。
3.List:●所有的List中只能容纳单个不同类型的对象组成的表,而不是Key-V alue键值对。
例如:[ tom,1,c ],List中取出的都是Object对象。
●所有的List中可以有相同的元素,例如V ector中可以有[ tom,koo,too,koo ]。
●所有的List中可以有null元素,例如[ tom,null,1 ]。
●基于Array的List(V ector,ArrayList)适合查询。
●List基本上都是以Array为基础。
ListView使用的例子如下图:一、最简单的ListView1.package com.demo;2.import java.util.ArrayList;3.import java.util.List;4.import android.app.Activity;5.import android.os.Bundle;6.import android.widget.ArrayAdapter;7.import android.widget.ListView;8.public class MyListView extends Activity {9.private ListView listView;10.@Override11.public void onCreate(Bundle savedInstanceState){12.super.onCreate(savedInstanceState);13.listView = new ListView(this);14.listView.setAdapter(new ArrayAdapter<String>(this,yout.simple_expandable_list_item_1,getData()));15.setContentView(listView);16.}17.private List<String> getData(){18.List<String> data = new ArrayList<String>();19.data.add("测试数据1");20.data.add("测试数据2");21.data.add("测试数据3");22.data.add("测试数据4");23.return data;24.}25.}上面代码第14行,使用了ArrayAdapter()来装配数据,要装配这些数据就需要连接ListView 视图对象和数组的适配器来适配工作。
Android入门之ListView (一)ListView是一个经常用到的控件,ListView里面的每个子项Item可以使一个字符串,也可以是一个组合控件。
先说说ListView的实现:1.准备ListView要显示的数据;2.使用一维或多维动态数组保存数据;2.构建适配器,简单地来说,适配器就是Item数组,动态数组有多少元素就生成多少个Item;3.把适配器添加到ListView,并显示出来。
接下来,看看本文代码所实现的ListView:接下来,就开始UI的XML代码:main.xml代码如下,很简单,也不需要多做解释了:view plaincopy to clipboardprint?<?xml version="1.0" encoding="utf-8"?><LinearLayoutandroid:id="@+id/LinearLayout01"android:layout_width="fill_parent"android:layout_height="fill_parent"xmlns:android="/apk/res/android"> <ListView android:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/MyListView"></ListView></LinearLayout><?xml version="1.0" encoding="utf-8"?><LinearLayoutandroid:id="@+id/LinearLayout01"android:layout_width="fill_parent"android:layout_height="fill_parent"xmlns:android="/apk/res/android"> <ListView android:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/MyListView"></ListView></LinearLayout>my_listitem.xml的代码如下,my_listitem.xml用于设计ListView的Item:view plaincopy to clipboardprint?<?xml version="1.0" encoding="utf-8"?><LinearLayoutandroid:layout_width="fill_parent"xmlns:android="/apk/res/android"android:orientation="vertical"android:layout_height="wrap_content"android:id="@+id/MyListItem"android:paddingBottom="3dip"android:paddingLeft="10dip"><TextViewandroid:layout_height="wrap_content"android:layout_width="fill_parent"android:id="@+id/ItemTitle"android:textSize="30dip"></TextView><TextViewandroid:layout_height="wrap_content"android:layout_width="fill_parent"android:id="@+id/ItemText"></TextView></LinearLayout><?xml version="1.0" encoding="utf-8"?><LinearLayoutandroid:layout_width="fill_parent"xmlns:android="/apk/res/android"android:orientation="vertical"android:layout_height="wrap_content"android:id="@+id/MyListItem"android:paddingBottom="3dip"android:paddingLeft="10dip"><TextViewandroid:layout_height="wrap_content"android:layout_width="fill_parent"android:id="@+id/ItemTitle"android:textSize="30dip"></TextView><TextViewandroid:layout_height="wrap_content"android:layout_width="fill_parent"android:id="@+id/ItemText"></TextView></LinearLayout>解释一下,里面用到的一些属性:1.paddingBottom="3dip",Layout往底部留出3个像素的空白区域2.paddingLeft="10dip",Layout往左边留出10个像素的空白区域3.textSize="30dip",TextView的字体为30个像素那么大。
Android学习笔记二十四之ListView列表视图二前面一篇我们介绍了常用的几种适配器的简单实现和ListView的简单使用,这一篇中,我们介绍一下ListView的优化和一些其它的问题。
ListView优化方法一在ListView中,我们最常用的就是自定义Adapter,在我们自定义Adapter中,需要实现两个比较重要的方法getCount()和getView(),前者是负责计算ListView的总Item数,后者是生成Item,有多少个Item就会调用getView()方法多少次。
getView()方法每次调用的时候都会重新inflate一个View出来返回去,但是对于ListView,只需要保留能够显示的最大的View的数目即可,而新的View可以复用消失的View。
ListView给我们提供了可复用的View对象,在getView()方法里面,有一个参数View,这个就是可以复用的View 对象。
当参数View为null的时候,我们需要inflate一个View,当它不为null的时候,我们可以直接将他返回。
例如:@Overridepublic View getView(int i, View view, ViewGroup viewGroup) {ViewHolder viewHolder;//view为空的时候,inflate一个新的viewif (view == null) {view = LayoutInflater.from(context).inflate(yout.item_base_adapter, null);viewHolder = new ViewHolder();_base_adapter = (TextView) view.findViewById(_base_adapter);view.setTag(viewHolder);} else {viewHolder = (ViewHolder) view.getTag();}_base_adapter.setText(datas[i]);//不为空,复用viewreturn view;}ListView优化方法二上面介绍的是对View复用的优化,这样我们可以不必每一item都inflate一个新的view,可以通过复用,减小内存开销。
《Android基础应用》Android之ListView⏹本章任务⏹使用ListView实现国家列表⏹实现可动态管理的国家信息⏹本章目标⏹掌握简单ListView的实现⏹掌握使用SimpleAdapter实现ListView⏹掌握自定义Adapter实现ListView1.ListView组件ListView是一种用于垂直显示的列表控件,如果显示内容过多,则会出现垂直滚动条ListView能够通过适配器将数据和自身绑定,在有限的屏幕上提供大量内容供用户选择,所以是经常使用的用户界面控件ListView支持点击事件处理,用户可以用少量的代码实现复杂的选择功能ListView列表的显示需要三个元素:●ListVeiw: 用来展示列表的View。
●适配器: 用来把数据映射到ListView上的中介。
●数据: 具体的将被映射的字符串,图片等。
ListView在显示数据的时候可以设置布局方式,android系统提供了几种默认的布局●yout.simple_list_item_1每个列表项只有一个TextView用来显示数据●yout.simple_list_item_2每个列表项有两个TextView用来显示数据●yout.simple_list_item_single_choice每个列表项后都有一个单选按钮●yout.simple_list_item_multiple_choice每个列表项后都有一个多选按钮●yout.simple_list_item_checked每个列表项后都有一个CheckedTextView1.1简单的ListView适配器ArrayAdapter+List适配器ArrayAdapter+Array示例的显示结果1.2n使用xml数组资源Button是一种按钮控件,用户能够在该控件上点击,并后引发相应的事件处理函数ImageButton用以实现能够显示图像功能的控件按钮示例1.3ListView事件及监听单击列表项时触发public interface OnItemClickListener {void onItemClick(AdapterView<?> parent, View view, int position, long id);}列表项被选择时触发public interface OnItemSelectedListener {void onItemSelected(AdapterView<?> parent, View view, int position, long id);void onNothingSelected(AdapterView<?> parent);}●position为选中的列表项在ListView中的位置●id为被选中的那一行的id●parent指被单击的ListView●View代表用户选中的那一项示例1.4ListView列表样式简单的文本不能完全满足日常开发的需求,可以设置单选,复选●single_choice,multiple_choice,checkedListView组件不以使用那种布局作为单选或复选的标准,必须使用setChoiceMode()方法设置选取模式以后,单选复选才起作用●ListView.CHOICE_MODE_SINGLE 常量为1,表示单选●ListView.CHOICE_MODE_MULTIPLE 常量为2,表示复选●ListView.CHOICE_MODE_NONE 常量为0普通列表,无论使用了何种样式,但选复选都不起作用示例示例的显示结果示例的显示结果默认情况下列表在选中时时背景是黄色的,可以通过android:listSelector属性或setSelector 方法设置列表项之间的分割符可以通过android:divider属性或setDivider方法设置示例的显示结果练习——国家列表需求说明:参考课程内容实现两种方式显示国家列表1.5ListView+SimpleAdapter实现复杂选项使用步骤●创建选项布局文件●创建一个List集合,List集合的元素是Map●创建SimpleAdapter使用自定义布局,系统布局对比练习——国家列表需求说明:使用SimpleAdapter实现国家列表1.6ListView+SimpleAdapter实现动态管理列表项使用步骤●Activity中调用List集合的动态管理方法●再调用notifyDataSetChanged();练习——可动态管理的国家信息需求说明:完成如上图显示界面完成添加,删除当前选择和清空列表功能使用SimpleAdapter2. Gallery 组件该组件用于水平显示一行视图,也可以用来显示图像,常被称作相册组件Gallery 只能水平显示一行,而且可以水平滚动,即单击,选中或拖动Gallery 中的图像,Gallery 中图像列表会根据不同的情况向左右移动,直到显示到最后一个图像为止优化:实现无限循环自定义SimpleAdapter练习——Gallery 相册需求说明:使用Gallery+SimpleAdapter 完成相册显示总结android 系统提供了几种ListView 默认的布局?简述ListView 使用SimpleAdapter 的步骤?动态管理ListView 的实现思路 ?Gallery 组件如何使用?。
Android ListView专题之一多层树完美实现.xml:代码<?xml version="1.0"encoding="utf-8"?><RelativeLayout xmlns:android="/apk/res/android"android:layout_width="fill_parent"android:layout_height="wrap_content"android:orientation="horizontal"><ImageViewandroid:id="@+id/icon"android:layout_width="wrap_content"android:layout_height="fill_parent"android:layout_alignParentBottom="true"android:layout_alignParentTop="true"android:layout_marginRight="6.0dip"/><!--<TextView android:id="@+id/text"android:layout_gravity="center_vertical"android:layout_weight="1.0"android:layout_height="wrap_content"android:layout_width="0dip"android:textAppearance="?android:attr/textAppearanceMedium"android:singleLine="true"android:textColor="#ffffff" />--><TextViewandroid:id="@+id/text"android:layout_width="fill_parent"android:layout_height="fill_parent"android:layout_alignParentBottom="true"android:layout_alignParentTop="true"android:layout_toRightOf="@id/icon"android:gravity="center_vertical"android:singleLine="true"android:textAppearance="?android:textAppearanceMedium"android:textColor="#ffffff"/></RelativeLayout>TreeElement.java:private String id;private String outlineTitle;privateboolean mhasParent;privateboolean mhasChild;private TreeElement parent;privateint level;private ArrayList<TreeElement>childList = new ArrayList<TreeElement>();public String getId() {return id;}publicvoid setId(String id) {this.id = id;}public String getOutlineTitle() {return outlineTitle;}publicvoid setOutlineTitle(String outlineTitle) {this.outlineTitle = outlineTitle;}publicboolean isMhasParent() {return mhasParent;}publicvoid setMhasParent(boolean mhasParent) { this.mhasParent = mhasParent;}publicboolean isMhasChild() {return mhasChild;}publicvoid setMhasChild(boolean mhasChild) { this.mhasChild = mhasChild;}publicint getLevel() {return level;}publicvoid setLevel(int level) {this.level = level;}publicboolean isExpanded() {return expanded;}publicvoid setExpanded(boolean expanded) { this.expanded = expanded;}public TreeElement getParent() {return parent;}publicvoid setParent(TreeElement parent) { this.parent = parent;}// private OutlineElement outlineElement; privateboolean expanded;c.parent = this;c.level = this.level + 1;}public TreeElement(String id, String title) {super();this.id = id;this.outlineTitle = title;this.level = 0;this.mhasParent = true;this.mhasChild = false;this.parent = null;}public TreeElement(String id, String outlineTitle, boolean mhasParent,boolean mhasChild, TreeElement parent, int level, boolean expanded) { super();this.id = id;this.outlineTitle = outlineTitle;this.mhasParent = mhasParent;this.mhasChild = mhasChild;this.parent = parent;if (parent != null) {this.parent.getChildList().add(this);}this.level = level;this.expanded = expanded;}}TreeView.java:@Overridepublicvoid onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);initialData();treeViewAdapter = new TreeViewAdapter(this, yout.main,mPdfOutlinesCount);setListAdapter(treeViewAdapter);registerForContextMenu(getListView());}mPdfOutlinesCount.add(element1);mPdfOutlinesCount.add(element2);mPdfOutlinesCount.add(element9);element2.addChild(element3);element1.addChild(element4);element1.addChild(element5);element1.addChild(element6);element1.addChild(element7);element7.addChild(element8);element9.addChild(element10);element9.addChild(element11);element11.addChild(element12);element11.addChild(element13);element10.addChild(element14);element10.addChild(element15);element10.addChild(element16);element10.addChild(element17);element10.addChild(element18);element10.addChild(element19); }publicint getCount() {return mfilelist.size();}public Object getItem(int position) {return position;}publiclong getItemId(int position) {return position;}@Overridepublicvoid onClick(View v) {Log.i("TreeView", "obj.id:" + obj.getId());}});holder.icon.getPaddingTop(), 0,holder.icon.getPaddingBottom());holder.text.setText(obj.getOutlineTitle());if (obj.isMhasChild() && (obj.isExpanded() == false)) {holder.icon.setImageBitmap(mIconCollapse);} elseif (obj.isMhasChild() && (obj.isExpanded() == true)) {holder.icon.setImageBitmap(mIconExpand);} elseif (!obj.isMhasChild()) {holder.icon.setImageBitmap(mIconCollapse);holder.icon.setVisibility(View.INVISIBLE);}return convertView;}class ViewHolder {TextView text;ImageView icon;}}@Overrideprotectedvoid onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id);Log.i("TreeView", "position:" + position);if (!mPdfOutlinesCount.get(position).isMhasChild()) {Toast.makeText(this, mPdfOutlinesCount.get(position).getOutlineTitle(), 2000);return;}if (mPdfOutlinesCount.get(position).isExpanded()) {mPdfOutlinesCount.get(position).setExpanded(false);TreeElement element = mPdfOutlinesCount.get(position);ArrayList<TreeElement> temp = new ArrayList<TreeElement>();for (int i = position + 1; i <mPdfOutlinesCount.size(); i++) {if (element.getLevel() >= mPdfOutlinesCount.get(i).getLevel()) { break;}temp.add(mPdfOutlinesCount.get(i));}mPdfOutlinesCount.removeAll(temp);treeViewAdapter.notifyDataSetChanged();// setListAdapter(fileExploreAdapter);} else {TreeElement obj = mPdfOutlinesCount.get(position);obj.setExpanded(true);int level = obj.getLevel();int nextLevel = level + 1;for (TreeElement element : obj.getChildList()) {element.setLevel(nextLevel);element.setExpanded(false);mPdfOutlinesCount.add(position + 1, element);}treeViewAdapter.notifyDataSetChanged();// setListAdapter(fileExploreAdapter);}}}在res/xml文件夹下面新建attrs.xmlJava代码<?xml version="1.0"encoding="utf-8"?><resources><declare-styleable name="TopBar"><attrname="title"format="string"/><attrname="titleTextSize"format="dimension"/><attrname="titleTextColor"format="color"/><attrname="leftTextColor"format="color"/><attrname="leftBackground"format="string"/><attrname="leftText"format="string"/><attrname="rightTextColor"format="color"/><attrname="rightBackground"format="string"/><attrname="rightText"format="string"/></declare-styleable></resources>布局文件:Java代码<?xml version="1.0"encoding="utf-8"?><FrameLayout xmlns:android="/apk/res/android"xmlns:custom="/apk/res/com.android.custom"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical"><TextViewandroid:layout_width="fill_parent"android:layout_height="fill_parent"android:background="#ff00ff00"/><com.android.custom.TopBarandroid:id="@+id/topBar"android:layout_width="fill_parent"android:layout_height="wrap_content"android:background="#0000ff"custom:leftBackground="@drawable/icon"custom:leftText="左侧"custom:leftTextColor="#123123"custom:rightBackground="@drawable/icon"custom:rightText="右侧"custom:rightTextColor="#ff0000"custom:title="自定义标题"custom:titleTextColor="#ff0000"custom:titleTextSize="14.0sp"></com.android.custom.TopBar></FrameLayout>Android ListView专题之二滚动卡的问题写了个类似下面的GridView,滚动的时候有卡或者跳格的现象,尤其当记录比较多的时候。