自定义Adapter显示listView
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自定义Adapter显示listView相关的知识,希望对你有一定的参考价值。
//xml文件,设置好listView,listView相当于一个view容器,可以向listView里面塞view形成item;
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout 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"
tools:context="com.example.www.myapplication.MainActivity">
<ListView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="10"
android:id="@+id/listView"/>
</android.support.constraint.ConstraintLayout>
<android.support.constraint.ConstraintLayout 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"
tools:context="com.example.www.myapplication.MainActivity">
<ListView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="10"
android:id="@+id/listView"/>
</android.support.constraint.ConstraintLayout>
//xml文件,写好listView中每一个item应该有的view,这里以两行文字为例
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="5"
android:textSize="20dp"
android:id="@+id/item_name"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top"
android:id="@+id/item_time" />
</LinearLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="5"
android:textSize="20dp"
android:id="@+id/item_name"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top"
android:id="@+id/item_time" />
</LinearLayout>
//主java代码如下:
package com.example.www.myapplication;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MainActivity extends Activity {
//List<Map<String,Object>>就是一列Map<String,Object>,
// 本程序将一个Map的值传给listView的item来显示
private List<Map<String,Object>> list = new ArrayList<>();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//接下来给list传入数据
//Map<String,Object>可以看作一列以String为记号的数据(可以是图片文字,等等)
Map<String,Object> map = new HashMap<>();
for (int i = 0; i<10; i++){
//给Map的传入数据,以"line1"为记号
map.put("line1","测试第一行");
//给Map的传入数据,以"line2"为记号
map.put("line2","测试第二行");
list.add(map);
}
ListView listView = (ListView) findViewById(R.id.listView);
listView.setAdapter(new MyAdapter(MainActivity.this,list));
}
}
import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MainActivity extends Activity {
//List<Map<String,Object>>就是一列Map<String,Object>,
// 本程序将一个Map的值传给listView的item来显示
private List<Map<String,Object>> list = new ArrayList<>();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//接下来给list传入数据
//Map<String,Object>可以看作一列以String为记号的数据(可以是图片文字,等等)
Map<String,Object> map = new HashMap<>();
for (int i = 0; i<10; i++){
//给Map的传入数据,以"line1"为记号
map.put("line1","测试第一行");
//给Map的传入数据,以"line2"为记号
map.put("line2","测试第二行");
list.add(map);
}
ListView listView = (ListView) findViewById(R.id.listView);
listView.setAdapter(new MyAdapter(MainActivity.this,list));
}
}
//自定义的Adapter代码如下:
package com.example.www.myapplication;
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 java.util.Map;
public class MyAdapter extends BaseAdapter {
private Context context;
//LayoutInflater 相当于一个解析器,可以把xml文件解析为View或者ViewGroup
private LayoutInflater Inflater;
private List<Map<String,Object>> list;
public MyAdapter(Context context, List<Map<String,Object>> list){
this.context = context;
Inflater = LayoutInflater.from(context);
this.list = list;
}
@Override
//这个方法返回的时ListView的item的个数,这个方法可以这么理解:
//listView的每个item都会向adapter索要数据,可以看作一个for循环,循环的次数就是list.size();
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
//listView一开始时空的,产生item的原理是,先判断我的下方是否有空间来创建item
//如果有(也就是v==null),就会用LayoutInflater来解析一个View给item来显示.如果
//没有空间了就不用解析,
if (v==null){
v = Inflater.inflate(R.layout.textview,parent,false);
}
TextView line1 = (TextView) v.findViewById(R.id.textView_1st);
TextView line2 = (TextView) v.findViewById(R.id.textView_2nd);
//将list中的第position个标记为"line1"和"line2"的数据赋给这两个TextView
line1.setText(list.get(position).get("line1").toString());
line2.setText(list.get(position).get("line2").toString());
return v;
}
}
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 java.util.Map;
public class MyAdapter extends BaseAdapter {
private Context context;
//LayoutInflater 相当于一个解析器,可以把xml文件解析为View或者ViewGroup
private LayoutInflater Inflater;
private List<Map<String,Object>> list;
public MyAdapter(Context context, List<Map<String,Object>> list){
this.context = context;
Inflater = LayoutInflater.from(context);
this.list = list;
}
@Override
//这个方法返回的时ListView的item的个数,这个方法可以这么理解:
//listView的每个item都会向adapter索要数据,可以看作一个for循环,循环的次数就是list.size();
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
//listView一开始时空的,产生item的原理是,先判断我的下方是否有空间来创建item
//如果有(也就是v==null),就会用LayoutInflater来解析一个View给item来显示.如果
//没有空间了就不用解析,
if (v==null){
v = Inflater.inflate(R.layout.textview,parent,false);
}
TextView line1 = (TextView) v.findViewById(R.id.textView_1st);
TextView line2 = (TextView) v.findViewById(R.id.textView_2nd);
//将list中的第position个标记为"line1"和"line2"的数据赋给这两个TextView
line1.setText(list.get(position).get("line1").toString());
line2.setText(list.get(position).get("line2").toString());
return v;
}
}
自定义的Adapter最重要的是getCount()和getView()方法,其余两个暂时不管
显示的效果图如下:
以上是关于自定义Adapter显示listView的主要内容,如果未能解决你的问题,请参考以下文章
转Android自定义Adapter的ListView的思路及代码
自定义listview数据源adapter时可以继承的类都有哪些
[Android] Android RecycleView和ListView 自定义Adapter封装类