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:cumtkangyi@gmail.com* @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);                                                        }                });        }}













更多相关文章

  1. [置顶] Android系统安全之旅 第1章 编译Android程序的方法
  2. Android 保存数据到文件
  3. Android使背景灯(Brightness)高亮的方法
  4. android spinner自动弹出列表,设置title,TtextView不换行自动截取
  5. Android 获取控件高度宽度三种方法,防止0的出现
  6. Android sqlite 数据库在java代码中的增删改查

随机推荐

  1. 类似HTML map标签功能的Android组件
  2. ant编译android工程taskdef class not fo
  3. android ListView几个比较特别的属性
  4. 我要一步一步往上爬——Android应用实例
  5. Android:SwipeRefreshLayout+RecyclerVie
  6. Description Resource Path Location Typ
  7. Android调用系统Activity选取图像部分区
  8. android 4种存储方式
  9. Android中的四种启动方式
  10. Android studio使用Lottie- 让Android动