ListView-1(包括常用属性和方法)「建议收藏」

2022-09-07 16:40:42 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

代码语言:javascript复制
 1 package com.example.listview;
 2 
 3 import java.util.ArrayList;
 4 import java.util.HashMap;
 5 import java.util.List;
 6 import java.util.Map;
 7 
 8 import com.example.listview.R.id;
 9 
10 import android.app.Activity;
11 import android.os.Bundle;
12 import android.view.Menu;
13 import android.view.MenuItem;
14 import android.view.View;
15 import android.widget.AdapterView;
16 import android.widget.AdapterView.OnItemClickListener;
17 import android.widget.ArrayAdapter;
18 import android.widget.ListView;
19 import android.widget.SimpleAdapter;
20 import android.widget.Toast;
21 
22 public class MainActivity extends Activity {
23 
24     @Override
25     protected void onCreate(Bundle savedInstanceState) {
26         super.onCreate(savedInstanceState);
27         setContentView(R.layout.activity_main);
28         //例一:子条目为文字
29         /*ListView lv=(ListView) findViewById(id.listView1);
30         String[] ctype={"情景模式","主题模式","手机","程序管理","情景模式","主题模式","手机","程序管理","情景模式","主题模式","手机","程序管理"};
31         //方法一:指定文件
32 //        ArrayAdapter<CharSequence> adapter=ArrayAdapter.createFromResource(this, R.array.list, android.R.layout.simple_list_item_checked);
33         //方法二:指定数组
34         ArrayAdapter<String> adapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_activated_1,ctype);
35         lv.setAdapter(adapter);//将适配器与ListView关联
36         lv.setOnItemClickListener(new OnItemClickListener() {
37 
38             @Override
39             public void onItemClick(AdapterView<?> parent, View view,
40                     int position, long id) {
41                 String string = parent.getItemAtPosition(position).toString();//获取选择项的值
42                 Toast.makeText(MainActivity.this, string,Toast.LENGTH_SHORT).show();
43             }
44         });*/
45         
46         //例二:子条目为图片加文字
47         ListView lv=(ListView) findViewById(R.id.listView1);
48         List<Map<String,Object>> list=new ArrayList<Map<String,Object>>();
49         Map<String,Object> map=new HashMap<String,Object>();
50         map.put("name", "张三1");
51         map.put("image", R.drawable.ic_launcher);
52         list.add(map);
53         map=new HashMap<String,Object>();
54         map.put("name", "张三2");
55         map.put("image", R.drawable.ic_launcher);
56         list.add(map);
57         map=new HashMap<String,Object>();
58         map.put("name", "张三3");
59         map.put("image", R.drawable.ic_launcher);
60         list.add(map);
61         SimpleAdapter adapter=new SimpleAdapter(
62                 this, //上下文
63                 list,//listview绑定的数据
64                 R.layout.listview_item, //listview的子条目的布局的id
65                 new String[]{"image","name"}, //data数据中的map集合里的key
66                 new int[]{R.id.image,R.id.text}); //resource中的id
67         //String与int的数据必须一一对应
68         lv.setAdapter(adapter);//点击事件具体见Spinner下拉列表 69     }
70 
71 }

Spinner-下拉列表

在vakues里建立一个arrays.xml文件,为listview提供数据,也可以写在string.xml文件里

代码语言:javascript复制
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <resources>
 3      <string-array name="list">
 4         <item >第一条</item>
 5         <item >第二条</item>
 6         <item >第三条</item>
 7         <item >第四条</item>
 8         <item >第五条</item>
 9     </string-array>
10 </resources>

activity_main.xml 布局

代码语言:javascript复制
 1 <RelativeLayout 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 
 6     <ListView
 7         android:id="@ id/listView1"
 8          android:divider="#ff0000"
 9          android:dividerHeight="20px" 
10         android:layout_width="match_parent"
11         android:layout_height="wrap_content"
12         android:layout_alignParentLeft="true"
13         android:layout_alignParentTop="true" >
14     </ListView>
15 
16 </RelativeLayout>

android:cacheColorHint=”#000000″ 设置拖动背景颜色为透明 android:dividerHeigh=”30xp” 分割线高度 android:divider=”@drawable/ic_launcher” 分割线的背景 android:fadingEdge=”vertical” 上边和下边有黑色的阴影,值为none就没有阴影 android:drawSelectorOnTop=”false” 点击某条记录不放,颜色会成为选中项的背景色 android:scrollbars=”vertical” 只要值为horizontal或vertical时才会显示滚动条,并且会自动隐藏和显示 android:fastScrollEnabled=”true” 快速滚动效果,在快速滚动的时候旁边会出现一个小方块的快速滚动 android:listSelector=”” 选中的item的颜色

android:entries            列表数据源

android:fastScrollEnabled=”true” 可以拽着滚动条快速滑动

listView.setSelection(list.size()); // 将ListView定位到最后一行 传0也就是显示listview的第一行了

listview.setSelector(R.drawable.choose_item_right); //在代码中为ListView设置选中项的背景图片

android:listSelector=”@drawable/choose_item_right” 在布局中设置选中项背景图的方法

滑动到指定位置与记录当前的滑动位置

代码语言:javascript复制
//记录listView的上一次位置,滑到到这个位置
visiblePosition = lv_one_citys.getFirstVisiblePosition();
            if(lv_one_citys.getChildAt(0)!=null){
                top = lv_one_citys.getChildAt(0).getTop();//当前页第一个item隐藏的高度  也就是获取偏移量
            }

lv_one_citys.setSelectionFromTop(visiblePosition, top);

listview_item.xml 布局

代码语言:javascript复制
 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="match_parent"
 5     android:layout_gravity="center"
 6     android:orientation="horizontal" >
 7     <!-- 做为第二种方式的子条目布局 -->
 8    <ImageView android:id="@ id/image"
 9     android:layout_margin="10dp"
10        android:src="@drawable/ic_launcher"
11        android:layout_width="wrap_content"
12        android:layout_height="wrap_content"/>
13     <TextView android:layout_width="wrap_content"
14         android:layout_height="wrap_content"
15         android:layout_margin="10dp"
16         android:textSize="25sp"
17         android:textColor="#FF0000"
18         android:id="@ id/text"/>
19 </LinearLayout>

————————————————————————————————————————————–

由于上面的这种方法创建对象过多,list的效率不高,所以下面这种为提高效率的方法

代码语言:javascript复制
 1 package com.example.listview;
 2 
 3 import java.util.ArrayList;
 4 import java.util.HashMap;
 5 import java.util.List;
 6 import java.util.Map;
 7 
 8 import com.example.listview.R.id;
 9 
10 import android.app.Activity;
11 import android.content.Context;
12 import android.os.Bundle;
13 import android.view.LayoutInflater;
14 import android.view.Menu;
15 import android.view.MenuItem;
16 import android.view.View;
17 import android.view.ViewGroup;
18 import android.widget.AdapterView;
19 import android.widget.AdapterView.OnItemClickListener;
20 import android.widget.ArrayAdapter;
21 import android.widget.BaseAdapter;
22 import android.widget.ImageView;
23 import android.widget.ListView;
24 import android.widget.SimpleAdapter;
25 import android.widget.TextView;
26 import android.widget.Toast;
27 
28 public class MainActivity3 extends Activity {
29 
30     @Override
31     protected void onCreate(Bundle savedInstanceState) {
32         super.onCreate(savedInstanceState);
33         setContentView(R.layout.activity_main);
34         ListView lv=(ListView) findViewById(id.listView1);
35         lv.setAdapter(new MyAdapter(this));
36     }
37     static class MyAdapter extends BaseAdapter{
38         int[] icons={android.R.drawable.ic_dialog_info,
39             android.R.drawable.ic_btn_speak_now,android.R.drawable.ic_dialog_map,
40             android.R.drawable.ic_input_delete,android.R.drawable.ic_lock_idle_low_battery,
41             android.R.drawable.ic_lock_idle_lock,android.R.drawable.ic_menu_recent_history,
42             android.R.drawable.ic_notification_clear_all,android.R.drawable.ic_menu_send};
43         String[] title={"发送","删除","红包","提现","充值","装逼","加载","神坑","撤回"};
44         private Context context;
45         
46         public MyAdapter(Context context) {
47             super();
48             this.context = context;
49         }
50 
51         @Override
52         public int getCount() {
53             // TODO Auto-generated method stub
54             return title.length;
55         }
56 
57         @Override
58         public Object getItem(int position) {
59             // TODO Auto-generated method stub
60             return title[position];
61         }
62 
63         @Override
64         public long getItemId(int position) {
65             // TODO Auto-generated method stub
66             return position;
67         }
68   
69         @Override    parent 表示的是设置该适配器的适配器控件(listview)
70         public View getView(int position, View convertView, ViewGroup parent) {
71             ViewHolder holder;
72             if(convertView==null){//上翻下翻挤出来的布局对象
73                 holder=new ViewHolder();
74                 convertView=LayoutInflater.from(context).inflate(R.layout.listview_item, null);
75                 holder.iv=(ImageView) convertView.findViewById(id.image);//获取布局中的子id
76                 holder.tv=(TextView) convertView.findViewById(id.text);
77                 convertView.setTag(holder);//标记
78             }else{
79                 holder=(ViewHolder) convertView.getTag();//获取标记
80             }//避免了每次ID的查找
81             holder.iv.setImageResource(icons[position]);
82             holder.tv.setText(title[position]);
83             System.out.println(convertView);
84             return convertView;
85         }//对象的重复利用,那么也就对对象的成员变量重复利用
86         static class ViewHolder{//提高在容器中查找ID的效率
87             ImageView iv;
88             TextView tv;
89         }
90     }
91 }

ListView实现多选模式

代码语言:javascript复制
 1 package com.example.listview;
 2 
 3 import java.util.ArrayList;
 4 import java.util.HashMap;
 5 import java.util.List;
 6 import java.util.Map;
 7 
 8 import com.example.listview.R.id;
 9 
10 import android.app.Activity;
11 import android.os.Bundle;
12 import android.view.Menu;
13 import android.view.MenuItem;
14 import android.view.View;
15 import android.widget.AdapterView;
16 import android.widget.AdapterView.OnItemClickListener;
17 import android.widget.ArrayAdapter;
18 import android.widget.ListView;
19 import android.widget.SimpleAdapter;
20 import android.widget.Toast;
21 
22 public class MainActivity4 extends Activity {
23 
24     @Override
25     protected void onCreate(Bundle savedInstanceState) {
26         super.onCreate(savedInstanceState);
27         setContentView(R.layout.activity_main);
28         ListView lv=(ListView) findViewById(id.listView1);
29         final String[] arr=getResources().getStringArray(R.array.arrays);//将xml资源转化成数组
30         ArrayAdapter<String> adapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_multiple_choice,arr);
31         lv.setAdapter(adapter);
32         lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);//list多选模式
33         lv.setOnItemClickListener(new OnItemClickListener() {
34 
35             @Override
36             public void onItemClick(AdapterView<?> parent, View view,
37                     int position, long id) {
38                 System.out.println(view);
39                 Toast.makeText(MainActivity4.this, arr[position], 0).show();
40             }
41         });
42     }
43 
44 }

上面代码中的 R.array.arrays

代码语言:javascript复制
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <resources>
 3 
 4     <string name="app_name">列表视图</string>
 5     <string name="hello_world">Hello world!</string>
 6     <string name="action_settings">Settings</string>
 7     <string-array name="arrays">
 8         <item >爱情</item>
 9         <item >aa</item>
10         <item >bb</item>
11         <item >nn</item>
12         <item >mm</item>
13     </string-array>
14 </resources>

———————————————————————————————————————————————-

listview的一个重要方法

lv.addFooterView(v);//页脚视图,在Listview下显示的视图 可用来模拟加载数据

线程之间的通讯详情见线程文章,下面为在子线程发送消息要主线程的适配器修改数据:

代码语言:javascript复制
class Loading implements Runnable{
        public void run() {
            try {
                Thread.sleep(2000);//延迟加载
                MainActivity5.this.initData();//增加数据
            } catch (InterruptedException e) {
                e.printStackTrace();
            }//告诉主线程数据加载完毕,需要主线程更新
            handler.sendEmptyMessage(DATA_UPDATE);//发送标记
        }
    }

//线程之间的通讯机制
    private static final int DATA_UPDATE=0x1;//标记
    private android.os.Handler handler=new android.os.Handler(){
        public void handleMessage(android.os.Message msg) {
            switch (msg.what) {//收到标记执行该方法
            case DATA_UPDATE:
                myAdapter.notifyDataSetChanged();//通知数据改变
                break;
            default:
                break;
            }
        }
    };

myAdapter为ListView的适配器,切记handler是在主线程运行的,而且不能在子线程里面对UI进行操作,详情见

Service-服务与线程(第一行代码)包含线程的总结

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/154347.html原文链接:https://javaforall.cn

0 人点赞