这个是我自学ListVew,在看视频过程中做的小案例
一:理解ListView
ListView是一种用来显示多个可滑动顼列表(item)的viewGruop.
需要使用Adapter将集合数据 和每一个Item所对应的布局动态适配到ListView中显示。
显示列表:ListView.setAdapter(adapter);
二.Adapter层次图
现在我们从最简单的的列表开始讲解:
1、ArrayAdapter
1.1-效果图
1.2、涉及到的知识点
setAdapter 显示列表
1.3、创建一个项目ListViewDemo01
1.4、布局文件activity_main.xml中的代码
<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/lv_main"
tools:context=".MainActivity">
</ListView>
1.5 创建一个Item.xml文件
<?xml version="1.0" encoding="utf-8"?>
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:textSize="20dp"
android:gravity="center_vertical"
android:layout_height="50dp">
</TextView>
1.6、 设置MainActivity.xml中的代码
package com.example.a20473.listviewdemo01;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
public class MainActivity extends AppCompatActivity {
private ListView lv_main;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv_main = findViewById(R.id.lv_main);
//准备集合数据
String [] data = {"A","B","C","D","E","F","H","I","J","K","L","M","N"};
//准备ArrayAdapter对象
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,R.layout.item,data);
//设置显示Adapter列表
lv_main.setAdapter(adapter);
}
}
简单的ArrayAdapter列表就制作完成了
2、SimpleAdapter
2.1 SimpleAdater参数的理解
第一个参数 context:上下文对象。
第二个参数 data:需要显示的数据集合。
第三个参数 resource:Item布局标识。
第四个参数 from:map对象中的key数组,用于得到相应的value。
第五个参数 to:item布局文件中的子view的id的数组。
效果图:
2.2 创建项目SimpleAdapter ,并准备好图片素材
2.3 设置主布局文件activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/lv_main"
tools:context=".MainActivity">
</ListView>
2.4 新建布局文件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:orientation="horizontal"
>
<ImageView
android:id="@+id/iv_item_icon"
android:layout_width="70dp"
android:layout_height="70dp"
android:src="@mipmap/f1"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:orientation="vertical"
android:layout_marginLeft="10dp"
>
<TextView
android:id="@+id/tv_item_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="name"/>
<TextView
android:id="@+id/tv_item_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="content"/>
</LinearLayout>
</LinearLayout>
2.4 设置主窗口的MainActivity.java
package com.example.a20473.simpleadapter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MainActivity extends AppCompatActivity {
private ListView lv_main;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv_main = findViewById(R.id.lv_main);
//准备好集合数据
List<Map<String,Object>> data = new ArrayList<Map<String,Object>>();
Map<String ,Object> map = new HashMap<String ,Object>();
map.put("icom",R.mipmap.f1);
map.put("name","name--1");
map.put("content","content--1");
data.add(map);
map = new HashMap<String ,Object>();
map.put("icom",R.mipmap.f2);
map.put("name","name--2");
map.put("content","content--2");
data.add(map);
map = new HashMap<String ,Object>();
map.put("icom",R.mipmap.f3);
map.put("name","name--3");
map.put("content","content--3");
map = new HashMap<String ,Object>();
map.put("icom",R.mipmap.f4);
map.put("name","name--4");
map.put("content","content--4");
data.add(map);
map = new HashMap<String ,Object>();
map.put("icom",R.mipmap.f5);
map.put("name","name--5");
map.put("content","content--5");
data.add(map);
map = new HashMap<String ,Object>();
map.put("icom",R.mipmap.f6);
map.put("name","name--6");
map.put("content","content--6");
data.add(map);
map = new HashMap<String ,Object>();
map.put("icom",R.mipmap.f7);
map.put("name","name--7");
map.put("content","content--7");
data.add(map);
map = new HashMap<String ,Object>();
map.put("icom",R.mipmap.f8);
map.put("name","name--8");
map.put("content","content--8");
data.add(map);
map = new HashMap<String ,Object>();
map.put("icom",R.mipmap.f9);
map.put("name","name--9");
map.put("content","content--9");
data.add(map);
map = new HashMap<String ,Object>();
map.put("icom",R.mipmap.f10);
map.put("name","name--10");
map.put("content","content--10");
data.add(map);
//MAP对象中的KEY数组,用于得到value
String[] from = {"icom","name","content"};
//item布局文件的子view的id数组
int[] to={R.id.iv_item_icon,R.id.tv_item_name,R.id.tv_item_content};
//准备SimpleAdapter
SimpleAdapter adapter = new SimpleAdapter(this,data,R.layout.item,from,to);
//显示列表
lv_main.setAdapter(adapter);
}
}
3.BaseAdapter
3.1BaseAdapter
字面意思就是 最基础的Adapter,也就是说,它可以做所有的事情。所以为什么说最实用最常用,原因就在于它的全能性,不 会像 ArrayAdapter等的封装好的类有那么多局限性,但是这样的话,使用起来自然会更加麻烦一点。他是一个抽象类,需要创 建一个类来实现他,
我们知道继承BaseAdapter需要重新四个方法:getCount、getItem、getItemId、getView。其中前三个都比较简单,而 getView稍微比较复杂。
3.2效果图(其实和上面的SimpleAdapter一样,只是用的方法不一样)
3.3创建一个项目BaseAdapter 并将准备好的素材放复制进去
3.4 先设置主布局文件的activity.xml中的文件
<?xml version="1.0" encoding="utf-8"?>
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/lv_main"
tools:context=".MainActivity">
</ListView>
3.5 创建一个布局文件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:orientation="horizontal"
>
<ImageView
android:id="@+id/iv_item_icon"
android:layout_width="70dp"
android:layout_height="70dp"
android:src="@mipmap/f1"/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:orientation="vertical"
android:layout_marginLeft="10dp"
>
<TextView
android:id="@+id/tv_item_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="name"/>
<TextView
android:id="@+id/tv_item_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="content"/>
</LinearLayout>
</LinearLayout>
3.6 创建一个类ShopInfo (在下面的 我们自定义List集合中要用)
package com.example.a20473.baseadapter;
//这个是每一行Item的数据信息封装类
public class ShopInfo {
private int icon;
private String name;
private String content;
public ShopInfo() {
super();
}
public ShopInfo(int icon, String name, String content) {
super();
this.icon = icon;
this.name = name;
this.content = content;
}
public int getIcon() {
return icon;
}
public void setIcon(int icon) {
this.icon = icon;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
@Override
public String toString() {
return "ShopInfo{" +
"icon=" + icon +
", name='" + name + '\'' +
", content='" + content + '\'' +
'}';
}
}
3.7 设置MainAcitity.java文件
package com.example.a20473.baseadapter;
import android.app.Activity;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MainActivity extends AppCompatActivity {
private ListView lv_main;
List<ShopInfo> data;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv_main = findViewById(R.id.lv_main);
//准备好集合数据 自定义集合
data = new ArrayList<ShopInfo>();
data.add(new ShopInfo(R.mipmap.f1,"name----1","cotent----1"));
data.add(new ShopInfo(R.mipmap.f2,"name----2","cotent----2"));
data.add(new ShopInfo(R.mipmap.f3,"name----3","cotent----3"));
data.add(new ShopInfo(R.mipmap.f4,"name----4","cotent----4"));
data.add(new ShopInfo(R.mipmap.f5,"name----5","cotent----5"));
data.add(new ShopInfo(R.mipmap.f6,"name----6","cotent----6"));
data.add(new ShopInfo(R.mipmap.f7,"name----7","cotent----7"));
data.add(new ShopInfo(R.mipmap.f8,"name----8","cotent----8"));
data.add(new ShopInfo(R.mipmap.f9,"name----9","cotent----9"));
data.add(new ShopInfo(R.mipmap.f10,"name----10","cotent----10"));
//准备BaseAdapter对象 它是抽象的 所以我们 要实例化继承它的类
MyAdapter adapter = new MyAdapter();
//显示列表
lv_main.setAdapter(adapter);
}
class MyAdapter extends BaseAdapter{
//返回集合数据中的数量
@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;
}
//返回指定下标所对应的item的View 对象
//position:下标
//convertView: 可复用的Item缓存对象 前n+1个为null
// parent : ListView对象
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null){
// 加载Item视图对象 得到View对象
convertView= View.inflate(MainActivity.this,R.layout.item,null);
}
//根据Position设置对应的数据
//得到当前行的数据对象
ShopInfo shopInfo = data.get(position);
//得到子View对象
ImageView imageView = convertView.findViewById(R.id.iv_item_icon);
TextView NameTV =convertView.findViewById(R.id.tv_item_name);
TextView ContentTv = convertView.findViewById(R.id.tv_item_content);
//设置数据
imageView.setImageResource(shopInfo.getIcon());
NameTV.setText(shopInfo.getName());
ContentTv.setText(shopInfo.getContent());
return convertView;
}
}
}