Android -- ListView(SimpleAdapter) 自定义适配器

技术分享

2.  代码

MainActivity

  

package com.himi;

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

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.Toast;

public class MainActivity extends Activity {

	private SimpleAdapter adapter;// 声明适配器对象

	private ListView listView; // 声明列表视图对象

	private List < Map < String , Object >> list;// 声明列表容器

	public static MainActivity ma;

	@ Override
	public void onCreate ( Bundle savedInstanceState ) {

		super.onCreate ( savedInstanceState );
		ma = this;
		// 实例化列表容器
		list = new ArrayList < Map < String , Object >> ( );
		listView = new ListView ( this );// 实例化列表视图
		// 实例一个列表数据容器
		Map < String , Object > map = new HashMap < String , Object > ( );
		// 往列表容器中添加数据
		map.put ( "item1_imageivew" , R.drawable.icon );
		map.put ( "item1_bigtv" , "BIGTV" );
		map.put ( "item1_smalltv" , "SMALLTV" );
		// 将列表数据添加到列表容器中
		list.add ( map );
		// 使用Android 提供的SimpleAdapter适配器,无法实现组件监听;
		// adapter = new SimpleAdapter(this, list, R.layout.main,
		// new String[] {"item1_imageivew", "item1_bigtv", "item1_smalltv" },
		// new int[] {R.id.iv, R.id.bigtv, R.id.smalltv });
		// --使用自定义适配器,可监听其ListView中每一项的事件监听
		MySimpleAdapter adapter = new MySimpleAdapter (
		                              this ,
		                              list ,
		                              R.layout.main ,
		                              new String [ ]
		                              {
		                                                            "item1_imageivew" ,
		                                                            "item1_bigtv" ,
		                                                            "item1_smalltv"
		                              } ,
		                              new int [ ]
		                              {
		                                                            R.id.iv ,
		                                                            R.id.bigtv ,
		                                                            R.id.smalltv
		                              } );
		// 为列表视图设置适配器(将数据映射到列表视图中)
		listView.setAdapter ( adapter );

		listView.setOnItemClickListener ( new OnItemClickListener ( ) {

			@ Override
			public void onItemClick ( AdapterView < ? > parent ,
			                              View view ,
			                              int position ,
			                              long id ) {

				// TODO Auto-generated method stub

				Toast.makeText ( MainActivity.this ,
				                              "你点击的是第:"
				                                                            + position
				                                                            + "项" ,
				                              Toast.LENGTH_SHORT )
				                              .show ( );

			}
		} );
		// //显示列表视图
		this.setContentView ( listView );
	}
}

 MySimpleAdapter

package com.himi;

import java.util.List;
import java.util.Map;
import android.app.AlertDialog;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.CompoundButton.OnCheckedChangeListener;

public class MySimpleAdapter extends BaseAdapter {

	//声明一个LayoutInflater对象(其作用是用来实例化布局)
	private LayoutInflater mInflater;

	private List < Map < String , Object >> list;//声明List容器对象

	private int layoutID; //声明布局ID

	private String flag[];//声明ListView项中所有组件映射索引

	private int ItemIDs[];//声明ListView项中所有组件ID数组

	public MySimpleAdapter (
	               Context context ,
	               List < Map < String , Object >> list ,
	               int layoutID , String flag[] , int ItemIDs[] ) {

		//利用构造来实例化成员变量对象
		this.mInflater = LayoutInflater.from ( context );
		this.list = list;
		this.layoutID = layoutID;
		this.flag = flag;
		this.ItemIDs = ItemIDs;
	}

	@ Override
	public int getCount ( ) {

		return list.size ( );//返回ListView项的长度
	}

	@ Override
	public Object getItem ( int arg0 ) {

		return 0;
	}

	@ Override
	public long getItemId ( int arg0 ) {

		return 0;
	}

	//实例化布局与组件以及设置组件数据
	//getView(int position, View convertView, ViewGroup parent)
	//第一个参数:绘制的行数
	//第二个参数:绘制的视图这里指的是ListView中每一项的布局
	//第三个参数:view的合集,这里不需要
	@ Override
	public View getView ( int position , View convertView ,
	                              ViewGroup parent ) {

		//将布局通过mInflater对象实例化为一个view
		convertView = mInflater.inflate ( layoutID , null );
		for ( int i = 0 ; i < flag.length ; i ++ ) {//遍历每一项的所有组件
			//每个组件都做匹配判断,得到组件的正确类型
			if (convertView.findViewById ( ItemIDs [ i ] ) instanceof ImageView) {
				//findViewById()函数作用是实例化布局中的组件
				//当组件为ImageView类型,则为其实例化一个ImageView对象
				ImageView iv = ( ImageView ) convertView
				                              .findViewById ( ItemIDs [ i ] );
				//为其组件设置数据
				iv.setBackgroundResource ( ( Integer ) list
				                              .get ( position )
				                              .get ( flag [ i ] ) );
			}
			else if (convertView.findViewById ( ItemIDs [ i ] ) instanceof TextView) {
				//当组件为TextView类型,则为其实例化一个TextView对象
				TextView tv = ( TextView ) convertView
				                              .findViewById ( ItemIDs [ i ] );
				//为其组件设置数据
				tv.setText ( ( String ) list.get (
				                              position )
				                              .get ( flag [ i ] ) );
			}
		}
		//为按钮设置监听
		( ( Button ) convertView.findViewById ( R.id.btn ) )
		                              .setOnClickListener ( new View.OnClickListener ( ) {

			                              @ Override
			                              public void onClick ( View v ) {

				                              //这里弹出一个对话框,后文有详细讲述
				                              new AlertDialog.Builder (
				                                                            MainActivity.ma )
				                                                            .setTitle ( "自定义SimpleAdapter" )
				                                                            .setMessage ( "按钮成功触发监听事件!" )
				                                                            .show ( );
			                              }
		                              } );
		//为复选框设置监听
		( ( CheckBox ) convertView.findViewById ( R.id.cb ) )
		                              .setOnCheckedChangeListener ( new OnCheckedChangeListener ( ) {

			                              @ Override
			                              public void onCheckedChanged (
			                                                            CompoundButton buttonView ,
			                                                            boolean isChecked ) {

				                              //这里弹出一个对话框,后文有详细讲述
				                              new AlertDialog.Builder (
				                                                            MainActivity.ma )
				                                                            .setTitle ( "自定义SimpleAdapter" )
				                                                            .setMessage ( "CheckBox成功触发状态改变监听事件!" )
				                                                            .show ( );
			                              }
		                              } );
		return convertView;
	}
}

 Layout

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/iv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/bigtv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="20sp" />

        <TextView
            android:id="@+id/smalltv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="10sp" />
    </LinearLayout>

    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:focusable="false"
        android:text="button" />

    <CheckBox
        android:id="@+id/cb"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:focusable="false" />

</LinearLayout>

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。