android 34 ListView进阶

简介:

复制代码
public View getView(int position, View convertView, ViewGroup parent) {////convertView是一个缓存,每次返回一个layout给系统,安卓系统根据layout的布局和数据进行显示,
//这个layout同时会保存在convertView中,convertView缓存layout的个数为屏幕显示的列表的个数,
//但屏幕滚动的时候,会删除出屏幕了的数据加进新显示的数据,保证同一时间仅仅显示一个屏幕的数量的数据。
View layout=View.inflate(MainActivity.this, R.layout.item_generals, null);
}
复制代码

 MainActivity.java

复制代码
package com.sxt.day05_10;

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

import com.sxt.day05_10.entity.ContactBean;

import android.os.Bundle;
import android.app.Activity;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends Activity {

    //MVC
    ListView mlvContact;
    List<ContactBean> mContacts;
    ContactAdapter mAdapter;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initData();
        initView();
    }
    
    private void initView() {
        mlvContact=(ListView) findViewById(R.id.lvContact);
        mAdapter=new ContactAdapter(mContacts, this);//这里通过构造器将数据穿进去,好处是低耦合,内部类和外部类仅仅通过构造器进行数据的传递,没有别的地方有关联。以后将内部类提取出去成外部类的时候修改的代码量会少。
        mlvContact.setAdapter(mAdapter);
    }

    private void initData() {
        String[] names=getResources().getStringArray(R.array.names);//字符串数组资源
        String[] phones=getResources().getStringArray(R.array.phones);
        mContacts=new ArrayList<ContactBean>();
        for (int i = 0; i < phones.length; i++) {
            ContactBean contact=new ContactBean(names[i], phones[i]);
            mContacts.add(contact);
        }
    }

    class ContactAdapter extends BaseAdapter{
        List<ContactBean> contacts;
        MainActivity context;
        
        public ContactAdapter(List<ContactBean> contacts, MainActivity context) {
            super();
            this.contacts = contacts;
            this.context = context;
        }

        @Override
        public int getCount() {
            return contacts.size();
        }

        @Override
        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return 0;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            //convertView是一个缓存,缓存一屏幕数量的列表项,缓存是一个convertView缓存一个holder,一个hoder就是一条数据
            Log.i("main","position="+position);//如果一屏幕有10条,则第一屏getView函数调用10次,分别打印0-9,
            ViewHolder holder=null;
            if(convertView==null){//第一屏中没有返回那个layout所以convertView这个缓存为null,因为是新的所以convertView和holder都要重新创建并把holder加入convertView中,
                convertView=View.inflate(context, R.layout.item_contact, null);//将资源文件item_contact.xml创建出来
                holder=new ViewHolder();
                holder.tvName=(TextView) convertView.findViewById(R.id.tvName);
                holder.tvPhone=(TextView) convertView.findViewById(R.id.tvPhone);
                convertView.setTag(holder);//tag属性是View类的属性,是Object类型,现在convertView里面有了一屏幕数量的列表项数据了(一个convertView缓存一个holder)。
            }else{//以后的滚动,出现其他的列表项,直接从缓存中取出来(旧的布局,convertView和holder已经存在了并且已经加入进去了,但是数据还是要重新设置进去)
                holder=(ViewHolder) convertView.getTag();
            }
            //新的数据出现在屏幕的时候调用
            ContactBean contact=contacts.get(position);
            holder.tvName.setText(contact.getName());
            holder.tvPhone.setText(contact.getPhone());
            return convertView;//系统根据convertView进行显示
        }
        
        class ViewHolder{
            TextView tvName,tvPhone;
        }
    }
}
复制代码

main.xml

复制代码
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ListView
        android:id="@+id/lvContact"
        android:layout_width="match_parent"
        android:layout_height="match_parent"    layout_height和layout_width都要设置成match_parent,否则不能利用缓存机制
        android:divider="#ccc"
        android:dividerHeight="10dp"/>

</RelativeLayout>
复制代码
item_contact.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" >
    
    <TextView 
        android:id="@+id/tvName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:text="张飞"/>
    <TextView 
        android:id="@+id/tvPhone"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="13577889966"
        android:layout_marginLeft="10dp"
        android:textSize="20sp"/>
    
</LinearLayout>
复制代码

ContactBean.java

复制代码
public class ContactBean {

    private String name;
    private String phone;
    public String getName() {
        return name;
    }
复制代码

 


本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/4888401.html,如需转载请自行联系原作者


相关文章
|
6月前
|
API Android开发 开发者
Android UI设计: 什么是RecyclerView?为什么它比ListView更好?
Android UI设计: 什么是RecyclerView?为什么它比ListView更好?
85 2
|
6月前
|
API Android开发
Android高手进阶教程(十五)之---通过Location获取Address的使用!
Android高手进阶教程(十五)之---通过Location获取Address的使用!
63 1
|
5月前
|
API Android开发 开发者
`RecyclerView`是Android API 21引入的UI组件,用于替代ListView和GridView
【6月更文挑战第26天】`RecyclerView`是Android API 21引入的UI组件,用于替代ListView和GridView。它提供高效的数据视图复用,优化的布局管理,支持多种布局(如线性、网格),并解耦数据、适配器和视图。RecyclerView的灵活性、性能(如局部刷新和动画支持)和扩展性使其成为现代Android开发的首选,特别是在处理大规模数据集时。
65 2
|
6月前
|
XML Java Android开发
Android Studio App入门之列表视图ListView的讲解及实战(附源码 超详细必看)
Android Studio App入门之列表视图ListView的讲解及实战(附源码 超详细必看)
679 1
|
5月前
|
前端开发 API Android开发
25. 【Android教程】列表控件 ListView
25. 【Android教程】列表控件 ListView
164 2
|
5月前
|
存储 算法 Java
Android 进阶——代码插桩必知必会&ASM7字节码操作
Android 进阶——代码插桩必知必会&ASM7字节码操作
242 0
|
6月前
|
缓存 网络协议 Java
挑战全网,史上最全Android开发进阶,跳槽复习指南(1),掌握这6大技能体系
挑战全网,史上最全Android开发进阶,跳槽复习指南(1),掌握这6大技能体系
|
6月前
|
XML Java Android开发
如何美化android程序:自定义ListView背景
如何美化android程序:自定义ListView背景
63 2
|
6月前
|
算法 安全 Java
2024年Android最新知识体系最强总结(全方面覆盖Android知识结构,BAT面试&学习进阶)
2024年Android最新知识体系最强总结(全方面覆盖Android知识结构,BAT面试&学习进阶)
|
6月前
|
消息中间件 缓存 架构师
2024年阿里Android高级面试题分享,附学习笔记+面试整理+进阶书籍
2024年阿里Android高级面试题分享,附学习笔记+面试整理+进阶书籍