• QQ
  • nahooten@sina.com
  • 常州市九洲新世界花苑15-2

Android

Android UI组件-ListView列表控件

原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/Android/2019/0828/619.html

 
 
【正文】
 
 
 
内容简介:
 
 
 
• 1、根基的XML配置
 
 
 
• 2、ListActivity
 
 
 
• 3、单选和多选模式
 
 
 
• 4、ListView实现图文列表
 
 
 
• 5、ListView革新分页
 
 
 
 
 
一、常州手游开发根基的 XML配置:
 
 
 
android:cacheColorHint="#00000000"  //配置拖动布景色为透明
 
android:dividerHeight="30px"  //listview item之间的高度(即分格条的高度)
 
android:divider="@drawable/ic_launcher"  //配置listview item之间布景大概说是色彩
 
android:fadingEdge="vertical"  //上边和下边有黑色的暗影,值为none的话就没有暗影
 
android:drawSelectorOnTop="true" 点击某笔纪录不放,色彩会在纪录的前面,成为前景色,纪录上的文字被遮住,以是点击文字不放,文字就看不到(默认为false)
 
android:scrollbars="horizontal|none"  //惟有值为horizontal|vertical的时候(默认也是这个值),才会表现转动条,而且会自动影藏和表现
 
android:fastScrollEnabled="true"  //疾速转动结果,配置这个属性,在疾速转动的时候附近会出现一个小方块,进行疾速转动,自动潜藏和表现(要是没有出现,是由于ListView item数量不够多)
 
android:listSelector="@color/pink"  //istViewl item选中时的色彩
 
android:entries="@array/citys"  //配置列表添补的内容
 
在ListView中加载内陆数据,有两种方法,下面举例申明:(固然了,在这以前我们必要在结构文件activity_main.xml中增加一个ListView控件)
 
 
 
【方法一】:在xml文件中增加静态数据的方法:
 
 
 
常州游戏开发培训res/values/string.xml文件中, 增加一组静态数据,作为列表中将要添补的内容,代码如下
 
 
 
复制代码
 
 1 <?xml version="1.0" encoding="utf-8"?>
 
 2 <resources>
 
 3     <string name="app_name">smyh005_ListView</string>
 
 4     <string name="action_settings">Settings</string>
 
 5     <string name="hello_world">Hello world!</string>
 
 6     
 
 7     <string-array name="names">
 
 8         <item >性命诚恳</item>
 
 9         <item >性命诚恳</item>
 
10         <item >性命诚恳</item>
 
11         <item >性命诚恳</item>
 
12         <item >性命诚恳</item>
 
13         <item >性命诚恳</item>
 
14         <item >性命诚恳</item>
 
15         <item >性命诚恳</item>
 
16         <item >性命诚恳</item> 
 
17     </string-array>
 
18     
 
19 </resources>
 
复制代码
 
紧接着,在结构文件的ListView控件中,增加如下属性:
 
 
 
android:entries="@array/names"
 
而后配置一下ListView的其余属性。如许,运转后,便表现一个简单的列表了。
 
 
 
 
 
 
 
【方法二】在java代码中来增加数据:
 
 
 
复制代码
 
 1 public class MainActivity extends Activity {
 
 2     private ListView listView;
 
 3     @Override
 
 4     protected void onCreate(Bundle savedInstanceState) {
 
 5         super.onCreate(savedInstanceState);
 
 6         setContentView(R.layout.activity_main);
 
 7         listView = (ListView) findViewById(R.id.listView1);
 
 8         String[] names = { "性命诚恳", "性命诚恳", "性命诚恳", "性命诚恳", "性命诚恳", "性命诚恳" };
 
 9         //第二个参数,也能够新建一个结构文件,在这个结构文件的TextView中间配置其余属性。由于每个Item本身即是一个TextView
 
10         ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
 
11                 android.R.layout.simple_list_item_1, names);
 
12         listView.setAdapter(adapter);
 
13     }
 
复制代码
 
 
 
 
 
手机App外包事件处分】
 
事件处分的监听器为:OnItemClickListener。
 
 
 
方法举比方下:(将目前点击的那个item的文本以吐司的方法表现出来)
 
 
 
复制代码
 
 1 listView1.setOnItemClickListener(new OnItemClickListener(){
 
 2             
 
 3             //ListView的列表项的单击事件 
 
 4             @Override
 
 5             //第一个参数:指的是这个ListView;第二个参数:目前单击的那个item
 
 6             public void onItemClick(AdapterView<?> parent, View view, int position,
 
 7                     long id) {
 
 8                 System.out.println("parent="+parent.getClass());
 
 9                 System.out.println("view="+view.getClass());
 
10                 
 
11                 //既然目前点击的那个item是一个TextView,那我们可以将其强迫转型为TextView范例,而后通过getText()方法取出它的内容,紧接着以吐司的方法表现出来
 
12                 TextView tv = (TextView)view;
 
13                 Toast.makeText(MainActivity.this,tv.getText(),Toast.LENGTH_SHORT).show();//方法: Toast makeText (Context context, CharSequence text, int duration)                 
 
14                 
 
15                 System.out.println("position="+position);
 
16                 System.out.println("id="+id);
 
17                 
 
18             }
 
19             
 
20  });
 
复制代码
 
上头的第12、13行代码也能够替代成下面的这行代码:(由于通过adapter的getItem方法也能够获取对应Item,回笼值范例是我们以前定义好的String范例)
 
 
 
        Toast.makeText(MainAcivity.this, adapter.getItem(position), Toast.LENGTH_SHORT).show;
 
运转结果如下:
 
 
 
 
 
 
 
 
 
 
 
二、ListActivity
 
 
 
(1)要是程序的窗口仅仅只必要表现一个列表,则可以让这个activity干脆秉承ListActivity来实现,此时曾经包含了一个ListView组件,不消再从新写结构文件了。
 
 
 
代码举比方下:
 
 
 
复制代码
 
 1 package com.smyhvae.smyh005listview;
 
 2 import android.app.ListActivity;
 
 3 import android.os.Bundle;
 
 4 import android.widget.ArrayAdapter;
 
 5 public class SecondActivity extends ListActivity{
 
 6     @Override
 
 7     protected void onCreate(Bundle savedInstanceState) {
 
 8         // TODO Auto-generated method stub
 
 9         super.onCreate(savedInstanceState);
 
10         //通过代码配置ListView中的内容
 
11         String[] names = {"性命诚恳","性命诚恳","性命诚恳","性命诚恳","性命诚恳","性命诚恳"};
 
12         //通过ArrayAdaper将names的内容添补进入
 
13         //方法:public ArrayAdapter (Context context, int resource, int textViewResourceId),第二个参数为结构
 
14         ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, names);
 
15         // adpter和ListView进行绑定
 
16         setListAdapter(adapter);
 
17         
 
18         //注:App开发培训通过getListView()可以取出这个ListView
 
19     }
 
20 }
 
复制代码
 
运转后,也能表现出一个ListView。
 
 
 
(2)事件处分
 
 
 
事件处分的方法为:onListItemClick();
 
 
 
ListActiviy这个类中曾经包含了事件处分的监听器,以是我们只必要复写此中的onListItemClick()即可:
 
 
 
1     //重写ListActivity中的onListItemClick方法来实现列表项的单击事件
 
2     @Override
 
3     protected void onListItemClick(ListView l, View v, int position, long id) {
 
4         // TODO Auto-generated method stub
 
5         super.onListItemClick(l, v, position, id);
 
6     }
 
(3)ListActivity的结构默认是由一个单纯的在屏幕中间的全屏幕的列表,用setcontentview()在在oncreate()配置您本人的自定义屏幕结构视图结构,必需包含一个列表视图的工具ID:"@android:id/list“
 
 
 
(4)自定义视图可以包含任何范例,表现另一个视图工具列表视图是空的,必需包含一个视图工具的ID:android:id/empty。
 
 
 
 
 
 
 
三、单选和多选模式:
 
 
 
单选模式:
 
 
 
1         String[] cities = { "北京", "成都", "重庆", "武汉" };
 
2         ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
 
3                 android.R.layout.simple_list_item_single_choice, cities);
 
4         listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
 
多选模式:
 
 
 
1         String[] cities = { "北京", "成都", "重庆", "武汉" };
 
2         ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
 
3                 android.R.layout.simple_list_item_multiple_choice, cities);
 
4         listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
 
 
 
 
 
五、ListView实现图文列表:
 
 
 
1、应用SimpleAdapter确立复杂的列表项:
 
 
 
应用到的方法是:
 
 
 
android.widget.SimpleAdapter.SimpleAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to)
 
第2个参数data:每个Item即是一个Map,多个Map放在一个List中间。这个List是一个鸠合工具。,每一个map中应该包含所有在from参数中指定的键;(比方,data里放入图片和文字)
 
第3个参数resource:一个自定义列表项的结构文件的资源ID。结构文件将起码应包含在to中定义了的ID。(通俗来说,即是先定义一个Item的模板)
 
第4个参数from:一个将被增加到Map映射上的键名
 
第5个参数to:将绑定命据的视图的ID,跟from参数对应,这些应该全是TextView。
 
常州网站开发培训举例申明,完备版代码如下:
 
 
 
结构文件activity3.xml的代码:
 
 
 
复制代码
 
<?xml version="1.0" encoding="utf-8"?>
 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 
    android:layout_width="match_parent"
 
    android:layout_height="match_parent"
 
    android:orientation="vertical" >
 
    <ListView
 
        android:id="@+id/listView1"
 
        android:layout_width="match_parent"
 
        android:layout_height="wrap_content" >
 
    </ListView>
 
</LinearLayout>
 
复制代码
 
下面新建一个结构文件activity_main_item.xml,作为一个Item的模板:
 
 
 
复制代码
 
<?xml version="1.0" encoding="utf-8"?>
 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 
    android:layout_width="match_parent"
 
    android:layout_height="wrap_content"
 
    android:orientation="horizontal"
 
    android:gravity="center" >
 
    <ImageView
 
        android:id="@+id/imageView1"
 
        android:layout_width="40dp"
 
        android:layout_height="40dp"
 
        android:src="@drawable/vae" />
 
    <TextView
 
        android:id="@+id/textView1"
 
        android:layout_width="match_parent"
 
        android:layout_height="wrap_content"
 
        android:text="TextView"
 
        android:textSize="20sp" />
 
</LinearLayout>
 
复制代码
 
这个结构文件展现的结果如下:
 
 
 
 
 
 
 
495033ba-d71d-40ba-a783-0d6cac53fdde
 
 
 
而后,MainActivity.java的代码如下:
 
 
 
复制代码
 
 1 import java.util.ArrayList;
 
 2 import java.util.HashMap;
 
 3 import java.util.List;
 
 4 import java.util.Map;
 
 5 import android.app.Activity;
 
 6 import android.os.Bundle;
 
 7 import android.view.Menu;
 
 8 import android.widget.ListView;
 
 9 import android.widget.SimpleAdapter;
 
10 public class MainActivity extends Activity {
 
11     private ListView listView;
 
12     @Override
 
13     protected void onCreate(Bundle savedInstanceState) {
 
14         super.onCreate(savedInstanceState);
 
15         setContentView(R.layout.activity_main);
 
16         listView = (ListView) findViewById(R.id.listView1);
 
17         //步骤1 一个列表项的内容,即是一个item
 
18         Map<String, Object> item1 = new HashMap<String, Object>();
 
19         item1.put("image", R.drawable.vae);
 
20         item1.put("name", "许嵩");
 
21         //步骤1:一个列表项的内容,即是一个item,即一个Map
 
22         Map<String, Object> item2 = new HashMap<String, Object>();
 
23         item2.put("image", R.drawable.smyh);
 
24         item2.put("name", "性命诚恳");
 
25         
 
26         //步骤2:把这些Map放到List中间
 
27         List<Map<String, Object>> data = new ArrayList<Map<String, Object>>();
 
28         data.add(item1);
 
29         data.add(item2);
 
30         
 
31         //留意:第四个参数和第五个参数要逐一对应
 
32         SimpleAdapter simpleAdapter = new SimpleAdapter(this, data,
 
33                 R.layout.activity_main_item, new String[] { "image", "name" },
 
34                 new int[] { R.id.imageView1, R.id.textView1 });
 
35         
 
36         //步骤3:将List中的内容添补到listView里面去
 
37         listView.setAdapter(simpleAdapter);
 
38     }
 
39     @Override
 
40     public boolean onCreateOptionsMenu(Menu menu) {
 
41         // Inflate the menu; this adds items to the action bar if it is present.
 
42         getMenuInflater().inflate(R.menu.main, menu);
 
43         return true;
 
44     }
 
45 }
 
复制代码
 
运转后,结果如下:
 
 
 
要是item对照多的话,可以用for轮回来做
 
 
 
 
 
 
 
2、自定义适配器BaseAdapter实现更天真的列表:【紧张】
 
 
 
以前应用SimpleAdapter,它的范围性在于,SimpleAdapter曾经将里面的结构(即每个item)封装好了,而后根据这种花样叠加起来,无法进行分外的处分。以是,这时候可以应用BaseAdapter实现更天真的列表。
 
 
 
(1)方法:现实上,即是本人写一个MyAdapter类,让它秉承BaseAdapter。必要复写该类的四个方法:
 
 
 
public int getCount() :通过 adapter报告 非常要在 listView(view) 中表现 几许条款 的数据。
 
public Object getItem(int position)
 
public long getItemId(int position)
 
public View getView(int position, View convertView, ViewGroup parent):用来 表现 【每个条款时】 会被挪用到的 方法。
 
非常紧张的是 getCount() 和 getView()。
 
 
 
(2)ListView 的优化:
 
 
 
重复应用convertView
 
应用ViewHolder进步在容器中查找组件的服从
 
完备版代码如下:
 
 
 
activity_main.xml:
 
 
 
复制代码
 
 1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 
 2     xmlns:tools="http://schemas.android.com/tools"
 
 3     android:layout_width="match_parent"
 
 4     android:layout_height="match_parent"
 
 5     android:paddingBottom="@dimen/activity_vertical_margin"
 
 6     android:paddingLeft="@dimen/activity_horizontal_margin"
 
 7     android:paddingRight="@dimen/activity_horizontal_margin"
 
 8     android:paddingTop="@dimen/activity_vertical_margin"
 
 9     tools:context=".MainActivity" >
 
10     <ListView
 
11         android:id="@+id/listView1"
 
12         android:layout_width="match_parent"
 
13         android:layout_height="match_parent" >
 
14     </ListView>
 
15 </LinearLayout>
 
复制代码
 
注:为了优化,第13行的代码必然要写match_parent,而不是wrap_content,注释略。
 
 
 
activity_main_item.xml:
 
 
 
复制代码
 
 1 <?xml version="1.0" encoding="utf-8"?>
 
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 
 3     android:layout_width="match_parent"
 
 4     android:layout_height="wrap_content"
 
 5     android:orientation="horizontal"
 
 6     android:gravity="center" >
 
 7     
 
 8     <ImageView
 
 9         android:id="@+id/imageView1"
 
10         android:layout_width="81dp"
 
11         android:layout_height="81dp"
 
12         android:src="@drawable/vae" />
 
13     <TextView
 
14         android:id="@+id/textView1"
 
15         android:layout_width="match_parent"
 
16         android:layout_height="wrap_content"
 
17         android:text="TextView" />    
 
18 </LinearLayout>
 
复制代码
 
Mainactivity.java:
 
 
 
复制代码
 
 1 package com.smyhvae.smyh005listview4;
 
 2 import android.app.Activity;
 
 3 import android.os.Bundle;
 
 4 import android.view.Menu;
 
 5 import android.view.View;
 
 6 import android.view.ViewGroup;
 
 7 import android.widget.BaseAdapter;
 
 8 import android.widget.ImageView;
 
 9 import android.widget.ListView;
 
10 import android.widget.TextView;
 
11 public class MainActivity extends Activity {
 
12     private ListView listView;
 
13     @Override
 
14     protected void onCreate(Bundle savedInstanceState) {
 
15         super.onCreate(savedInstanceState);
 
16         setContentView(R.layout.activity_main);
 
17         listView = (ListView) findViewById(R.id.listView1);
 
18         listView.setAdapter(new MyAdapter());
 
19     }
 
20     // 定义的数据
 
21     private int[] images = { R.drawable.vae, R.drawable.vae, R.drawable.vae,
 
22             R.drawable.vae, R.drawable.vae, R.drawable.vae, R.drawable.vae,
 
23             R.drawable.vae, R.drawable.vae, R.drawable.vae, R.drawable.vae,
 
24             R.drawable.vae };
 
25     private String[] names = { "性命01号", "性命02号", "性命03号", "性命04号", "性命05号",
 
26             "性命06号", "性命07号", "性命08号", "性命09号", "性命10号", "性命11号", "性命12号" };
 
27     
 
28     //自定义适配器
 
29     class MyAdapter extends BaseAdapter{
 
30         @Override
 
31         public int getCount() {
 
32             // TODO Auto-generated method stub
 
33             return names.length;
 
34         }
 
35         @Override
 
36         public Object getItem(int position) {
 
37             // TODO Auto-generated method stub
 
38             return names[position];
 
39         }
 
40         @Override
 
41         public long getItemId(int position) {
 
42             // TODO Auto-generated method stub
 
43             return position;
 
44         }
 
45         @Override
 
46         public View getView(int position, View convertView, ViewGroup parent) {
 
47             // TODO Auto-generated method stub
 
48 //            System.out.println("position=" + position);
 
49 //            System.out.println(convertView);
 
50 //            System.out.println("------------------------");
 
51             ViewHolder vh = new ViewHolder();
 
52             //通过下面的条件校验语句,来轮回行使。要是convertView = null ,表示屏幕上没有可以被重复行使的工具。
 
53             if(convertView==null){
 
54                 //建立View
 
55                 convertView = getLayoutInflater().inflate(R.layout.activity_main_item, null);
 
56                 vh.iv = (ImageView) convertView.findViewById(R.id.imageView1);
 
57                 vh.tv = (TextView) convertView.findViewById(R.id.textView1);
 
58                 convertView.setTag(vh);
 
59             }else{
 
60                  vh = (ViewHolder)convertView.getTag();
 
61             }
 
62             vh.iv.setImageResource(images[position]);
 
63             vh.tv.setText(names[position]);
 
64             return convertView;
 
65         }
 
66         
 
67     }
 
68     
 
69     static class ViewHolder{
 
70         ImageView iv;
 
71         TextView tv;
 
72     }
 
73     @Override
 
74     public boolean onCreateOptionsMenu(Menu menu) {
 
75         // Inflate the menu; this adds items to the action bar if it is present.
 
76         getMenuInflater().inflate(R.menu.main, menu);
 
77         return true;
 
78     }
 
79 }
 
复制代码
 
运转结果如下:
 
 
 
 
 
五、ListView革新分页
 
 
 
这个历程说来话长,具体参考本人另外一篇博客:
 
 
 
Android UI组件----自定义ListView实现动静革新
 

上篇:上一篇:android_button onclick点击的5种写法
下篇:下一篇:ANDROID-GSON解析JSON(JSON工具/JSON数组)