Android中的listview目测是一个使用频率很高的组件,所以今天来总结一下listview的基础的用法。


一、最基本的绑定

java代码:

package com.tmnw;import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.os.Bundle;import android.widget.ArrayAdapter;import android.widget.ListView;public class MainActivity extends Activity {    /*----ListView MVC实现----*/    // model    List data;    // view    ListView lv;    // controller    ArrayAdapter adapter;    int size = 1;    // 初始化组件    private void initWidget() {        lv = (ListView) findViewById(R.id.list);    }    // 初始化绑定数据    private void initData() {        if (lv == null)            return;        // 第一步:获取数据源(model)        data = new ArrayList();        appendData();        // 第二步:new一个适配器(controller)        // 参数1:Context        // 参数2:listview的item布局        // 参数3:数据填充在item布局下的那个控件id        // 参数4:填充的数据        adapter = new ArrayAdapter(this, R.layout.simple_text,                R.id.text1, data);                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    // 第三步:给listview设置适配器(view)        lv.setAdapter(adapter);    }    // 添加数据    private void appendData() {        if (data == null)            return;        for (int i = 0; i < 10; i++) {            data.add("" + size++);        }    }    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initWidget();        initData();    }}

吐槽一下为神马把我代码里的空行去掉了,感觉好难看

xml代码:

activity_main.xml

        

simple_text.xml

<?xml version="1.0" encoding="utf-8"?>

画面效果:

整理一下Android中的ListView_第1张图片


二、给ListView添加头和尾部

java代码:

// 初始化组件    private void initWidget() {        lv = (ListView) findViewById(R.id.list);        header = getLayoutInflater().inflate(R.layout.simple_text, null);        ((TextView) header.findViewById(R.id.text1)).setText("这是一个头部");        footer = getLayoutInflater().inflate(R.layout.simple_text, null);        ((TextView) footer.findViewById(R.id.text1)).setText("加载中...");    }// 初始化绑定数据    private void initData() {        if (lv == null)            return;        // 第一步:获取数据源(model)        data = new ArrayList();        appendData();        // 第二步:new一个适配器(controller)        // 参数1:Context        // 参数2:listview的item布局        // 参数3:数据填充在item布局下的那个控件id        // 参数4:填充的数据         adapter = new ArrayAdapter(this, R.layout.simple_text,         R.id.text1, data);        // 第三步:给listview设置适配器(view)        // addHeaderView和addFooterView一定要有一个在setAdapter之前调用,或者2个都在setAdapter之前调用        lv.addHeaderView(header);        lv.setAdapter(adapter);        // 这里的参数null是数据,false说明是不能被选中的        lv.addFooterView(footer, null, false);        // 设置尾部无分割线,头部不想要分割线同理        lv.setFooterDividersEnabled(false);    }

只贴了部分修改过的代码

画面效果:

整理一下Android中的ListView_第2张图片

三、给ListView添加下滑加载中的一种实现方式

因为listview要滚动,所以给它添加滚动监听,为了书写简便,我让本Activity实现了OnScrollListener

public class MainActivity extends Activity implements OnScrollListener

java代码:

先增加几个变量

Button scrollInfo;Thread currentThread;

初始化组件代码修改下

lv = (ListView) findViewById(R.id.list);        scrollInfo = (Button) findViewById(R.id.scroll_info);        header = getLayoutInflater().inflate(R.layout.simple_text, null);        ((TextView) header.findViewById(R.id.text1)).setText("这是一个头部");        footer = getLayoutInflater().inflate(R.layout.simple_text, null);        ((TextView) footer.findViewById(R.id.text1)).setText("加载中...");


在onCreate中添加

lv.setOnScrollListener(this);

实现OnScrollListener方法:

@Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {    switch (scrollState) {    // 手指接触屏幕滑动    case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:        // 手指离开屏幕做惯性滑动    case OnScrollListener.SCROLL_STATE_FLING:        // 当滑动要最后一行时加载数据        if (view.getLastVisiblePosition() == view.getCount() - 1) {            // 可以通过网络加载数据等。            // 判断是否还是在加载中            if (currentThread == null || !currentThread.isAlive()) {                // 添加listview尾部控件加载中                lv.addFooterView(footer, null, false);                // 启动线程加载数据                currentThread = new DataLoadThread();                currentThread.start();            }        }        break;    // 不滑动    case OnScrollListener.SCROLL_STATE_IDLE:        break;    }}@Overridepublic void onScroll(AbsListView view, int firstVisibleItem,        int visibleItemCount, int totalItemCount) {    // firstVisibleItem:第一个显示的item位置    // visibleItemCount:当前显示的item个数    // totalItemCount:listview的item总个数    scrollInfo.setText("first:" + firstVisibleItem + "  visible:"            + visibleItemCount + "  total:" + totalItemCount);}

添加加载数据的线程

// 模拟加载数据    class DataLoadThread extends Thread {        @Override        public void run() {            try {                Thread.sleep(2000);                appendData();                // 因为Android控件只能通过主线程(ui线程)更新,所以用此方法                runOnUiThread(new Runnable() {                    @Override                    public void run() {                        // 加载完毕,移除尾部控件                        lv.removeFooterView(footer);                        // 当数据改变时调用此方法通知view更新                        adapter.notifyDataSetChanged();                    }                });            } catch (InterruptedException e) {                e.printStackTrace();            }        }    }

画面效果:

整理一下Android中的ListView_第3张图片

四、给ListView添加item点击事件

为了书写简便,我让本Activity实现了OnItemClickListener

public class MainActivity extends Activity implements OnScrollListener,        OnItemClickListener

java代码:

然后实现其方法

@Override    public void onItemClick(AdapterView<?> parent, View view, int position,            long id) {        Toast.makeText(                this,                "position:" + position + "  item:"                        + parent.getItemAtPosition(position).toString(),                Toast.LENGTH_LONG).show();    }

给listview添加监听

lv.setOnItemClickListener(this);


画面效果:

整理一下Android中的ListView_第4张图片

(模拟器出问题了使用了真机调试,没想到图片这么大,不过比模拟器快多了)


五、自定义适配器的使用

java代码:

// 自定义基础适配器    class MyAdapter extends BaseAdapter {        // listview显示的个数,如果有数据源有10条,而返回5,那么lv永远只能显示5条        // 所以最好就返回数据源的条数就好了        @Override        public int getCount() {            return data.size();        }        // 获取item绑定的数据时调用        @Override        public Object getItem(int position) {            return data.get(position);        }        // itemId        @Override        public long getItemId(int position) {            return position;        }        // lv显示几个item就会调用几次此方法,然后返回一个view对象显示        // position:位置        // convertView:如果lv不能显示全部的数据,那么滚动后会把从显示到不显示的View传进来复用        @Override        public View getView(int position, View convertView, ViewGroup parent) {            View view;            if (convertView == null) {                view = getLayoutInflater().inflate(R.layout.simple_text, null);            } else {                view = convertView;            }            TextView tv = (TextView) view.findViewById(R.id.text1);            tv.setText(data.get(position));            // 隔行变色,可以随心所欲            if ((position & 1) == 1) {                tv.setBackgroundResource(android.R.color.holo_green_light);            } else {                tv.setBackgroundResource(android.R.color.holo_red_light);            }            return view;        }    }


然后修改一下setAdapter()

// adapter = new ArrayAdapter(this, R.layout.simple_text,        // R.id.text1, data);        adapter = new MyAdapter();


画面效果:

整理一下Android中的ListView_第5张图片


源   码

(基础的到此为止,又是一个鸡肉味的周末)

更多相关文章

  1. Android常用代码
  2. android 蓝牙打印程序源代码
  3. [Android]代码实现StateListDrawable
  4. Android仿计算器布局代码
  5. linux和windows平台下下载android sdk的源代码【Z】
  6. Android修改源代码控制不锁屏
  7. Android 入门第八讲02-WebView的高级用法(Android调用 JS 代码( lo
  8. Android 模拟器创建参数说明
  9. 在eclipse中查看android SDK的源代码

随机推荐

  1. 关于 Java 你可能不知道的 10 件事
  2. 肥朝粉丝【当哥】的面试之旅
  3. Android(安卓)Asynchronous Http Client-
  4. 推荐普通开发者学习使用的 6 个 JDK 内建
  5. 【沙滩裤】的面经分享
  6. 图解源码 | SpringBoot中拓展SpringMVC原
  7. 从一次问题讨论聊聊我对阅读源码的思考
  8. 【黑子】的面经分享
  9. 从真实场景聊聊为啥Alfred能提高效率
  10. 10 个精妙的 Java 编码最佳实践