ListView

听说方舟出来了?直接so库?过来补一补安卓,万一再火一把呢?这种事情谁说的准

MainAcytivity :

package com.fitsoft;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    List<UserInfo> dataList;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ListView listView = findViewById(R.id.list_view);

        dataList = new ArrayList<>();
        for(int i=0; i<50; i++){
            UserInfo userInfo = new UserInfo();
            userInfo.name = "张三"+i;
            userInfo.age = 10+i;
            userInfo.sex = i%2==0?"男":"女";
            dataList.add(userInfo);
        }

        UserInfoListAdapter userInfoListAdapter = new UserInfoListAdapter();
        listView.setAdapter(userInfoListAdapter);

    }

    class UserInfoListAdapter extends BaseAdapter {
        @Override
        public int getCount() {
            return dataList.size();
        }

        @Override
        public Object getItem(int position) {
            return dataList.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

            View itemRootView = convertView;

            if(itemRootView == null){
                itemRootView = LayoutInflater.from(parent.getContext())
                              .inflate(R.layout.item_userinfo, parent, false);
            }

            TextView tvName = itemRootView.findViewById(R.id.tv_name);
            tvName.setText(dataList.get(position).name);
            TextView tvAge = itemRootView.findViewById(R.id.tv_age);
            tvAge.setText(String.valueOf(dataList.get(position).age) );
            TextView tvSex = itemRootView.findViewById(R.id.tv_sex);
            tvSex.setText(dataList.get(position).sex);

            ImageView imageView = itemRootView.findViewById(R.id.image);
            if(dataList.get(position).sex.equals("男")){
                imageView.setBackgroundResource(R.mipmap.ic_launcher);
            }else{
                imageView.setBackgroundResource(R.mipmap.ic_launcher_round);
            }

            return itemRootView;
        }
    }

    class UserInfo{
        String name;
        int age;
        String sex;
    }
}

SimpleAdapter没啥用,直接上BaseAdapterSimpleAdapter也是继承BaseAdapter,但是太局限了),首先创建内部类UserInfoListAdapter,使之继承BaseAdapter,然后实现里面的四个方法,这四个方法是Adapter这个接口里的,这里主要实现getView方法,首先判断convertView是否为空,如果不为空,直接复用,如果为空,则创建新的View,这里就涉及convertView的缓存机制了,ListView会自动判断加载n个新的convertView,至于n是多少呢,我就不知道怎么判断的了,当上下或者左右滑动的时候,为了提高效率,convertView就会复用,直到n个全被复用,就会复用下n个,如何创建一个新的View?利用LayoutInflater通过上下文对象找到布局管理器,通过布局管理器将item_userinfo这个xml布局转化为View对象,就创建成功了,然后利用这个对象就可以找到布局中的相关组件了(例如:itemRootView.findViewById(R.id.image);),别的都是很容易懂的,不解释了,下面放布局:

activity_main.xml

<?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=".MainActivity">

    <ListView
        android:id="@+id/list_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginLeft="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginRight="8dp"
        android:divider="#F00"
        android:dividerHeight="2dp"
        android:overScrollMode="never"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>

</android.support.constraint.ConstraintLayout>

其中overScrollMode是默认值为always的滑动到边界产生的效果,divider是分割线颜色

item_userinfo.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <ImageView
            android:id="@+id/image"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>

        <TextView
            android:id="@+id/tv_name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <TextView
            android:id="@+id/tv_age"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <TextView
            android:id="@+id/tv_sex"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>

</android.support.constraint.ConstraintLayout>

效果图:

效果图

原文地址:https://www.cnblogs.com/zqm-sau/p/11461844.html