android 之自定义Adapter的用法

使用方法:

自定义一个类使其继承BaseAdapter,再在此类中实现四个方法

<1>getCount():得到数据源中元素的个数

<2>getItem(int position):根据索引位获取指定索引位得到数据值

<3>getItemAtID(int position):根据索引位返回行号

<4>getView(int position,View convertView,ViewGroup parent):每绘制一个条目就会自动调用一次当前方法

ListView的优化:就是重用条目

注意:这里ListView优化是有一个模型:我戏称为:"传送带模型"





示例代码:

前台展示:

<?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">

    <ListView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/listView_names"
        />

</LinearLayout>

后台逻辑:

package com.hsj.example.listviewwithbaseadapterdemo04;

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

public class MainActivity_bak01 extends AppCompatActivity {

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

        //自动修正的快捷键alt+回车
        this.listView_names= (ListView) this.findViewById(R.id.listView_names);


        this.listView_names.setAdapter(new MyAdapter());
    }

    /**
     * 面试题:自定义适配器需要继承哪个类,实现哪些方法,这些方法有什么用?
     *  答:继承BaseAdapter
     *  实现的方法有:
     *  getCount():得到数据源中元素的个数
     *  getItem(int position):根据索引位获取指定索引位的数据值
     *  getItemAtId(int position):根据索引位返回行号
     *  getView(int postion,View convertView,ViewGroup parent):每绘制一个条目就会自动调用一次当前方法
     *
     */
    private final class MyAdapter extends BaseAdapter{

        /**
         * 返回数据源中元素的个数
         *
         * 当返回值为0时,不会绘制任何条目,即不会调用getView()方法
         * 当返回值为1时,绘制一个条目,即调用一次getView()方法
         * 当返回值为2时,绘制两个条目,即调用两次getView()方法
         * ......
         * 当返回值为n 时,绘制n个条目,即调用n 次getView()方法
         *
         * 注意:实际绘制的条目数为=手机屏幕的高度/每一个条目的高度(如果不能整除,则取大于商的最小整数)
         * @return
         */
        @Override
        public int getCount() {
            System.out.println("==getCount()===");
            return 30;
        }


        /**
         * 根据指定的索引值返回指定索引处的元素值
         * @param position
         * @return
         */
        @Override
        public Object getItem(int position) {
            System.out.println("===getItem(int position="+position+")===");
            return null;
        }

        /**
         * 根据索引位返回行号,一般和position 相等
         * @param position
         * @return
         */
        @Override
        public long getItemId(int position) {
            System.out.println("==getItemId(int position="+position+")===");
            return position;
        }

        /**
         * 当每绘制一个条目时都会自动调用当前方法
         * @param position 当前正在绘制条目的索引值
         * @param convertView 缓存条目而存在的,当第一次绘制的条目上移,下面有新条目被绘制,此时convertView的值还是为null,
         *                    继续上移,直到第一次绘制的条目彻底移除我们的视线,此时下面应该会有新的条目出现了,此时出现的新条目就
         *                    不应该是重新实例化新的了,应该重用之前第一次移出去的条目,此时convertView 就不再为null了,它其实就是
         *                    第一次移除去的条目,重用即可提高效率
         *
         * @param parent 事件源
         *
         *
         *
         *  textView0=android.widget.TextView{53510070 V.ED.... ......ID 0,0-0,0}
            textView1=android.widget.TextView{53510dfc V.ED.... ......ID 0,0-0,0}
            textView2=android.widget.TextView{535116d0 V.ED.... ......ID 0,0-0,0}

        ListView的优化
            A:重用条目

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

            TextView textView=null;

            if(convertView==null){
                textView=new TextView(MainActivity_bak01.this);
            }else{
                textView= (TextView) convertView;
            }

            System.out.println("textView"+position+"="+textView);
            textView.setText("第"+position+"条数据!");


            System.out.println("=====getView(int position="+position+", View convertView="+convertView+", ViewGroup parent="+parent+")====");
            return textView;
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_37169103/article/details/80526434