Android笔记——ListView(列表视图)

来源:互联网 发布:域名备案被注销 编辑:程序博客网 时间:2024/06/05 14:18

             最近在安卓入门阶段苦苦挣扎,也看了很多入门的书,也一边在看兄弟连云课堂的视频,我觉得视频讲解的是我看过这么多讲解比较好的一个。其实他们讲解也是按照官方API文档来举例子讲解,下面我把这几天学习的内容整理一下,有些地方自己也没懂,欢迎大家指导。

 ListView介绍:

       列表视图是android中最常用的的一种视图组件,它以垂直列表的方式列出所需要显示的列表项,例如人名单,系统设置等,都用到了ListView组件。

       ListView is a view group that displays a list of scrollable items. The list items are automatically inserted to the list using an Adapter that pulls content from a source such as an array or database query andconverts each item result into a view that's placed into the list.


例1:

MainActivity.java

package com.example.listview;import android.os.Bundle;import android.app.Activity;import android.view.Menu;import android.view.View;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;public class MainActivity extends Activity implements OnItemClickListener{//实现接口选项单击事件private ListView lv;protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);lv = (ListView) findViewById(R.id.ListView01);//获取组件lv.setOnItemClickListener(this);//注册事件}public boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}//ListView的列表下的单击事件public void onItemClick(AdapterView<?> parent, View view, int position, long id) {System.out.println("parent ="+parent.getClass());System.out.println("view ="+view.getClass());TextView tv = (TextView)view;Toast.makeText(this, tv.getText(),Toast.LENGTH_SHORT).show();System.out.println("position ="+position);System.out.println("id ="+id);}}
main1.xml

 <ListView         android:id="@+id/ListView01"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:entries="@array/names"        android:divider="#ffffbb"        android:dividerHeight="20dp"        android:drawSelectorOnTop="false"        android:scrollbars="horizontal|vertical"        android:fastScrollEnabled="true"        android:listSelector="#00ffff">        </ListView>

strings.xml

<resources>    <string name="app_name">ListView</string>    <string name="action_settings">Settings</string>    <string name="hello_world">Hello world!</string><string-array name = "names">    <item >苹果</item>    <item >香蕉</item>    <item >草莓</item>    <item >芒果</item>    <item >芒果</item>    <item >芒果</item>    <item >芒果</item>    <item >芒果</item>    <item >芒果</item>    <item >芒果</item>    <item >芒果</item>    <item >芒果</item>    <item >芒果</item>    <item >芒果</item>    <item >芒果</item>    <item >芒果</item>    <item >芒果</item>    <item >芒果</item></string-array></resources>

@这是最基本的通过xml配置实现的一个简单的listview列表,如果当列表数据较多时,会有滚动条出现,通过strings.xml为列表填充内容。

 

ListActivity

The following example uses ListActivity, which is an activity that includesa ListView as its only layout element by default. It performs a query tothe ContactsProvider for a list of names and phone numbers.


例2:

MainActivity.2

public class MainActivity2 extends ListActivity{protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);String[] names = {"水果","蔬菜","粗粮","养生"};//填充数据(适配器)ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,names);//getListView();setListAdapter(adapter);}}

单选和多选模式

例3:

MainActiity3,java

public class MainActivity3 extends Activity{private ListView lv;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.layout_main3);lv = (ListView) findViewById(R.id.listView1);String[] citys = {"北京","上海","广州","深圳"};//单选模式//ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_single_choice,citys);//多选模式ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_multiple_choice,citys);//设置为单选模式//lv.setChoiceMode(ListView.CHOICE_MODE_SINGLE);//多选模式lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);lv.setAdapter(adapter);}}
main3.xml

<ListView        android:id="@+id/listView1"        android:layout_width="match_parent"        android:layout_height="wrap_content" >    </ListView>
效果图:


ListView实现图文列表


例4.

MainActivity4.java

public class MainActivity4 extends Activity{private ListView lv;protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.layout_main4);lv = (ListView) findViewById(R.id.listView1);//一个列表项内容Map<String, Object> item1 = new HashMap<String, Object>();item1.put("image", R.drawable.ic_launcher);item1.put("name", "小熊熊");Map<String, Object> item2 = new HashMap<String, Object>();item2.put("image", R.drawable.ic_launcher);item2.put("name", "小飞飞");List<Map<String, Object>> data = new ArrayList<Map<String,Object>>();data.add(item1);//添加data.add(item2);SimpleAdapter sa = new SimpleAdapter(this,data , R.layout.mian4_item, new String[]{"image","name"}, new int[]{R.id.imageView1,R.id.textView1});lv.setAdapter(sa);}}
main4.xml

<ListView        android:id="@+id/listView1"        android:layout_width="match_parent"        android:layout_height="wrap_content" >    </ListView>

main4_item.xml

<ImageView        android:id="@+id/imageView1"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:src="@drawable/ic_launcher" />    <TextView        android:id="@+id/textView1"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_weight="0.41"        android:text="TextView" />

效果图:


例5.


MainActivity5.java

public class MainActivity5 extends Activity{private ListView lv;protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main5);lv = (ListView) findViewById(R.id.listView1);lv.setAdapter(new MyAdapter());}private int[] images = {R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher};private String[] names = {"小白","小黑","小飞","小熊","小花","小美","小明"};//自定义适配器class MyAdapter extends BaseAdapter{//获取列表项的总数public int getCount() {return names.length;}//获取每一个列表项public Object getItem(int position) {return names[position];}//获取每个列表的IDpublic long getItemId(int position) {return position;}//循环调用创建列表项public View getView(int position, View convertView, ViewGroup parent) {//优化提高效率if(convertView == null){//创建viewconvertView = getLayoutInflater().inflate(R.layout.main5_item, null);ViewHolder vh = new ViewHolder();vh.iv = (ImageView) convertView.findViewById(R.id.imageView1);vh.tv = (TextView) convertView.findViewById(R.id.textView1);vh.iv.setImageResource(images[position]);vh.tv.setText(names[position]);convertView.setTag(vh);}else{ViewHolder vh = (ViewHolder) convertView.getTag();}//ImageView iv = (ImageView) convertView.findViewById(R.id.imageView1);//TextView tv = (TextView) convertView.findViewById(R.id.textView1);//iv.setImageResource(images[position]);//tv.setText(names[position]);return convertView;}}static class ViewHolder{ImageView iv;TextView tv;}}

main5_item.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="wrap_content"    android:gravity="center"    android:orientation="horizontal" >    <ImageView        android:id="@+id/imageView1"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:src="@drawable/ic_launcher" />    <TextView        android:id="@+id/textView1"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_weight="0.41"        android:text="TextView" /></LinearLayout>
main5.xml

<ListView        android:id="@+id/listView1"        android:layout_width="match_parent"        android:layout_height="wrap_content" >    </ListView>


ListView刷新分页


MainActivity6.java

public class MainActivity6 extends Activity implements OnScrollListener{private ListView lv;private ArrayList<News> news = new ArrayList<News>();MyAdapter adapter;protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main6);lv = (ListView) findViewById(R.id.listView1);lv.setOnScrollListener(this);//设置底部的视图View footer = getLayoutInflater().inflate(R.layout.load, null);lv.addFooterView(footer);initData();adapter = new MyAdapter();lv.setAdapter(adapter);}int index = 1;//数据计数器(索引)//初始化数据void initData(){for (int i = 0; i < 10; i++) {News n = new News();n.title = "title"+index;n.content = "content"+index;index++;news.add(n);}}//自定义适配器 class MyAdapter extends BaseAdapter{public int getCount() {return news.size();}public Object getItem(int position) {return news.get(position);}public long getItemId(int position) {return position;}public View getView(int position, View converView, ViewGroup parent) {ViewHolder vh = null;if (converView == null) {converView = getLayoutInflater().inflate(R.layout.main6_item, null);vh = new ViewHolder();vh.tvTitle = (TextView) converView.findViewById(R.id.textView1_title);vh.tvContent = (TextView) converView.findViewById(R.id.textView2_content);converView.setTag(vh);}else{vh = (ViewHolder) converView.getTag();}News n = news.get(position);vh.tvTitle.setText(n.title);vh.tvContent.setText(n.content);return converView;}} static class ViewHolder{ TextView tvTitle; TextView tvContent;  }  int visibleLastIndex = 0;//滚动的最后一个位置 public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {visibleLastIndex = firstVisibleItem+visibleItemCount-1;}public void onScrollStateChanged(AbsListView view, int scrollState) {if(visibleLastIndex ==adapter.getCount() && scrollState==OnScrollListener.SCROLL_STATE_IDLE){new LoadDataTread().start();}}//线程之间通信的桥梁private Handler handler = new Handler(){public void handleMessage(android.os.Message msg) {switch (msg.what) {case 1:adapter.notifyDataSetChanged();break;default:break;}}};//模拟加载数据class LoadDataTread extends Thread{public void run() {initData();try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}//通过handler处理器去通知主线程,说数据已加载完毕handler.sendEmptyMessage(1);}}}
News.java

package com.example.listview;/* * 新闻 */public class News {String title;String content;}

main6.xml
<ListView        android:id="@+id/listView1"        android:layout_width="fill_parent"        android:layout_height="fill_parent" >    </ListView>
main6_item.xml

 <TextView        android:id="@+id/textView1_title"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="TextView" />    <TextView        android:id="@+id/textView2_content"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="TextView" />
load.xml

<ProgressBar        android:id="@+id/progressBar1"        style="?android:attr/progressBarStyleSmall"        android:layout_width="wrap_content"        android:layout_height="wrap_content" />    <TextView        android:id="@+id/textView1"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="正在加载..." />
效果如图:


0 0