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

  • 2016年06月19日 17:49
  • 1.71MB
  • 下载

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

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

2014-10-27Android学习------布局处理(八)------自定义ListView的监听事件和Adapter的实现-----城市列表应用程序

写一篇文章很辛苦啊!!! 转载请注明,联系请邮件nlp30508@qq.com 我学习Android都是结合源代码去学习,这样比较直观,非常清楚的看清效果,觉得很好,今天的...

android 基础-自定义listView的实现 adapter 方法解析

*BaseAdapter  自定义adapter适配listview  *getCount()方法 设置ListView显示条目个数  *getView()方法 设置指定位置的条目视图  *strin...

Android成长之路(8)——ListView优化和自定义Adapter的应用

最近,在一个小项目中,发现ListView绝对是最常用的控件之一。通常,有ListView的地方,就会有自定义的Adapter。在这里,顺便就梳理一下ListView的使用和优化还有了解Adapter...

Android - ListView自定义Adapter中获得EditText的值

转自:http://pt990.blog.163.com/blog/static/185726158201142410448867/ 两个xml布局文件 main.xml ...

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

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

Android之ListView与自定义adapter简单实例

Android中自定义Adapter实现ListView动态刷新进度条

这几天做上传图片时,实现动态更新进度条,花费了我不少脑筋,一是android不是很熟悉,二是自己java基础,或者说是编程基础不扎实,不会学以致用,这两发块,是以后加强的重点!  费话不多说!说说我用...
  • jdsjlzx
  • jdsjlzx
  • 2011年07月29日 15:43
  • 3189
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android之自定义Adapter的ListView
举报原因:
原因补充:

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