Android_listView_BaseAdapter

layout.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <ListView 
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        ></ListView>
</RelativeLayout>

layout_item.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" >
    <ImageView 
        android:id="@+id/image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
    <TextView 
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
</LinearLayout>

main.java

package com.example.day08_listview_baseadapter03_convertview;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
/**
 * 1.滚动控件
    1.ScrollView表示可以垂直方向滚动的控件
    2.HorizontalScrollView表示的是水平方向滚动的控件
    3. android:scrollbars="none"设置是否有滚动bar
    4.滚动控件之间可以嵌套
    *5.滚动控件只能有一个子控件

2.listview 列表控件 --适配器控件
  1.能展示具有相同的数据类型,相似的ui显示的多组数据
  2.适配器将数据转换成列表能够显示视图
  3.数据源可以是entrys,数组,集合
3.适配器填充数据
    1.arrayadapter 
       1.只能填充文本内容
       2.只能填充一个文本
    2.simpleadapter
       1.可以自定义item布局,里面可以包含图片,文本,button,checkbox等..
       2.可以设置多样的数据
       
       3.设置数据不方便

4.自定义适配器去完成复杂样式的布局view --- baseadapter
     1.baseadapter是抽象类,需要继承
     2.实现未实现的方法
     3.设置适配器
 * @author my
 *
 */
public class MainActivity extends Activity {

    private ListView lv;
    private List<Map<String,Object>> list;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lv = (ListView) findViewById(R.id.listView);
        list = new ArrayList<Map<String,Object>>();
        int[] image = {R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher,R.drawable.ic_launcher};
        Map<String,Object>map ;
        for (int i = 0; i < image.length; i++) {
            map = new HashMap<String, Object>();
            map.put("name", "杭州"+i);
            map.put("image", image[i]);
            list.add(map);
        }
        MyAdapter myAdapter = new MyAdapter();
        lv.setAdapter(myAdapter);
    }
class MyAdapter extends BaseAdapter{
    /**
     * 必须实现,决定适配器空间的item的数量
     * 通常返回数据源的长度,当返回0时,没有显示
     */
    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return list.size();
    }
    /** 
     * position表示的是item对应的索引
     *   通常根据索引来获得对应的数据,并返回  
     *   不是必须实现
     *     
     */
    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return list.get(position);
    }
    /**
     * position表示的是item对应的索引
     * 通常返回position作为item的id
     * 不是必须实现
     */
    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }
    
    /**
     * 用来确定一个item展示的视图view
     * 返回的view就表示需要显示的一个item的view
     * position表示的是当前显示的item的view所对应的索引
     * convertView 可以复用的view
     * parent 表示的是设置该适配器的适配器控件(listView)
     */
    //布局的复用
    /**
     * 问题: getview在滑动的过程中,会重复多次执行
        1.会多次将布局文件转换成view(需要读取xml文件和解析),而这个方法是耗时,消耗资源的方法
        2.会多次遍历view去找控件,会消耗时间和资源
          解决:convertView表示的是可以复用view
     */
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        View view = convertView;
        ViewHolder viewHolder ;
        //第一次调用
        if(view==null){
            //加载布局
            view = View.inflate(MainActivity.this, R.layout.layout_item, null);
            viewHolder = new ViewHolder();
            //实例化控件(因为是在当前布局中查找控件,所以必须使用view调用findViewById())
            viewHolder.text = (TextView) view.findViewById(R.id.text);
            viewHolder.image = (ImageView)view.findViewById(R.id.image);
            //设置标记
            view.setTag(viewHolder);
        }else{
            //得到标记获得viewHolder对象
            viewHolder = (ViewHolder) view.getTag();
            
        }
        //获得该索引位置的map集合
        Map<String,Object>map = list.get(position);
        //为适配器控件的每一条view设置数据
        viewHolder.text.setText((String)map.get("name"));
        viewHolder.image.setImageResource((Integer)map.get("image"));
        return view;
    }
    
}
//自定义类(一般都使用ViewHolder类来存view控件)
class ViewHolder{
    private TextView text;
    private ImageView image;
}


}

 

原文地址:https://www.cnblogs.com/fangg/p/5734687.html