在Android中就提供了专门列表显示条目的控件,ListView控件,ListView控件不是一次性加载全部数据,他是只加载用户在屏幕看得到的数据,当用户滑动的过程中在去加载新的数据,同时会自动销毁之前加载过的数据

什么时候使用ListView ?

答:当很多条目Item,显示都内容不同,数据不同,但是存放的位置是相似的,并且动态变化的条目Item(和数据),就可以用ListView

ListView的使用:

1.在布局中定义ListVIew

<?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"> <!-- 定义ListView -->
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</ListView> </RelativeLayout>

2.在Java代码中找到ListVIew,再设置适配器 setAdapter(ListAdapter的子类)


为何有BaseAdapter的出现 ?

答:无论是ArrayAdapter还是SimpleAdapter,都是都不够灵活,所以Android提供了BaseAdapter适配器,BaseAdapter可以自定义适配器。

BaseAdapter是 ArrayAdapter 和 SimpleAdapter 的父类,所以可以理解为:ArrayAdapter 和 SimpleAdapter 都去继承了BaseAdapter后进行了封装

ListView+BaseAdapter代码:

package liudeli.ui.all;

import android.app.Activity;
import android.app.AlertDialog;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.Toast; import java.util.ArrayList;
import java.util.List; import liudeli.ui.all.adapter.MyBaseAdapter;
import liudeli.ui.all.domain.Student; public class ListViewActivity2 extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_listview2); ListView listView = findViewById(R.id.listview); // 组装数据
List<Student> students = new ArrayList<>();
for (int i=0; i< 50; i++) {
students.add(new Student(i, "刘刘"+ i, 10 + 1));
} final ListAdapter listAdapter = new MyBaseAdapter(this, students);
listView.setAdapter(listAdapter); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
/**
* 获取点击条目的信息
* 还记得MyBaseAdapter里面的 public Object getItem(int position)方法吗
* 下面代码的listAdapter.getItem(position); 调用就是 public Object getItem(int position)方法
* 为什么能强制类型转换Student student =(Student),因为在BaseAdapter getItem()的类型是Student
*/
Student student =(Student) listAdapter.getItem(position); /**
* 还记得MyBaseAdapter里面的 public long getItemId(int position)方法吗
* 下面代码的listAdapter.getItemId(position); 调用就是 public long getItemId(int position)方法
*/
long itemId = listAdapter.getItemId(position); Toast.makeText(ListViewActivity2.this,
"student.toString:" + student.toString() + " itemId:" + itemId
, Toast.LENGTH_LONG).show(); new AlertDialog.Builder(ListViewActivity2.this)
.setMessage("student.toString:" + student.toString() + " itemId:" + itemId)
.setPositiveButton("我知道了", null)
.create().show();
}
});
} @Override
protected void onDestroy() {
super.onDestroy();
}
}

Student.java

package liudeli.ui.all.domain;

public class Student {

    private int id;
private String name;
private int age; public Student() {
} public Student(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
} public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @Override
public String toString() {
return "Student{" +
"id=" + id +
", name=" + name +
", age=" + age +
'}';
}
}

listview_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_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/ic_launcher" /> <LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toRightOf="@id/iv_icon"
android:orientation="vertical"
android:paddingLeft="20dp"> <TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="20dp"
android:textColor="@android:color/black"
android:text="姓名"
/> <TextView
android:id="@+id/tv_age"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16dp"
android:textColor="@android:color/black"
android:text="年龄"
/> </LinearLayout> <TextView
android:id="@+id/tv_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:text="ID"
android:layout_centerVertical="true"
android:layout_marginRight="20dp"
android:textColor="@android:color/black"
/> </RelativeLayout>

MyBaseAdapter代码:

package liudeli.ui.all.adapter;

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 java.util.List; import liudeli.ui.all.R;
import liudeli.ui.all.domain.Student; public class MyBaseAdapter extends BaseAdapter { private final String TAG = MyBaseAdapter.class.getSimpleName(); private Context context; private List<Student> students; // 布局加载器
private LayoutInflater layoutInflater; public MyBaseAdapter(Context context, List<Student> students) {
this.context = context;
this.students = students;
layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
} /**
* 此方法是返回 Item条目都总数,此方法非常重要
* @return
*/
@Override
public int getCount() {
return students.size();
} /**
* 这个方法是在listAdapter.getItem(position);调用
* 如果这个方法返回的是null,listAdapter.getItem(position)后使用就报错
* @param position
* @return
*/
@Override
public Object getItem(int position) {
return students.get(position);
} /**
* 这个方法是在listAdapter.getItemId(position);调用
* @param position
* @return
*/
@Override
public long getItemId(int position) {
return position + 10000;
} /**
* 此方法是返回 每一个条目Item的View,有十个条目Item就会执行此方法十次,此方法非常重要
* @param position
* @param convertView
* @param parent
* @return
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {
/*Log.d(TAG, "调用了一次 getView position:" + position);
TextView textView = new TextView(context);
textView.setTextColor(Color.BLUE);
textView.setTextSize(20);
textView.setText("调用了一次 getView position:" + position);
return textView;*/ View view = layoutInflater.inflate(R.layout.listview_item, null); // 取出布局加载器 加载等布局文件 控件ID
TextView name = view.findViewById(R.id.tv_name);
TextView age = view.findViewById(R.id.tv_age);
TextView id = view.findViewById(R.id.tv_id); // 布局加载器 加载等布局文件 控件和数据绑定
name.setText(students.get(position).getName());
age.setText(students.get(position).getAge() + "");
id.setText(students.get(position).getId() + ""); return view;
}
}

结果:

Android-ListView-(BaseAdapter使用)的更多相关文章

  1. Android(java)学习笔记133:ListViewProject案例(ListView + BaseAdapter + CheckBox)

    这个案例可能稍微复杂一点,我会讲述详细一点: 1.首先是AndroidManifest.xml: <?xml version="1.0" encoding="utf ...

  2. Android ListView理解之BaseAdapter

    ListView是Android开发过程中较为常见的组件之一,它将数据以列表的形式展现出来.一般而言,一个ListView由以下三个元素组 成: 1.View,用于展示列表,通常是一个xml所指定的. ...

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

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

  4. Android(java)学习笔记75:ListViewProject案例(ListView + BaseAdapter + CheckBox)

    这个案例可能稍微复杂一点,我会讲述详细一点: 1. 首先是AndroidManifest.xml: <?xml version="1.0" encoding="ut ...

  5. Android ListView加载更多

    先看效果: ListView的footer布局: <?xml version="1.0" encoding="utf-8"?> <Relati ...

  6. [Android分享] 【转帖】Android ListView的A-Z字母排序和过滤搜索功能

      感谢eoe社区的分享   最近看关于Android实现ListView的功能问题,一直都是小伙伴们关心探讨的Android开发问题之一,今天看到有关ListView实现A-Z字母排序和过滤搜索功能 ...

  7. Android -- ListView(SimpleAdapter) 自定义适配器

    aaarticlea/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA ...

  8. Android ListView简单实用

    layout创建: activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/ ...

  9. Android Listview & Adapter

    Listview主要有两个职责: 将数据填充到布局 处理用户的选择点击等操作 列表的显示需要三个元素: ListVeiw 用来展示列表的View 适配器(Adapter) 用来把数据映射到ListVi ...

  10. android listview getviewtypecount和getItemViewType

    package newdemo.jeno.listviewdemo; import android.app.Activity;import android.os.Bundle;import andro ...

随机推荐

  1. redmineBUG系统

    bitnami-redmine-2.6.3-0-linux-x64-installer.run 我的是linux 64位 官网下载bitnami-redmine http://bitnami.com/ ...

  2. LR11中webservice协议的性能测试应用

    使用LR11对webservice协议的接口测试应用 脚本开发步骤:1.打开vuser generator,新建一个脚本,选择webservice协议:2.选择Manage Services(服务管理 ...

  3. MySQL查看用户权限的两种方法

    http://yanue.net/post-96.html MySQL查看用户权限命令的两方法: 一. 使用MySQL grants MySQL grant详细用法见:http://yanue.net ...

  4. Oracle表结构转Mysql表结构

    1. fnc_table_to_mysql 主体程序 create or replace function fnc_table_to_mysql ( i_owner in string, i_tabl ...

  5. objective-C: NSString应该用initWithFormat? 还是 stringWithFormat?

    今天在看书上的一段代码时,发现NSString实例化时,有时用的是initWithFormat方法,有时用的是stringWithFormat,到底应该如何选择呢? 区别: 1.initWithFor ...

  6. 中文分词工具jieba中的词性类型

    jieba为自然语言语言中常用工具包,jieba具有对分词的词性进行标注的功能,词性类别如下: Ag 形语素 形容词性语素.形容词代码为 a,语素代码g前面置以A. a 形容词 取英语形容词 adje ...

  7. 基于NodeJS的14款Web框架

    摘要: 在几年的时间里,Node.js逐渐发展成一个成熟的开发平台,吸引了许多开发者.有许多大型高流量网站都采用Node.js进行开发,像PayPal, 此外,开发人员还可以使用它来开发一些快速移动W ...

  8. 01 lucene基础 北风网项目培训 Lucene实践课程 索引

    在创建索引的过程中IndexWriter会创建多个对应的Segment,这个Segment就是对应一个实体的索引段.随着索引的创建,Segment会慢慢的变大.为了提高索引的效率,IndexWrite ...

  9. Maven面试宝典啊

    一.Maven有哪些优点和缺点 优点如下: 简化了项目构建.依赖管理: 易于上手,对于新手可能一个"mvn clean package"命令就可能满足他的工作 便于与持续集成工具( ...

  10. How to Get the Length of File in C

    How to get length of file in C //=== int fileLen(FILE *fp) { int nRet = -1; int nPosBak; nPosBak = f ...