ListView-1(包括常用属性和方法)
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文件里
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 布局
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" 在布局中设置选中项背景图的方法
滑动到指定位置与记录当前的滑动位置
//记录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 布局
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的效率不高,所以下面这种为提高效率的方法
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实现多选模式
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
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下显示的视图 可用来模拟加载数据
线程之间的通讯详情见线程文章,下面为在子线程发送消息要主线程的适配器修改数据:
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-服务与线程(第一行代码)包含线程的总结