zoukankan      html  css  js  c++  java
  • 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;
        }
  • 相关阅读:
    Jmeter+Jenkins持续集成(三、集成到Jenkins)
    Jmeter+Jenkins持续集成(一、环境准备)
    Git----基础常用的命令总结
    -第5章 多级菜单
    -第4章 变幻菜单
    -第3章 jQuery方法实现下拉菜单显示和隐藏
    -第2章 JS方法实现下拉菜单显示和隐藏
    DIV+CSS+PS实现背景图的三层嵌套以及背景图的合并
    -第1章 HTMLCSS方法实现下拉菜单
    前端常用效果-目录
  • 原文地址:https://www.cnblogs.com/yaowen/p/4888401.html
Copyright © 2011-2022 走看看