Adapter是用来帮助填充数据的中间桥梁,比如通过它将数据填充到ListView, GridView, Gallery.而android 提供了几种Adapter:ArrayAdapter<T>, BaseAdapter, CursorAdapter, HeaderViewListAdapter, ListAdapter, ResourceCursorAdapter, SimpleAdapter, SimpleCursorAdapter, SpinnerAdapter, WrapperListAdapter.我猜想这些Adapter的区别在于你的数据来源不一样:比如若你的数据来源于一个Arraylist 就使用BaseAdapter,SimpleAdapter,而数据来源于通过查询数据库获得Cursor那就使用SimpleCursorAdapter等。就目前我经常使用的BaseAdapter和SimpleCursorAdapter。
1,BaseAdapter:---数据来源于Arraylist-->MyArraylist
当你继承BaseAdapter客制化你的Adapter时,你必须OverWrite以下函数:
@Override public int getCount() { // TODO Auto-generated method stub System.out.println("the size is\t" + MyArraylist.size()); return MyArraylist.size(); }
getCount返回的就是你的有多少条数据需要绑定的,也就是需要多少个View.比如这里返回的就是MyArraylist的Size.
public View getView(int position, View v, ViewGroup parent) { // TODO Auto-generated method stub View view; if (v == null) { view = mInflater.inflate(R.layout.track_list_item, null); } else { view = v; }}
通过getView就获得了view来显示数据了。在这里你就可以自定义你的View了,但你通过XML定义可以通过LayoutInflater来inflater你的XML。getView里面就可以将MyArraylist的数据通过position 这个来将数据一条绑定一个View了。
2,SimpleCursorAdapter:---数据来源于数据库--->MyCursor
转自:http://blog.csdn.net/wong_judy/archive/2010/04/09/5466583.aspx
要实现bindView()和newView()这两个抽象方法需要实现的内容。
public void bindView(View view, Context context, Cursor cursor),重用一个已有的view,使其显示当前cursor所指向的数据。
public View newView(Context context, Cursor cursor, ViewGroup parent),为cursor所指向的数据新建一个View对象,并显示其数据。
通俗的说:比如你一个listview在一个屏幕里一次只能显示8条数据,那么第一次显示的时候就会newView 8次生成8个View,调用bindView绑定8条数据,而你有16条数据,但你拖动滚动条看9-16条时,此时不会再调用newView了,而只能调用了bindView去绑定新的数据而了。这样就省了空间了。
注意:传入到CursorAdapter中的Cursor结果集必须包含有列名为_id的列,否则SimpleCursorAdapter将不会起作用。
对于SimpleCursorAdapter中的newView与bindView的作用在BaseAdapter中的getView中也有这样的意义:getView里面我们必须做判断才能达到这种效果,就是要判断第二个参数View的是否为空:当空时就Infalte新的View,但不为空时就要就用它,这样就第一屏幕Infate 8个View,后面就直接使用这个8个view了。
注意:getView中是返回一个view,必须返回的是你infalte之后不为空的View,不然会报空指针异常。
==================================================================
关于ListView选中时显示的效果。
方法一:
通过给listview设置 android:listSelector这个属性,就可以对其下的所有item设定state_focused 时的背景变化
方法二:
实际上很简单,就是点击一下改变listviewitem的背景
public void changeBg(int position){ isFocused[whichClick==-1?0:whichClick] = false; whichClick = position; isFocused[position] = true; notifyDataSetChanged(); }
转载自: http://www.eoeandroid.com/thread-52160-1-1.html
package com.ui.demo;import java.util.List;import java.util.Map;import android.app.AlertDialog;import android.app.Dialog;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 MyArrayAdapter extends BaseAdapter{ private static List<Map<String,String>> list; private LayoutInflater mInflater; private ViewHolder holder; //alertdialog 被选中初始化false private static boolean[] isFocused ; private static int whichClick = -1; Context mContext; public MyArrayAdapter(Context context,List<Map<String,String>> objects){ list = objects; mContext = context; mInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); isFocused = new boolean[objects.size()]; for(int i=0;i<objects.size();i++){ isFocused[i] = false; } } public int getCount() { return list.size(); } public Object getItem(int position) { return list.get(position); } public long getItemId(int position) { return position; } public void changeBg(int position){ isFocused[whichClick==-1?0:whichClick] = false; whichClick = position; isFocused[position] = true; notifyDataSetChanged(); } public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = mInflater.inflate(R.layout.musiccategories, null); holder = new ViewHolder(); holder.s_Name = (TextView) convertView.findViewById(R.id.s_name); holder.btnTest = (Button) convertView.findViewById(R.id.btnTest); holder.btnTest.setText("Kaden"); holder.btnTest.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(mContext, "Button clicked.", Toast.LENGTH_SHORT).show(); } }); convertView.setTag(holder); } else { // Get the ViewHolder back to get fast access to the TextView // and the ImageView. holder = (ViewHolder) convertView.getTag(); } convertView.setBackgroundResource(isFocused[position]?R.drawable.btn_down_bg:R.drawable.btn_up_bg); //holder.s_Name.setText(list.get(position).get(WebTools.SON_GEMING)); return convertView; } static class ViewHolder { TextView s_Name; Button btnTest; }}
package com.ui.demo;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.ListView;import android.widget.AdapterView.OnItemClickListener;/** * @Title: ListviewTest.java* @Package com.ui.demo* @Description: TODO* @author Kaden Kang E-mail:[email protected]* @version Create date: 2010-11-29下午12:10:13* @version V1.0 */public class ListviewTest extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.my_listview); List<Map<String, String>> listItem = new ArrayList<Map<String, String>>(); Map<String, String> map; map = new HashMap<String, String>(); map.put("ItemTitle", "China"); map.put("ItemInfo", "+86"); listItem.add(map); map = new HashMap<String, String>(); map.put("ItemTitle", "Iran"); map.put("ItemInfo", "+98"); listItem.add(map); map = new HashMap<String, String>(); map.put("ItemTitle", "Iraq"); map.put("ItemInfo", "+964"); listItem.add(map); map = new HashMap<String, String>(); map.put("ItemTitle", "Ireland"); map.put("ItemInfo", "+353"); listItem.add(map); map = new HashMap<String, String>(); map.put("ItemTitle", "Israel"); map.put("ItemInfo", "+972"); listItem.add(map); map = new HashMap<String, String>(); map.put("ItemTitle", "American"); map.put("ItemInfo", "+001"); listItem.add(map); ListView listView = (ListView)findViewById(R.id.mListView); final MyArrayAdapter adapter = new MyArrayAdapter(this, listItem); listView.setAdapter(adapter); listView.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { adapter.changeBg(arg2); } }); }}