首页 > 代码库 > 自定义Adapter显示listView

自定义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>
 
//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>
 
//主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));
    }
}
 
 
//自定义的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;
    }
}
 
自定义的Adapter最重要的是getCount()和getView()方法,其余两个暂时不管
显示的效果图如下:
 
技术分享

自定义Adapter显示listView