文章目录
一、ListView
一个ListView的创建需要3步:
- (1)ListView很简单,和别的View控件一样:都是在布局文件中定义和在Activity文件中声明和findViewById()
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/listview">
</ListView>
ListView listview=findViewById(R.id.listview);
-
(2)构建Adapter
-
(3)连接ListView与Adapter:
listview.setAdapter(adapter);
二、Adapter的构建
ListView使用的Adapter是ListAdapter。
ListAdapter的构建:
三、例子
1.ArrayAdapter
(1)简单使用
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<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"
tools:context=".MainActivity">
<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/lv1">
</ListView>
</LinearLayout>
MainActivity.java
String数组
public class MainActivity extends AppCompatActivity {
private ListView listView;
private ArrayAdapter<String> arrayAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
要显示的数据
String[] str={"Just","do","it"};
//创建ArrayAdapter(Context context,@LayoutRes int resource,Object[] objects)
arrayAdapter=new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,str);
//获取ListView对象,通过调用setAdapter方法为ListView设置Adapter设置适配器
listView= this.<ListView>findViewById(R.id.lv1);
listView.setAdapter(arrayAdapter);
}
}
List泛型容器
public class MainActivity extends AppCompatActivity {
private ListView listView;
//ArrayAdapter里的类型是容器List里的类型String
private ArrayAdapter<String> arrayAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
List<String> data = new ArrayList<>();
data.add("Just");
data.add("do");
data.add("it");
arrayAdapter=new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,data);
listView= this.<ListView>findViewById(R.id.lv1);
listView.setAdapter(arrayAdapter);
}
}
(2)自定义
四步:
- 定义Fruit类
- 定义Item的布局
- 定义继承ArrayAdapter的FruitAdapter
- 绑定到ListView上
定义Fruit类
package com.example.hello;
public class Fruit {
private String mName;
private int mImageId;
public Fruit(String name,int ImageId)
{
mName=name;
mImageId=ImageId;
}
public String getmName()
{
return mName;
}
public int getmImageId()
{
return mImageId;
}
}
定义Item的布局:layout.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="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/fruit_name"/>
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/fruit_image"/>
</LinearLayout>
定义继承ArrayAdapter的FruitAdapter
package com.example.hello;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.List;
public class FruitAdapter extends ArrayAdapter<Fruit> {
private int mresource;
public FruitAdapter(Context context, int resource, List<Fruit> objects) {
super(context, resource, objects);
mresource=resource;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Fruit fruit=getItem(position);
View view= LayoutInflater.from(getContext()).inflate(mresource,parent,false);
ImageView fruitImage=view.findViewById(R.id.fruit_image);
TextView fruitText=view.findViewById(R.id.fruit_name);
fruitImage.setImageResource(fruit.getmImageId());
fruitText.setText(fruit.getmName());
return view;
}
}
绑定到ListView上:MainActivity.java
package com.example.hello;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import androidx.appcompat.app.AppCompatActivity;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private ListView listView;
private FruitAdapter fruitAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
List<Fruit> data = new ArrayList<>();
data.add(new Fruit("banana",R.drawable.banana));
data.add(new Fruit("watermelon",R.drawable.watermelon));
fruitAdapter=new FruitAdapter(MainActivity.this,R.layout.layout,data);
listView= findViewById(R.id.lv1);
listView.setAdapter(fruitAdapter);
}
}
2.SimplerAdapter
(1)对条目创建自定义布局
listview_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="match_parent"
android:orientation="horizontal">
<ImageView
android:layout_width="100dp"
android:layout_height="100dp"
android:id="@+id/icon"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="100dp"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="40sp"
android:id="@+id/text1"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="30sp"
android:id="@+id/text2"/>
</LinearLayout>
</LinearLayout>
(2)数据源
List容器
public class MainActivity extends AppCompatActivity {
private ListView listView;
private List<Map<String ,Object>> arraylist;
private SimpleAdapter simpleAdapter;
private int[] icon={R.drawable.timg001,R.drawable.timg002,R.drawable.timg003};
private String[] str1={"Just","do","it"};
private String[] str2={"run","learn","play"};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
arraylist=new ArrayList<>();
//将Map<String,Object>添加进List中
for(int i=0;i<str1.length;i++)
{
Map<String ,Object> map = new HashMap<>();
map.put("icon",icon[i]);
map.put("str1",str1[i]);
map.put("str2",str2[i]);
arraylist.add(map);
}
simpleAdapter = new SimpleAdapter(
this,
arraylist,
R.layout.listview_item,
new String[]{"icon","str1","str2"},
new int[]{R.id.icon,R.id.text1,R.id.text2}
);
listView=findViewById(R.id.lv1);
listView.setAdapter(simpleAdapter);
}
}
3.BaseAdapter
四、ListView点击事件
1.匿名内部类的方式
类似Button的点击,设置监听器,再重写点击函数。
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Toast.makeText(MainActivity.this,str[i],Toast.LENGTH_SHORT).show();
}
});
参数:
- i:就是点击的条目的下标(第几个,从0开始)
2.数据必须是final
数据是String数组
用Str[i]
来获取点击条目的String内容。
public class MainActivity extends AppCompatActivity {
private ListView listView;
private ArrayAdapter<String> arrayAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final String[] str={"Just","do","it"};
arrayAdapter=new ArrayAdapter<>(this,android.R.layout.simple_list_item_activated_1,str);
listView= findViewById(R.id.lv);
listView.setAdapter(arrayAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Toast.makeText(MainActivity.this,str[i],Toast.LENGTH_SHORT).show();
}
});
}
}
数据是List泛型容器
用data.get(i)
来获取对应的List泛型容器中的String内容。
public class MainActivity extends AppCompatActivity {
private ListView listView;
private ArrayAdapter<String> arrayAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final List<String> data = new ArrayList<>();
data.add("Just");
data.add("do");
data.add("it");
arrayAdapter=new ArrayAdapter<>(this,android.R.layout.simple_list_item_activated_1,data);
listView= findViewById(R.id.lv);
listView.setAdapter(arrayAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
Toast.makeText(MainActivity.this,data.get(i),Toast.LENGTH_SHORT).show();
}
});
}
}