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>
时间: 2024-11-03 22:04:17

Android -- ListView(SimpleAdapter) 自定义适配器的相关文章

android listview中自定义适配器和复选框

下面的代码中报错了,代码如下 @Override p public View getView(final int position, final View convertView, final ViewGroup parent) { final ViewHolder viewHolder; View view = convertView; if (view == null) { view = LayoutInflater.from(mContext).inflate(R.layout.row,

细解ListView之自定义适配器

下面我们将以一个例子来讲述ListView之自定义适配器 首先我们看一下效果图: [分析] 首先:需要创建一个ListView控件,自定义适配器是为了实现自定义ListView的ListView_Item,所以我们应该在创建一个Item 然后书写自定义适配器,自定义适配器的时候需要继承BaseAdapter,然后实现它的未实现的4个方法,然后在实现自定义适配器的构造方法,其构造方法的参数为山下文对象,数据源,必须实现的4个方法主要是对数据源进行过操作, 然后考虑优化方面,我们使用了ViewHol

Android——ListView多布局+适配器(二)

Android--ListView多布局+适配器(二) <span style="font-size:18px;">package com.example.administrator.newstop.entity; /** * Created by Administrator on 2016/8/4. */ public class News { private String title; private String pubDate; private int img; p

android ListView SimpleAdapter 带图片

main.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:

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

ListView作为一个实际开发中使用率非常高的视图,一般的系统自带的适配器都无法满足开发中的需求,这时候就需要开发人员来自定义适配器使得ListView能够有一个不错的显示效果 有这样一个Demo ,实现图片文字混合列表 1 package com.example.work; 2 3 import java.util.ArrayList; 4 import java.util.HashMap; 5 import java.util.List; 6 7 8 import android.R.in

ListView使用自定义适配器的情况下实现适配器的文本和图标控件点击事件执行Activity界面中的方法

ListView使用的是自定义适配器,列表项的布局文件中含有文本和图标,实现文本区域和图标区域的点击事件. 实现思路:在自定义适配器MyArrayAdapter 类型中自定义接口和接口方法,分别设置文本区域和图标区域的OnClickListener,然后在activity界面中MyArrayAdapter实例实现这个接口. 1.listitem布局文件 <?xml version="1.0" encoding="utf-8"?> <LinearLa

ListView使用自定义适配器的情况下实现适配器的控件点击事件执行Activity界面中的方法

如果ListView使用的是自定义的适配器,比如MyArrayAdapter extends ArrayAdapter<String> 那么,如何实现适配器中的点击事件执行activity界面中的方法呢? 实现思路:在自定义适配器MyArrayAdapter 类型中自定义接口和接口方法,然后在activity界面中MyArrayAdapter实例实现这个接口. 较为完整的代码见上文. 1.MyArrayAdapter 关键代码 自定义接口和方法的代码如下: //列表项的单击事件监听接口 pub

Android自定义适配器和ListView的点击事件相结合的使用

下边演示一个使用ListView和自定义适配器的案例,点击ListView中的条目会出现一个对话框,进行成绩的修改,修改之后会立即通知适配器进行数据的重新加载,如下: (1).用于显示listView的布局文件: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" andro

Android ListFragment实例Demo(自定义适配器)

上一篇文章介绍了ListFragment,其中的ListView并没有自定义适配器,实际上在实际开发中常会用到自定义适配器,是实现更复杂的列表数据展示.所以这篇文章增加了自定义适配器,来进行ListView数据的展示. 实现效果图: 左边是Activity中的一个按钮,点击按钮会出现右边的Fragment相应的数据列表. 代码展示: 布局文件: activity_main: <LinearLayout xmlns:android="http://schemas.android.com/ap