大家好,又见面了,我是你们的朋友全栈君。
代码语言: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