(转)Android之自定义适配器

ListView作为一个实际开发中使用率非常高的视图,一般的系统自带的适配器都无法满足开发中的需求,这时候就需要开发人员来自定义适配器使得ListView能够有一个不错的显示效果。

有这样一个Demo ,实现图片文字混合列表。

package com.example.work;

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


import android.R.integer;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;

public class MainActivity extends Activity {
    private ListView listview;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listview = (ListView) findViewById(R.id.id_list);
        //这里设置三个列表项,每个列表项对应一个图片和对应的文字
        //图片数组
        int image[] = new int[]{R.drawable.tou1,R.drawable.tou3,R.drawable.he};
        //文字数组
        String text[] = {"连连看","斗地主","爱消除"};
        List<HashMap<String,Object>> list = new ArrayList<HashMap<String,Object>>();
        //将一个图片和一个文字放入一个map集合中,并将map集合依次加入到list集合中
        for(int i=0;i<image.length;i++)
        {
            HashMap<String, Object> map = new HashMap<String, Object>();
            map.put("text", text[i]);
            map.put("image", image[i]);
            list.add(map);
        }
        
        //MyAdapter是自定义的适配器
        MyAdapter myadapter = new MyAdapter(this, R.layout.layout_item, list);
        listview.setAdapter(myadapter);
        
        //点击列表项的响应事件
        listview.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
                    long arg3) {
                // TODO Auto-generated method stub
                Toast.makeText(MainActivity.this, "点击了第"+(arg2+1)+"项,内容:"+arg0.getItemAtPosition(arg2).toString(), 1).show();
            }
        });
    }



}

MainActivity

自定义适配器:

package com.example.work;

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


import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class MyAdapter extends BaseAdapter{
    
    private Context context;//上下文
    private int resourceId;//列表项的布局文件
    private List<HashMap<String, Object>> list; //数据源
    public MyAdapter(Context context,int resourceId,List<HashMap<String,Object>> list)
    {
        this.context = context;
        this.resourceId = resourceId;
        this.list = list;
    }
    //得到列表项的个数,即数据源的数据条数
    @Override
    public int getCount() {
        int count = 0;
        if(list!=null)
        return list.size();
        return count;
    }

    //得到对应position位置列表项的内容,即数据源list对应位置的数据
    @Override
    public Object getItem(int position) {
        
        return list.get(position);
    }
    
    //得到列表项的id
    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        //提高对对象的复用
        View view = null;
        if(convertView!=null)
        {
            view = convertView;
        }
        else 
        {
            view = LayoutInflater.from(context).inflate(resourceId, parent,false);
        }
        
        ViewHolder holder = (ViewHolder) view.getTag();
        if(holder==null)
        {
            holder = new ViewHolder();
            holder.textView = (TextView) view.findViewById(R.id.id_textview);
            holder.image = (ImageView) view.findViewById(R.id.id_image);
            view.setTag(holder);
        }
        //给相应位置的图片和文字赋内容
        holder.textView.setText(list.get(position).get("text").toString());
        holder.image.setImageResource((Integer) list.get(position).get("image"));
        
        //返回视图,这里的视图是一整个列表项的视图
        return view;
        
        
    }
    
    class ViewHolder
    {
        TextView textView;
        ImageView image;
    }
    

}

主Activity布局文件:

<LinearLayout 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"
  
    tools:context=".MainActivity" >

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

列表项布局:

<?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:layout_width="50dp"
        android:layout_height="50dp"
        android:id="@+id/id_image"
        />
    <TextView 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/id_textview"
        android:gravity="center_vertical"
        android:textStyle="bold|italic"
        />
</LinearLayout>

效果图:

本文转自:安卓开发_浅谈ListView(自定义适配器)

不努力,还要青春干什么?
原文地址:https://www.cnblogs.com/caidupingblogs/p/5902357.html