Android之自定义Adapter的ListView

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

Android之自定义Adapter的ListView_第1张图片

代码展示:

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;
	}
}
就这样就能达到想要的效果了。

最后: 总结下,这是今天面试遇到的机试题,大概就是这样。还讲到了ListView的优化,分页加载等。getView()中应该可以做些优化,下次在研究。看来还需要好好努力练习。多敲代码才是王道!


你可能感兴趣的:(android,ListView,Adapter)