博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
对于ListView的一些用法(一)
阅读量:4654 次
发布时间:2019-06-09

本文共 14460 字,大约阅读时间需要 48 分钟。

  • ScrollView:只能用于控件比较少的界面,如果数据有上千上万条,那么使用ScrollView就不好了,因为ScrollView就把所有的控件进行初始化,这是非常消耗性能的操作,所以android就设计了一个类ListView来专门处理列表数据条目的显示。
  • ListView:处理条目比较多,并且每个条目都非常相似的场景。就是一个条目控件,会自动回收没有在屏幕上显示的控件,来优化性能。

对于ListView和BaseAdapter

1简单的用法

MainActivity.java

package com.example.listview;import android.os.Bundle;import android.app.Activity;import android.util.Log;import android.view.Menu;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ListView;import android.widget.TextView;public class MainActivity extends Activity {    protected static final String TAG = "MainActivity";    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //找到ListView        ListView lv = (ListView) findViewById(R.id.lv);        //给ListView设置数据(设置适配器     基本适配器)        lv.setAdapter(new BaseAdapter() {            //加工ListView需要的条目    int position 条目的下标            @Override            public View getView(int position, View convertView, ViewGroup parent) {                Log.i(TAG, "position:"+position);                TextView tv = new TextView(MainActivity.this);                tv.setText("人生自古谁没有年轻的时候"+position);                tv.setTextSize(20);                return tv;            }            @Override            public long getItemId(int position) {                return 0;            }            @Override            public Object getItem(int position) {                return null;            }            //控制条目的数量            @Override            public int getCount() {                return 100;            }        });    }}

activity_main.xml

上图就是ListView控件的基本图像

2复杂ListView的用法

首先要创建一个ListView和一个条目上的内容

activity_main.xml

item.xml

布局填充器layoutinflate:可以把res/layout下面的资源加载到内存,即可以把xml布局变成Java对象。一般就是加载item.xml上的东西

MainActivity.java

package com.example.listiview;import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.content.Context;import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ListView;import android.widget.TextView;import cn.itcast.wh08.lv.domain.Teacher;public class MainActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);                ListView lv = (ListView) findViewById(R.id.lv);        //模拟对象集合的数据 一般数据都是来自于网络,或者数据库               List
data = new ArrayList
(); for(int i = 0;i<100;i++){ data.add(new Teacher(i, "隔壁老王"+i, i+20)); } //适配器 MyAdapter adapter = new MyAdapter(data, this); //设置适配器 lv.setAdapter(adapter); } //适配器 private class MyAdapter extends BaseAdapter{ private List
data; private Context context; private LayoutInflater mInflater; public MyAdapter(List
data, Context context) { super(); this.data = data; this.context = context; //获取布局加载器 mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); } @Override public int getCount() { return data.size(); } //返回条目指定位置的数据 @Override public Object getItem(int position) { return data.get(position); } @Override public long getItemId(int position) { return 0; } //加工条目 @Override public View getView(int position, View convertView, ViewGroup parent) { //使用布局加载器加载布局 View view = mInflater.inflate(R.layout.item, null); //找到条目对应的控件 TextView tv_name = (TextView) view.findViewById(R.id.tv_name); TextView tv_age = (TextView) view.findViewById(R.id.tv_age); //获取条目对应的数据 Teacher info = data.get(position); //把数据绑定给控件 tv_name.setText(info.name); tv_age.setText(info.age+""); return view; } }}

 

Teacher.java

package com.example.listview.vo;public class Teacher {    public int _id;    public String _name;    public int age;    public Teacher(int _id, String _name, int age) {        super();        this._id = _id;        this._name = _name;        this.age = age;    }    public Teacher() {        super();    }    }

3.与数据库结合来显示

  • mode 数据模型(数据) :要被显示到ListView上的数据集合
  • view 视图(展示数据) : ListView
  • controller控制层(把数据展示到空间上) : 适配器Adapter

我们还是要先建立ListView控件和item控件

activity_main.xml

-

item.xml

先建立一个数据库,为了得到数据。

MySqliteOpenHelper.java

package com.example.lisview.db;import android.content.ContentValues;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteDatabase.CursorFactory;import android.database.sqlite.SQLiteOpenHelper;public class MySqliteOpenHelper extends SQLiteOpenHelper {    private static SQLiteOpenHelper mInstance;    public static synchronized SQLiteOpenHelper getInstance(Context context) {        if (mInstance == null) {            mInstance = new MySqliteOpenHelper(context, "itcast.db", null, 1);        }        return mInstance;    }    public MySqliteOpenHelper(Context context, String name,            CursorFactory factory, int version) {        super(context, name, factory, version);        // TODO Auto-generated constructor stub    }    @Override    public void onCreate(SQLiteDatabase db) {        // 设计一个表        db.execSQL("create table friends(_id integer primary key autoincrement,"                + "name text," + "phone text)");        // 初始化表数据        ContentValues values = new ContentValues();        for (int i = 0; i < 100; i++) {            values.clear();            values.put("name", "老师" + i);            values.put("phone", "13787990" + i);            db.insert("friends", null, values);        }    }    @Override    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {        // TODO Auto-generated method stub    }}

Friend.java

package com.example.lisview.vo;public class Friend {    public int _id;    public String name;    public String phone;    public Friend(int _id, String name, String phone) {        super();        this._id = _id;        this.name = name;        this.phone = phone;    }    public Friend() {        // TODO Auto-generated constructor stub    }}

对数据库的增、删、查、改

FriendDao.java

package com.example.lisview.dao;import java.util.ArrayList;import java.util.List;import android.content.Context;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;import com.example.lisview.db.MySqliteOpenHelper;import com.example.lisview.vo.Friend;public class FriendDao {    private Context context;    private SQLiteOpenHelper helper;    public FriendDao(Context context) {        this.context = context;        helper = MySqliteOpenHelper.getInstance(context);    }        /**     * 获取数据的总条目     * @return     */    public int queryAllSize(){        int size = 0;        SQLiteDatabase db = helper.getReadableDatabase();        if(db.isOpen()){            Cursor cursor = db.query("friends", new String[]{"*"}, null, null, null, null, null);            size = cursor.getCount();//获取Cursor的大小            cursor.close();            db.close();        }        return size;    }    /**     * 分页查询的     *      * @param startIndex     *            查询的开始下标     * @param block     *            每次查询的数据量     * @return     */    public List
queryFriendsLimit(int startIndex, int block) { List
infos = new ArrayList
(); SQLiteDatabase db = helper.getReadableDatabase(); if (db.isOpen()) { Cursor cursor = db.query("friends", new String[] { "*" }, null, null, null, null, null, startIndex + "," + block); while (cursor.moveToNext()) { int _id = cursor.getInt(0); String name = cursor.getString(1); String phone = cursor.getString(2); infos.add(new Friend(_id, name, phone)); } cursor.close(); db.close(); } return infos; }}

MyAdapter.java

package com.example.lisview.service;import java.util.List;import android.content.Context;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.TextView;import com.example.lisview.R;import com.example.lisview.vo.Friend;public class MyAdapter extends BaseAdapter {    private List
infos; private LayoutInflater mInflater; public void setInfos(List
infos) { this.infos = infos; } public MyAdapter(List
infos, Context context) { super(); this.infos = infos; // 布局加载器 mInflater = LayoutInflater.from(context); } // 返回条目的总数 @Override public int getCount() { return infos.size(); } // 得到item.xml代表的对象 @Override public Object getItem(int position) { return infos.get(position); } // 得到Item的id,不过在这里貌似没有用 @Override public long getItemId(int position) { return position; } // 得到Item的视图 @Override public View getView(int position, View convertView, ViewGroup parent) { View view = mInflater.inflate(R.layout.item, null); TextView tv_name = (TextView) view.findViewById(R.id.tv_name); TextView tv_phone = (TextView) view.findViewById(R.id.tv_phone); Friend info = infos.get(position); tv_name.setText(info.name); tv_phone.setText(info.phone); return view; }}

MainActivity.java

package com.example.lisview;import java.util.List;import android.app.Activity;import android.app.AlertDialog;import android.content.DialogInterface;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.Button;import android.widget.ListView;import com.example.lisview.dao.FriendDao;import com.example.lisview.service.MyAdapter;import com.example.lisview.vo.Friend;public class MainActivity extends Activity {    private ListView lv;    private Button bt_pre;    private Button bt_next;    private FriendDao friendDao;    private int block = 10;// 每一页获取10条数据    private int startIndex = 0;// 获取数据的下标    private MyAdapter adapter;    private int size;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        initView();    }    private void initView() {        lv = (ListView) findViewById(R.id.lv);        bt_pre = (Button) findViewById(R.id.bt_pre);        bt_next = (Button) findViewById(R.id.bt_next);        MyOnClickListener l = new MyOnClickListener();        bt_pre.setOnClickListener(l);        bt_next.setOnClickListener(l);        friendDao = new FriendDao(this);        size = friendDao.queryAllSize();        // 查询第一页数据        List
infos = friendDao.queryFriendsLimit(0, block); adapter = new MyAdapter(infos, this); lv.setAdapter(adapter); // 设置条目点击事件 lv.setOnItemClickListener(new MyOnItemClickListener()); } private class MyOnItemClickListener implements OnItemClickListener { @Override public void onItemClick(AdapterView
parent, View view, int position, long id) { //获取条目的数据 final Friend info = (Friend) adapter.getItem(position); //弹出对话框 new AlertDialog.Builder(MainActivity.this) .setTitle(info.name) .setMessage("请选择操作") .setPositiveButton("打电话", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //打电话需要拨号权限 Intent intent = new Intent(); intent.setAction(Intent.ACTION_CALL); intent.setData(Uri.parse("tel:"+info.phone)); startActivity(intent); } }) .setNegativeButton("发短信", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { //TODO:学员自己处理 } }) .show(); } } private class MyOnClickListener implements OnClickListener { @Override public void onClick(View v) { List
infos = null; switch (v.getId()) { case R.id.bt_pre: startIndex = startIndex - block; if (startIndex == 0) { bt_pre.setEnabled(false); } else { bt_pre.setEnabled(true); } bt_next.setEnabled(true); infos = friendDao.queryFriendsLimit(startIndex, block); adapter.setInfos(infos);// 把查询的数据设置给适配器 // 刷新界面 adapter.notifyDataSetChanged(); break; case R.id.bt_next: startIndex = startIndex + block; // 判断是否是最后页面的数据 // 现在页面的数据 startIndex=startIndex+block if ((startIndex + block) >= size) { // 已经是最后一页数据 bt_next.setEnabled(false); } else { bt_next.setEnabled(true); } bt_pre.setEnabled(true); infos = friendDao.queryFriendsLimit(startIndex, block); adapter.setInfos(infos);// 把查询的数据设置给适配器 // 刷新界面 adapter.notifyDataSetChanged(); break; default: break; } } }}

转载于:https://www.cnblogs.com/clarencezzh/p/5225440.html

你可能感兴趣的文章
IT男专用表白程序
查看>>
读《大道至简》第六章感想
查看>>
ef linq 中判断实体中是否包含某集合
查看>>
章三 链表
查看>>
Solution for Concurrent number of AOS' for this application exceeds the licensed number
查看>>
CSE 3100 Systems Programming
查看>>
IntelliJ IDEA 的Project structure说明
查看>>
Java Security(JCE基本概念)
查看>>
Linux Supervisor的安装与使用入门
查看>>
创建 PSO
查看>>
JasperReport报表设计4
查看>>
项目活动定义 概述
查看>>
团队冲刺04
查看>>
我的Python分析成长之路8
查看>>
泛型在三层中的应用
查看>>
SharePoint2010 -- 管理配置文件同步
查看>>
.Net MVC3中取得当前区域的名字(Area name)
查看>>
获得屏幕像素以及像素密度
查看>>
int与string转换
查看>>
adb命令 判断锁屏
查看>>