• 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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent">
</ListView>
</LinearLayout>

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

2复杂ListView的用法

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

activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" > <ListView
android:layout_height="match_parent"
android:layout_width="match_parent"
android:id="@+id/lv">
</ListView> </RelativeLayout>

item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content" > <ImageView
android:id="@+id/iv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher"
android:layout_centerVertical="true"
android:layout_marginRight="10dp"/> <TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/iv"
android:layout_marginTop="10dp"
android:textSize="22sp"
android:text="姓名"/>
<TextView
android:id="@+id/tv_age"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@id/iv"
android:layout_below="@id/tv_name"
android:textSize="16sp"
android:text="年龄"/> </RelativeLayout>

布局填充器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<Teacher> data = new ArrayList<Teacher>();
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<Teacher> data;
private Context context;
private LayoutInflater mInflater; public MyAdapter(List<Teacher> 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

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" > <TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:paddingBottom="5dp"
android:paddingTop="5dp"
android:text="闺蜜列表"
android:textSize="22sp" /> <ListView
android:id="@+id/lv"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1" />
- <LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" > <Button
android:id="@+id/bt_pre"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:enabled="false"
android:text="上一页" /> <Button
android:id="@+id/bt_next"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="下一页" />
</LinearLayout> </LinearLayout>

item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" > <ImageView
android:id="@+id/iv_head"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher" /> <TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_toRightOf="@id/iv_head"
android:text="老师" /> <TextView
android:id="@+id/tv_phone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/tv_name"
android:layout_toRightOf="@id/iv_head"
android:text="13787009878" /> </RelativeLayout>

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

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<Friend> queryFriendsLimit(int startIndex, int block) {
List<Friend> infos = new ArrayList<Friend>();
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<Friend> infos;
private LayoutInflater mInflater; public void setInfos(List<Friend> infos) {
this.infos = infos;
} public MyAdapter(List<Friend> 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<Friend> 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<Friend> 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;
}
} } }

对于ListView的一些用法(一)的更多相关文章

  1. Android listview与adapter用法

    listview与adapter用法 博客分类: android   一个ListView通常有两个职责. (1)将数据填充到布局. (2)处理用户的选择点击等操作. 第一点很好理解,ListView ...

  2. Android listview与adapter用法(BaseAdapter + getView)

    Android listview与adapter用法http://www.cnblogs.com/zhengbeibei/archive/2013/05/14/3078805.html package ...

  3. listview与adapter用法

    Android listview与adapter用法 listview与adapter用法 博客分类: android   一个ListView通常有两个职责. (1)将数据填充到布局. (2)处理用 ...

  4. Android—— ListView 的简单用法及定制ListView界面

    一.ListView的简单用法 2. 训练目标 1) 掌握 ListView 控件的使用 2) 掌握 Adapter 桥梁的作用 实现步骤: 1)首先新建一个项目, 并让ADT 自动帮我们创建好活动. ...

  5. Django的ListView超详细用法(含分页paginate功能)

    开发环境: python 3.6 django 1.11 场景一 经常有从数据库中获取一批数据,然后在前端以列表的形式展现,比如:获取到所有的用户,然后在用户列表页面展示. 解决方案 常规写法是,我们 ...

  6. ListView灵活的用法

    以下是示例的效果图: WinForm的ListView控件是可以分组显示的,还可排序. 可以把ListView的View属性设置为Details 完整项目请到下面网址查找下载 http://hover ...

  7. Android之ListView——ArrayAdapter的用法学习

    当我们使用ListView时,必不可少的便会使用到adapter,adapter的用处就像是一个水管接口,把你想展现的数据与你希望展现的布局样式通过某种协定结合起来. ArrayAdapter针对每个 ...

  8. android的listview的详细用法

    listview是android开发中的一个极其重要的控件.所以,要学会android,如果这个不会,基本是不会android的. 这里按照几个步骤介绍这个控件的使用. 1. 使用API中ArrayA ...

  9. ListView 和 Adapter用法

    一个ListView通常有两个职责. (1)将数据填充到布局. (2)处理用户的选择点击等操作. 第一点很好理解,ListView就是实现这个功能的.第二点也不难做到,在后面的学习中读者会发现,这非常 ...

随机推荐

  1. Web API 入门 二 媒体类型

    还是拿上面 那篇 Web API 入门 一  的那个来讲 在product类中加一个时间属性

  2. phpstudy一系列安装问题

    phpStudy是一款PHP调试环境的程序集成包,该程序包集成最新的Apache+PHP+MySQL+phpMyAdmin+ZendOptimizer,一次性安装,无须配置即可使用,是非常方便.好用的 ...

  3. node.js初识06

    node中的fs文件系统 var http = require("http"); var fs = require("fs"); var server = ht ...

  4. (3)Python3笔记之变量与运算符

    一.变量 1). 命名规则: 1.  变量名不能使用系统关键字或保留关键字 2. 变量区分大小写 3. 变量命名由字母,数字,下划线组成但不能以数字开头 4. 不需要声明变量类型  是 a = 1  ...

  5. chrome 搜索 jsonView

    1.打开 https://github.com : 2.搜索 jsonView 链接:https://github.com/search?utf8=%E2%9C%93&q=jsonview: ...

  6. js单双引号

    JavaScript单双引号的使用没有严格的要求,单独出现的时候,用单用双都可以的,但是如果一起出现的话就要严格区分了

  7. Cassandra创建第一个用户

    Cassandra配置文件cassandra.yaml 的配置项, 默认是 authenticator: AllowAllAuthenticator 现在想创建Cassandra的用户,但是如果保持以 ...

  8. 交替最小二乘ALS

    https://www.cnblogs.com/hxsyl/p/5032691.html http://www.cnblogs.com/skyEva/p/5570098.html 1. 基础回顾 矩阵 ...

  9. java集合类图

  10. 把object转成JSONObject JSON.toJSON

    把object转成JSONObject JSON.toJSON public void onNext(Object o) { LogUtil.i("getFavorites", & ...