`
stephen830
  • 浏览: 2978111 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

使用自定义的BaseAdapter实现LIstView的展示

 
阅读更多

使用自定义的BaseAdapter实现LIstView的展示

 

实现以下功能点:

 

1.通过自定义的BaseAdapter展示ListView;

2.动态修改、刷新ListView内容;

3.在自定义的BaseAdapter中实现ListView内容的点击和长按点击事件;

4.在BaseAdapter的getView方法中动态增加新组件;

 

 

 

效果图如下:

 


 

 

xml配置文件1(list_view01.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <LinearLayout
    	android:orientation="horizontal"
    	android:layout_width="fill_parent"
    	android:layout_height="wrap_content"
    	>
	    <EditText  
		    android:id="@+id/editText01Edit"
		    android:layout_width="110sp" 
		    android:layout_height="wrap_content" 
		    android:text=""
		    />
	    <Button  
		    android:id="@+id/button01Edit"
		    android:layout_width="wrap_content" 
		    android:layout_height="wrap_content" 
		    android:text="动态修改第1行第2列数据"
		    android:onClick="editPersonAndRefreshListView01"
		    />
	</LinearLayout>
	<ListView  
	    android:id="@+id/listView01"
	    android:layout_width="fill_parent" 
	    android:layout_height="fill_parent" 
	    />
</LinearLayout>
 

 

xml配置文件2(list_view01_item.xml)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
    android:id="@+id/listView01Item01"
    android:layout_width="50sp" 
    android:layout_height="wrap_content" 
    />
<TextView  
    android:id="@+id/listView01Item02"
    android:layout_width="90sp" 
    android:layout_height="wrap_content" 
    /> 
<TextView  
    android:id="@+id/listView01Item03"
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    />    
</LinearLayout>
 

Activity类代码:

package com.zhouzijing.android;

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

import com.zhouzijing.android.util.MenuEntity;

import android.app.Activity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnCreateContextMenuListener;
import android.widget.AdapterView;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.BaseAdapter;
import android.widget.EditText;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.Toast;

public class ListViewDemo extends Activity {
	
	//定义Person
	List<Person> persons ;
	ListAdapter adapter = null;
	ListView listView01 = null;
	EditText editTextPersonName = null;
	
	//定义上下文菜单  
    final private static int CONTEXT_MENU_EDIT = 0;//菜单[编辑]的编号   
    final private static int CONTEXT_MENU_SHARE = 1;//菜单[分享]的编号   
    final private static int CONTEXT_MENU_DELETE = 2;//菜单[删除]的编号   
    final private static int CONTEXT_MENU_CANCEL = 3;//菜单[取消]的编号 
	private MenuEntity[] contextMenus = {  
            new MenuEntity(0, CONTEXT_MENU_EDIT, 0, "编辑"),  
            new MenuEntity(0, CONTEXT_MENU_SHARE, 1, "分享"),  
            new MenuEntity(0, CONTEXT_MENU_DELETE, 2, "删除"),  
            new MenuEntity(0, CONTEXT_MENU_CANCEL, 3, "取消"),  
            };  

	@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.list_view01);
        //获取组件
        listView01 = (ListView)findViewById(R.id.listView01);
        editTextPersonName = (EditText)findViewById(R.id.editText01Edit);
        
        //显示ListView
        initListAllPersons();
        showByMyBaseAdapter();
        
        //初始化ListView的事件
        //initListView01Event();
    }
	
	public void initListAllPersons(){
		persons = new ArrayList<Person>();
		persons.add(new Person(100,"李小龙","香港",android.R.drawable.ic_delete));
		persons.add(new Person(101,"施瓦辛格","美国",android.R.drawable.ic_dialog_alert));
		persons.add(new Person(102,"戴安娜王妃","英国",android.R.drawable.ic_dialog_dialer));
		persons.add(new Person(103,"成龙","香港",android.R.drawable.ic_dialog_map));
		persons.add(new Person(104,"史泰龙","美国",android.R.drawable.ic_lock_idle_alarm));
		persons.add(new Person(105,"圣女贞德","法国",android.R.drawable.ic_media_next));
		persons.add(new Person(106,"列宁","苏联",android.R.drawable.ic_media_play));
		persons.add(new Person(107,"爱迪生","美国",android.R.drawable.ic_menu_add));
		persons.add(new Person(108,"孔子","中国",android.R.drawable.ic_media_rew));
		persons.add(new Person(109,"杨七郎","宋朝",android.R.drawable.ic_menu_zoom));
		persons.add(new Person(110,"秦始皇","秦国",android.R.drawable.ic_menu_agenda));
		persons.add(new Person(111,"岳飞","宋朝",android.R.drawable.ic_lock_lock));
	}
	
	public void showByMyBaseAdapter(){
		adapter = new MyBaseAdapter(this, persons);
		listView01.setAdapter(adapter);
	}

	/**
	 * 按钮button01Edit的onClick事件.
	 * @param view
	 */
	public void editPersonAndRefreshListView01(View view){
		//获取TextEdit数据
		String value = editTextPersonName.getText().toString();
		//更新ListView的内容,并且动态刷新.
		persons.get(0).name=value;
		((BaseAdapter) adapter).notifyDataSetChanged();
	}
	
	
	

	/**
	 * 初始化listView01的事件.
	 */
	public void initListView01Event(){
		
		//ListView的item点击事件
		listView01.setOnItemClickListener(new OnItemClickListener(){

			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				Toast.makeText(getApplicationContext(), 
						"[OnItemClickListener]点击了:"+persons.get(position).name, 
						Toast.LENGTH_SHORT).show();
			}
		});
		
		//ListView的item长按点击事件
		listView01.setOnItemLongClickListener(new OnItemLongClickListener(){

			@Override
			public boolean onItemLongClick(AdapterView<?> parent, View view,
					int position, long id) {
				Toast.makeText(getApplicationContext(), 
						"[OnItemLongClickListener]点击了:"+persons.get(position).name, 
						Toast.LENGTH_SHORT).show();
				return false;
			}
			
		});
		
		//ListView的键盘选中事件(直接触摸屏幕选中不会激发)
		listView01.setOnItemSelectedListener(new OnItemSelectedListener(){

			@Override
			public void onItemSelected(AdapterView<?> parent, View view,
					int position, long id) {
				Toast.makeText(getApplicationContext(), 
						"[OnItemSelectedListener:onItemSelected]点击了:"
+persons.get(position).name, 
						Toast.LENGTH_SHORT).show();
			}

			@Override
			public void onNothingSelected(AdapterView<?> parent) {
				Toast.makeText(getApplicationContext(), 
						"[OnItemSelectedListener:onNothingSelected]点击了", 
						Toast.LENGTH_SHORT).show();
			}
			
		});
		
		//ListView组件:创建上下文菜单
		listView01.setOnCreateContextMenuListener(new OnCreateContextMenuListener(){
			@Override
			public void onCreateContextMenu(ContextMenu menu, View v,
					ContextMenuInfo menuInfo) {
				//获取上下文菜单点击的ListView的位置(position)属性
				AdapterContextMenuInfo info = (AdapterContextMenuInfo) menuInfo;
				int position = info.position;
				
				//设置上下文菜单标题
				menu.setHeaderTitle(persons.get(position).name);
				
				//设置上下文菜单栏目
				MenuEntity menuEntity = null;  
                for(int i=0;i<contextMenus.length;i++){  
                    menuEntity = contextMenus[i];  
                    menu.add(menuEntity.getGroupId(),menuEntity.getItemId()
,menuEntity.getOrder(),menuEntity.getTitle());  
                }  
			}
		});
	}

	//监听选择上下文菜单的选择事件
	@Override
	public boolean onContextItemSelected(MenuItem item) {
		//选中的上下文菜单的itemId
		int itemId = item.getItemId();
		//获取上下文菜单点击的ListView的位置(position)属性
		AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo();
		int position = info.position;
		//Toast
		Toast.makeText(getApplicationContext(), 
				"[onContextItemSelected]点击了"+persons.get(position).name+"" +
						",菜单="+contextMenus[itemId].getTitle(), 
				Toast.LENGTH_SHORT).show();
		return true;
	}
	
}
 

Person类代码

package com.zhouzijing.android;

public class Person {
	
	public int id;
	public String name;
	public String address;
	public int photo;
	
	public Person(int id, String name, String address,int photo) {
		super();
		this.id = id;
		this.name = name;
		this.address = address;
		this.photo = photo;
	}
}

 

自定义的BaseAdapter类代码

package com.zhouzijing.android;

import java.util.List;

import android.content.Context;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnLongClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

public class MyBaseAdapter extends BaseAdapter {
	private List<Person> persons;
	Context context;
	
	public MyBaseAdapter(Context context,List<Person> persons){
		this.persons = persons;
		this.context = context;
	}

	@Override
	public int getCount() {
		return (persons==null)?0:persons.size();
	}

	@Override
	public Object getItem(int position) {
		return persons.get(position);
	}

	@Override
	public long getItemId(int position) {
		return position;
	}
	
	
	public class ViewHolder{
		TextView textViewItem01;
		TextView textViewItem02;
		TextView textViewItem03;
		ImageView imageView;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		final Person person = (Person)getItem(position);
		ViewHolder viewHolder = null;
		if(convertView==null){
			Log.d("MyBaseAdapter", "新建convertView,position="+position);
			convertView = LayoutInflater.from(context).inflate(
					R.layout.list_view01_item, null);
			
			viewHolder = new ViewHolder();
			viewHolder.textViewItem01 = (TextView)convertView.findViewById(
					R.id.listView01Item01);
			viewHolder.textViewItem02 = (TextView)convertView.findViewById(
					R.id.listView01Item02);
			viewHolder.textViewItem03 = (TextView)convertView.findViewById(
					R.id.listView01Item03);
			
			//动态增加1个ImageView
			viewHolder.imageView = new ImageView(context);
			LinearLayout.LayoutParams mParams = new LinearLayout.LayoutParams(
					LinearLayout.LayoutParams.WRAP_CONTENT,
					LinearLayout.LayoutParams.WRAP_CONTENT);
			mParams.gravity = Gravity.CENTER;
			mParams.width=50;
			viewHolder.imageView.setLayoutParams(mParams);
			//这个ImageView放到ListView的第2列之后
			((LinearLayout)convertView).addView(viewHolder.imageView,2);
			
			convertView.setTag(viewHolder);
		}else{
			viewHolder = (ViewHolder)convertView.getTag();
			Log.d("MyBaseAdapter", "旧的convertView,position="+position);
		}
		
		viewHolder.textViewItem01.setText(String.valueOf(person.id));
		viewHolder.textViewItem02.setText(person.name);
		viewHolder.textViewItem03.setText(person.address);
		viewHolder.imageView.setImageResource(person.photo);
		
		//对ListView中第1个TextView配置OnClick事件
		viewHolder.textViewItem01.setOnClickListener(new OnClickListener(){
			@Override
			public void onClick(View v) {
				Toast.makeText(context, 
						"[textViewItem01.setOnClickListener]点击了"+person.name, 
						Toast.LENGTH_SHORT).show();
			}
		});
		
		//对ListView中的每一行信息配置OnClick事件
		convertView.setOnClickListener(new OnClickListener(){

			@Override
			public void onClick(View v) {
				Toast.makeText(context, 
						"[convertView.setOnClickListener]点击了"+person.name, 
						Toast.LENGTH_SHORT).show();
			}
			
		});
		
		//对ListView中的每一行信息配置OnLongClick事件
		convertView.setOnLongClickListener(new OnLongClickListener(){
			@Override
			public boolean onLongClick(View v) {
				Toast.makeText(context, 
						"[convertView.setOnLongClickListener]点击了"+person.name, 
						Toast.LENGTH_SHORT).show();
				return true;
			}
		});
		
		return convertView;
	}

}
 

MenuEntity类代码:

 

package com.zhouzijing.android.util;


/**
 * 定义菜单实体结构.
 * @author stephen
 *
 */
public class MenuEntity{
	
	
	/**
	 * 生成菜单.
	 * @param groupId
	 * @param itemId
	 * @param order
	 * @param title
	 */
	public MenuEntity(int groupId, int itemId, int order, CharSequence title) {
		super();
		this.groupId = groupId;
		this.itemId = itemId;
		this.order = order;
		this.title = title;
	}
	
	/**
	 * 组.
	 */
	private int groupId;
	/**
	 * 菜单编号.
	 */
	private int itemId;
	/**
	 * 显示顺序号.
	 */
	private int order;
	/**
	 * 菜单显示名称.
	 */
	private CharSequence title;
	/**
	 * @return the groupId
	 */
	public int getGroupId() {
		return groupId;
	}
	/**
	 * @param groupId the groupId to set
	 */
	public void setGroupId(int groupId) {
		this.groupId = groupId;
	}
	/**
	 * @return the itemId
	 */
	public int getItemId() {
		return itemId;
	}
	/**
	 * @param itemId the itemId to set
	 */
	public void setItemId(int itemId) {
		this.itemId = itemId;
	}
	/**
	 * @return the order
	 */
	public int getOrder() {
		return order;
	}
	/**
	 * @param order the order to set
	 */
	public void setOrder(int order) {
		this.order = order;
	}
	/**
	 * @return the title
	 */
	public CharSequence getTitle() {
		return title;
	}
	/**
	 * @param title the title to set
	 */
	public void setTitle(CharSequence title) {
		this.title = title;
	}
	
	
	
}
 

 

 

 

 

 

 

 

 

  • 大小: 27.5 KB
分享到:
评论
1 楼 qianguming 2013-12-20  
能不能不用 toast,用dialog来实现

相关推荐

    ListView的使用自定义BaseAdapter

    至此,我们已经掌握了在Android Studio中使用ListView和自定义BaseAdapter的基本步骤。通过这种方式,你可以灵活地展示各种类型的数据,并且可以通过扩展Adapter来实现更复杂的功能,如点击事件、长按事件等。在实际...

    用BaseAdapter实现的ListView

    总结来说,"用BaseAdapter实现的ListView"意味着开发者通过自定义适配器的方式,将数据源与ListView进行了绑定,实现了数据的动态加载和视图的个性化呈现。BaseAdapter的灵活性使得开发者能够完全控制ListView的显示...

    自定义BaseAdapter实现ListerView

    自定义BaseAdapter操作步骤实现Listview的界面显示,操作简易

    BaseAdapter_listview

    本示例"BaseAdapter_listview"正是通过自定义BaseAdapter来实现ListView的展示。 首先,我们要理解`Adapter`的概念。Adapter是数据源和UI控件之间的桥梁,它将数据转换成可以被View显示的格式。在ListView中,每个...

    json从网上下载解析,用baseadapter,listview显示

    3. 创建自定义BaseAdapter,将Java对象列表作为数据源。 4. 设置ListView的Adapter为自定义的BaseAdapter。 5. ListView会自动调用Adapter的getView()方法,根据数据生成并显示列表项。 总结,JSON的解析和显示是...

    Android自定义adapter的listview

    - 视图复用:为了提高性能,ListView使用了convertView机制。在getView()中,如果convertView不为空,那么我们可以复用这个已经创建过的View,避免频繁地创建新View。 - 数据绑定:使用findViewById()获取View,...

    使用BaseAdapter完成listview中带图片item

    通过自定义BaseAdapter,我们可以控制ListView中的每一项如何显示,包括添加图片。 1. **创建布局文件**: 首先,我们需要为ListView的每个Item创建一个布局文件。这个布局通常会包含一个ImageView和一个TextView,...

    可复用的自定义BaseAdapter

    可能是展示自定义BaseAdapter在实际应用中的截图,显示了适配器如何将数据呈现到屏幕上的视图组件中,比如ListView的各个条目。 通过以上所述,我们可以理解自定义BaseAdapter在Android开发中的重要性和实现方式,...

    Android_BaseAdapter_ListView

    在提供的"ListViewTeacheing"文件中,可能包含了一个示例项目的源代码,包括一个自定义的BaseAdapter实现以及如何在Activity中使用这个Adapter与ListView进行交互。通过学习这个例子,你可以更好地理解上述步骤,并...

    安卓listview相关相关-自定义控件实现listView中的图片轮换.rar

    - 为了高效地加载大量数据,ListView使用了视图复用机制(View Recycling),只有当前可见的Item会被渲染,其他Item会复用已存在的View,从而节省内存和提高性能。 2. **自定义Adapter** - 在ListView中,数据...

    自定义dialog实现listview长按删除item数据

    本文将深入探讨如何实现一个自定义Dialog来展示ListView,并且允许用户通过长按来删除ListView中的item数据。 首先,我们需要创建自定义Dialog的布局文件。在res/layout目录下创建一个新的XML文件,例如`dialog_...

    TabHost中填充自定义ListView

    你可以继承`BaseAdapter`、`ArrayAdapter`或`CursorAdapter`来实现自定义的适配器。你需要重写`getCount()`、`getItem()`、`getItemId()`和`getView()`方法,其中`getView()`是最重要的,它负责根据数据生成并返回...

    自定义左滑删除ListView

    ListView是Android中用于展示大量数据的视图组件,它通过复用视图(ViewHolder模式)实现了高效的滚动性能。在自定义左滑删除功能时,我们需要在ListView的每个Item上添加一个可滑动的视图层,并监听滑动事件。 1. ...

    实现ListView过滤功能,继承于BaseAdapter,非ArrayAdapter。

    在Android开发中,ListView是一种常用的组件,用于展示大量的数据列表。在某些场景下,我们可能需要为ListView添加过滤功能,以便用户可以根据输入的关键字实时筛选显示的数据。在本教程中,我们将探讨如何实现一个...

    Android开发--自定义控件实现listview的滑动删除item

    为了提供更丰富的交互体验,开发者经常需要自定义ListView,实现如滑动删除Item等高级功能。本篇文章将详细讲解如何在Android中通过自定义控件来实现ListView的滑动删除功能。 首先,我们需要了解ListView的基本...

    自定义中文索引Listview

    在Android开发中,自定义中文索引Listview是一项常见的需求,尤其在处理大量数据并需要快速定位时。本文将深入探讨如何实现这样一个功能,并提供一个名为`MyIndexableListView`的示例。 首先,理解Listview的基本...

    android 自定义ListView实现单选

    本篇文章将详细探讨如何通过自定义ListView来实现单选功能,旨在帮助开发者解决这一问题。 一、自定义ListView的必要性 系统自带的ListView默认并未提供单选模式,而是多选或全选。当用户需要在列表中选择一个项目...

    Android ListView控件的使用(自定义适配器 + ListView + 解决OOM )

    本教程将深入讲解如何使用ListView,结合自定义适配器以及解决Out-Of-Memory(OOM)问题。 首先,`ListView`是一个可滚动的视图,它能够显示一行行的数据。它通过Adapter来获取数据并将其渲染为可视化的列表项。...

    Android之自定义Adapter的ListView

    接着,创建了一个名为`ListViewAdapter`的自定义Adapter,继承自`BaseAdapter`,并传入上下文和数据集作为构造函数参数。然后,通过`listView.setAdapter(listViewAdapter)`将Adapter绑定到ListView上。 在`getView...

    Android自定义可扩展ListView

    实现自定义可扩展ListView,我们需要关注以下几个关键点: 1. **数据模型**:设计一个数据模型来存储列表项的信息,包括是否展开的状态、子项列表等。例如,可以创建一个`ExpandableItem`类,包含标题、子项列表和...

Global site tag (gtag.js) - Google Analytics