Android之自定义Adapter的ListView

原创 2015年11月17日 20:50:51

首先来个效果图:说明:点击test按钮Toast.makeText( "这是第" +position+ "条item") 点击listview的item也要弹出Toast


代码展示:

1、布局文件main.xml

<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"
    android:orientation="vertical">
    <!-- 添加一个ListView控件 -->
    <ListView
        android:id="@+id/test_lv"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
</LinearLayout>
2、列表项布局文件list_items.xml 

这里要注意:如果listitem里面包括button或者checkbox等控件,默认情况下listitem会失去焦点,导致无法响应item的事件,最常用的解决办法是在listitem的布局文件中设置descendantFocusability属性。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:descendantFocusability="blocksDescendants" >

    <LinearLayout
        android:id="@+id/ll"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/title_tv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

        <TextView
            android:id="@+id/info_tv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />
    </LinearLayout>

    <Button
        android:id="@+id/test_bt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true" />

</RelativeLayout>
3、MainActivity,主代码:
package com.lexun.lexuninterview;

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

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

public class MainActivity extends Activity {
	private ListView listView;
	private TestAdapter testAdapter;
	private List<Map<String, Object>> listItems;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		listView = (ListView) findViewById(R.id.test_lv);
		listItems = getListItems();
		testAdapter = new TestAdapter(this, listItems); // 创建适配器
		listView.setAdapter(testAdapter);

		listView.setOnItemClickListener(new OnItemClickListener() {

			@Override
			public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
					long arg3) {
				Toast.makeText(MainActivity.this, "点击的为:" + arg2, Toast.LENGTH_SHORT).show();
			}
		});
	}

	/**
	 * 初始化listview信息
	 */
	private List<Map<String, Object>> getListItems() {
		List<Map<String, Object>> listItems = new ArrayList<Map<String, Object>>();
		for (int i = 0; i < 100; i++) {
			Map<String, Object> map = new HashMap<String, Object>();
			map.put("title", "title:" + i); // title
			map.put("info", "info: this list item is" + i); // info
			listItems.add(map);
		}
		return listItems;
	}	
}
4、适配器代码:
package com.lexun.lexuninterview;

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.Button;
import android.widget.TextView;
import android.widget.Toast;

public class TestAdapter extends BaseAdapter{
	private Context context; // 运行上下文
	private List<Map<String, Object>> listItems; // listview信息集合
	private LayoutInflater listContainer; // 视图容器

	public final class ListItemView { // 自定义控件集合
		public TextView title;
		public TextView info;
		public Button test;
	}
	
	public TestAdapter(Context context, List<Map<String, Object>> listItems) {
		super();
		this.context = context;
		this.listItems = listItems;
		listContainer = LayoutInflater.from(context); // 创建视图容器并设置上下文
	}

	@Override
	public int getCount() {
		// 这里不能使用默认返回0,不然listview没数据
		return listItems.size();
	}

	@Override
	public Object getItem(int arg0) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public long getItemId(int arg0) {
		// TODO Auto-generated method stub
		return 0;
	}

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		// TODO Auto-generated method stub
		final int selectID = position;
		ListItemView listItemView = null;
		if (convertView == null) {
			listItemView = new ListItemView();
			// 获取list_item布局文件的视图
			convertView = listContainer.inflate(R.layout.list_items, null);	
			listItemView.title = (TextView) convertView.findViewById(R.id.title_tv);
			listItemView.info = (TextView) convertView.findViewById(R.id.info_tv);
			listItemView.test = (Button) convertView.findViewById(R.id.test_bt);
			// 设置控件集到convertView
			convertView.setTag(listItemView);
		} else {
			listItemView = (ListItemView) convertView.getTag();
		}
		
		listItemView.title.setText((String) listItems.get(position).get("title"));
		listItemView.info.setText((String) listItems.get(position).get("info"));
		listItemView.test.setText("test");
		// 注册按钮点击事件
		listItemView.test.setOnClickListener(new View.OnClickListener() {
			@Override
			public void onClick(View v) {
				Toast.makeText(context, "这是第" + (selectID + 1) + "条item", Toast.LENGTH_SHORT).show();
			}
		});
		return convertView;
	}
}
就这样就能达到想要的效果了。


版权声明:本文为博主原创文章,转载请注明出处。

Android 自定义Adapter以实现自定义填充ListView的Item

1>实体类---即ListView中各个Item中填充的内容 package com.demo.cxc.compoundview.com.demo.cxc.entity; import java....
  • cxc19890214
  • cxc19890214
  • 2015年04月15日 00:42
  • 1595

ListView的优化和自定义适配器继承于BaseAdapter

ListView的优化和万能适配器继承于BaseAdapter          在android开发中Listview是一个很重要的组件,它以列表的形式根据数据的长自适应展示具体内容,用户可以自由...
  • u013128651
  • u013128651
  • 2016年03月21日 20:14
  • 2805

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

下边演示一个使用ListView和自定义适配器的案例,点击ListView中的条目会出现一个对话框,进行成绩的修改,修改之后会立即通知适配器进行数据的重新加载,如下: (1)、用于显示listVie...
  • u010870518
  • u010870518
  • 2015年04月04日 17:03
  • 4153

Android listview与adapter用法(包括自定义需要的适配器)

一个ListView通常有两个职责。 (1)将数据填充到布局。 (2)处理用户的选择点击等操作。 第一点很好理解,ListView就是实现这个功能的。第二点也不难做到,在后面的学习中读者会发现,...
  • u010973529
  • u010973529
  • 2014年10月17日 15:32
  • 1763

自定义BaseAdapter完成ListView列表单选功能

今天在公司写项目的时候自定义了一个baseAdapter实现listview的单选功能。本人也一直想着写技术博客,就以此开头吧。所以一回到家就开始写Demo分享给大家。这里有几个需要解决的问题,一是要...
  • spy471805285
  • spy471805285
  • 2015年05月19日 23:39
  • 1242

android ListView自定义适配器实现

android 自定义适配器自定义适配器实现步骤 一,继承BaseAdapter 二,添加数据集合和反射器实现构造器和setter方法 三,实现getCount,getItem,getItemI...
  • Maybe_ch
  • Maybe_ch
  • 2017年03月04日 23:51
  • 658

Android UI设计——ListView控件和自定义Adapter(四)

自定义Adapter   这个是ListView中使用最多的一个Adapter适配器,因为我们可以根据自己的意愿去创建数据和数据的布局样式。使用方式灵活,下面我们来学习一下自定义Adapter的具体步...
  • To_be_Designer
  • To_be_Designer
  • 2015年08月25日 20:35
  • 6813

ListView刷新:自定义adapter 调用notifyDatasetChanged()方法不起作用 的解决方案

public class BlackNumberAdapter extends BaseAdapter { private List data; private Context context; ...
  • Huangliping911020
  • Huangliping911020
  • 2014年08月09日 13:58
  • 579

Android之Listview(item为单选题)自定义adapter,像考试时前面的10几道单选题的实现

用于展现重复性的东西,Listview比较好用,看了别人的自定义Adapter(item是EditText,能够很好地获取到每一个item的EditText值)。又由于在做项目的需要,故特制了一个it...
  • who0am0i
  • who0am0i
  • 2015年04月22日 21:00
  • 1426

自定义Adapter实现多视图Item的ListView

From http://www.devdiv.com/adapter_item_listview-article-3730-1.html 1、原理分析                  Adap...
  • yuxiaohui78
  • yuxiaohui78
  • 2015年02月14日 05:57
  • 5191
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android之自定义Adapter的ListView
举报原因:
原因补充:

(最多只允许输入30个字)