精华内容
参与话题
问答
  • Android之Adapter用法总结

    万次阅读 多人点赞 2013-03-11 10:23:03
    Android之Adapter用法总结 1.概念  Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带。在常见的View(List View,Grid View)等地方都需要用到Adapter。如下图直观的表达了...

    AndroidAdapter用法总结

    1.概念

            Adapter是连接后端数据和前端显示的适配器接口,是数据和UIView)之间一个重要的纽带。在常见的View(List View,Grid View)等地方都需要用到Adapter。如下图直观的表达了DataAdapterView三者的关系:


    Android中所有的Adapter一览:


            由图可以看到在Android中与Adapter有关的所有接口、类的完整层级图。在我们使用过程中可以根据自己的需求实现接口或者继承类进行一定的扩展。比较常用的有 Base AdapterImpleaderAdapterCounteradaptation等。

    • BaseAdapter是一个抽象类,继承它需要实现较多的方法,所以也就具有较高的灵活性;
    • ArrayAdapter支持泛型操作,最为简单,只能展示一行字。
    • SimpleAdapter有最好的扩充性,可以自定义出各种效果。
    • SimpleCursorAdapter可以适用于简单的纯文字型ListView,它需要Cursor的字段和UI的id对应起来。如需要实现更复杂的UI也可以重写其他方法。可以认为是SimpleAdapter对数据库的简单结合,可以方便地把数据库的内容以列表的形式展示出来。

    2.应用案例

    1)ArrayAdapter

    列表的显示需要三个元素:

    a.ListVeiw 用来展示列表的View。

    b.适配器 用来把数据映射到ListView上的中介。

    c.数据    具体的将被映射的字符串,图片,或者基本组件。

    案例一

    复制代码
    public class ArrayAdapterActivity extends ListActivity {
         @Override
         public void onCreate(Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
             //列表项的数据
             String[] strs = {"1","2","3","4","5"};
             ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_expandable_list_item_1,strs);
             setListAdapter(adapter);
         }
     }
    复制代码

    案例二

    复制代码
        public class MyListView extends Activity {
        
            private ListView listView;
            //private List<String> data = new ArrayList<String>();
            @Override
            public void onCreate(Bundle savedInstanceState){
                super.onCreate(savedInstanceState);
                 
                listView = new ListView(this);
                listView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1,getData()));
                setContentView(listView);
            }
             
            private List<String> getData(){
                 
                List<String> data = new ArrayList<String>();
                data.add("测试数据1");
                data.add("测试数据2");
                data.add("测试数据3");
                data.add("测试数据4");
                 
                return data;
            }
        }

            上面代码使用了Adapter(Context context, int resourcefulness, List<T> objects)来装配数据,要装配这些数据就需要一个连接List View视图对象和数组数据的适配器来两者的适配工作,Adapter的构造需要三个参数,依次为this,布局文件(注意这里的布局文件描述的是列表的每一行的布局,android.R.layout.simple_list_item_1是系统定义好的布局文件只显示一行文字,数据源(一个List集合)。同时用adapter()完成适配的最后工作。效果图如下:



    2)SimpleAdapter
      simpleAdapter的扩展性最好,可以定义各种各样的布局出来,可以放上ImageView(图片),还可以放上Button(按钮),CheckBox(复选框)等等。下面的代码都直接继承了ListActivity,ListActivity和普通的Activity没有太大的差别,不同就是对显示ListView做了许多优化,方面显示而已。

    案例一

    simple.xml

    复制代码
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
    <ImageView
    android:id="@+id/img"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_margin="5dp"
    />
    <TextView
    android:id="@+id/title"
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textColor="#ffffff"
    android:textSize="20sp"
    />
    </LinearLayout>
    复制代码
    复制代码
    public class SimpleAdapterActivity extends ListActivity {
         @Override
         public void onCreate(Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
             
             SimpleAdapter adapter = new SimpleAdapter(this, getData(), R.layout.simple, new String[] { "title",  "img" }, new int[] { R.id.title, R.id.img });
             setListAdapter(adapter);
         }
         
         private List<Map<String, Object>> getData() {
             //map.put(参数名字,参数值)
             List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
             Map<String, Object> map = new HashMap<String, Object>();
             map.put("title", "摩托罗拉");
             map.put("img", R.drawable.icon);
             list.add(map);
             
             map = new HashMap<String, Object>();
             map.put("title", "诺基亚");
             map.put("img", R.drawable.icon);
             list.add(map);
             
             map = new HashMap<String, Object>();
             map.put("title", "三星");
             map.put("img", R.drawable.icon);
             list.add(map);
             return list;
             }  
         
     }
    复制代码

    案例二
      下面的程序是实现一个带有图片的类表。首先需要定义好一个用来显示每一个列内容的xml,vlist.xml

    复制代码
    <?xml version="1.0" encoding="utf-8"?>
        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent"
            android:layout_height="fill_parent">   
            <ImageView android:id="@+id/img" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="5px"/>
            <LinearLayout android:orientation="vertical"  android:layout_width="wrap_content"  android:layout_height="wrap_content">
                <TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content"
                    android:textColor="#FFFFFFFF" android:textSize="22px" />
                <TextView android:id="@+id/info"  android:layout_width="wrap_content" android:layout_height="wrap_content"
                    android:textColor="#FFFFFFFF" android:textSize="13px" />
            </LinearLayout>
         </LinearLayout>
    复制代码
    复制代码
    public class MyListView3 extends ListActivity {
            // private List<String> data = new ArrayList<String>();
            @Override
            public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
         
                SimpleAdapter adapter = new SimpleAdapter(this,getData(),R.layout.vlist,
                        new String[]{"title","info","img"},
                        new int[]{R.id.title,R.id.info,R.id.img});
                setListAdapter(adapter);
            }
         
            private List<Map<String, Object>> getData() {
                List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
         
                Map<String, Object> map = new HashMap<String, Object>();
                map.put("title", "G1");
                map.put("info", "google 1");
                map.put("img", R.drawable.i1);
                list.add(map);
         
                map = new HashMap<String, Object>();
                map.put("title", "G2");
                map.put("info", "google 2");
                map.put("img", R.drawable.i2);
                list.add(map);
         
                map = new HashMap<String, Object>();
                map.put("title", "G3");
                map.put("info", "google 3");
                map.put("img", R.drawable.i3);
                list.add(map);
                 
                return list;
            }
        }

      使用Impleader的数据用一般都是Hash Map构成的Listlist的每一节对应Listie的每一行。Hash Map的每个键值数据映射到布局文件中对应id的组件上。因为系统没有对应的布局文件可用,我们可以自己定义一个布局alist.XML。下面做适配,new一个Impleader参数一次是:this,布局文件(alist.XML),Hash Map的 title 和 infoIgM。布局文件的组件idtitleinfoIgM。布局文件的各组件分别映射到Hash Map的各元素上,完成适配。

    运行效果如下图:


    3)SimpleCursorAdapter

    复制代码
    public class SimpleCursorAdapterActivity extends ListActivity {
         @Override
         public void onCreate(Bundle savedInstanceState) {
             super.onCreate(savedInstanceState);
             //获得一个指向系统通讯录数据库的Cursor对象获得数据来源
             Cursor cur = getContentResolver().query(People.CONTENT_URI, null, null, null, null);
             startManagingCursor(cur);
             //实例化列表适配器
             
             ListAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, cur, new String[] {People.NAME}, new int[] {android.R.id.text1});
             setListAdapter(adapter);
         }
     }
    复制代码

    一定要以数据库作为数据源的时候,才能使用SimpleCursorAdapter,这里特别需要注意的一点是:不要忘了在AndroidManifest.xml文件中加入权限

    <uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>

    效果如下:


    4)BaseAdapter

      有时候,列表不光会用来做显示用,我们同样可以在在上面添加按钮。添加按钮首先要写一个有按钮的xml文件,然后自然会想到用上面的方法定义一个适配器,然后将数据映射到布局文件上。但是事实并非这样,因为按钮是无法映射的,即使你成功的用布局文件显示出了按钮也无法添加按钮的响应,这时就要研究一下ListView是如何现实的了,而且必须要重写一个类继承BaseAdapter。下面的示例将显示一个按钮和一个图片,两行字如果单击按钮将删除此按钮的所在行。并告诉你ListView究竟是如何工作的。

    vlist2.xml

    复制代码
    <?xml version="1.0" encoding="utf-8"?>
        <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent"
            android:layout_height="fill_parent">
            <ImageView android:id="@+id/img" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="5px"/>
            <LinearLayout android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content">
               <TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content"
                    android:textColor="#FFFFFFFF" android:textSize="22px" />
               <TextView android:id="@+id/info" android:layout_width="wrap_content" android:layout_height="wrap_content"
                    android:textColor="#FFFFFFFF" android:textSize="13px" />
           </LinearLayout>
    
           <Button android:id="@+id/view_btn" android:layout_width="wrap_content"  android:layout_height="wrap_content"
                android:text="@string/s_view_btn" android:layout_gravity="bottom|right" />
        </LinearLayout>


    /**
    002     * @author 
    003     *
    004     */
    005    public class MyListView4 extends ListActivity {
    006     
    007     
    008        private List<Map<String, Object>> mData;
    009         
    010        @Override
    011        public void onCreate(Bundle savedInstanceState) {
    012            super.onCreate(savedInstanceState);
    013            mData = getData();
    014            MyAdapter adapter = new MyAdapter(this);
    015            setListAdapter(adapter);
    016        }
    017     
    018        private List<Map<String, Object>> getData() {
    019            List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
    020     
    021            Map<String, Object> map = new HashMap<String, Object>();
    022            map.put("title", "G1");
    023            map.put("info", "google 1");
    024            map.put("img", R.drawable.i1);
    025            list.add(map);
    026     
    027            map = new HashMap<String, Object>();
    028            map.put("title", "G2");
    029            map.put("info", "google 2");
    030            map.put("img", R.drawable.i2);
    031            list.add(map);
    032     
    033            map = new HashMap<String, Object>();
    034            map.put("title", "G3");
    035            map.put("info", "google 3");
    036            map.put("img", R.drawable.i3);
    037            list.add(map);
    038             
    039            return list;
    040        }
    041         
    042        // ListView 中某项被选中后的逻辑
    043        @Override
    044        protected void onListItemClick(ListView l, View v, int position, long id) {
    045             
    046            Log.v("MyListView4-click", (String)mData.get(position).get("title"));
    047        }
    048         
    049        /**
    050         * listview中点击按键弹出对话框
    051         */
    052        public void showInfo(){
    053            new AlertDialog.Builder(this)
    054            .setTitle("我的listview")
    055            .setMessage("介绍...")
    056            .setPositiveButton("确定", new DialogInterface.OnClickListener() {
    057                @Override
    058                public void onClick(DialogInterface dialog, int which) {
    059                }
    060            })
    061            .show();
    062             
    063        }
    064         /** Listie有大量的数据需要加载的时候,会占据大量内存,影响性能,这时候   就需要按需填充并重新使用view来减少对象的创建
    065          *最快的方式是定义一个Pewholder,将convextag设置为Pewholder,不为空时重新使用即可
    066          */

    067        public final class ViewHolder{
    068            public ImageView img;
    069            public TextView title;
    070            public TextView info;
    071            public Button viewBtn;
    072        }
    073         
    074         
    075        public class MyAdapter extends BaseAdapter{
    076     
    077            private LayoutInflater mInflater;
    078             
    079             
    080            public MyAdapter(Context context){
    081                this.mInflater = LayoutInflater.from(context);
    082            }
    083            @Override
    084            public int getCount() {
    085                // TODO Auto-generated method stub
    086                return mData.size();
    087            }
    088     
    089            @Override
    090            public Object getItem(int arg0) {
    091                // TODO Auto-generated method stub
    092                return null;
    093            }
    094     
    095            @Override
    096            public long getItemId(int arg0) {
    097                // TODO Auto-generated method stub
    098                return 0;
    099            }
    100     
    101            @Override
    102            public View getView(int position, View convertView, ViewGroup parent) {
    103                 
    104                ViewHolder holder = null;
    105                if (convertView == null) {
    106                     
    107                    holder=new ViewHolder(); 
    108                     
    109                    convertView = mInflater.inflate(R.layout.vlist2, null);
    110                    holder.img = (ImageView)convertView.findViewById(R.id.img);
    111                    holder.title = (TextView)convertView.findViewById(R.id.title);
    112                    holder.info = (TextView)convertView.findViewById(R.id.info);
    113                    holder.viewBtn = (Button)convertView.findViewById(R.id.view_btn);
    114                    convertView.setTag(holder);
    115                     
    116                }else {
    117                     
    118                    holder = (ViewHolder)convertView.getTag();
    119                }
    120                 
    121                 
    122                holder.img.setBackgroundResource((Integer)mData.get(position).get("img"));
    123                holder.title.setText((String)mData.get(position).get("title"));
    124                holder.info.setText((String)mData.get(position).get("info"));
    125                 
    126                holder.viewBtn.setOnClickListener(new View.OnClickListener() {
    127                     
    128                    @Override
    129                    public void onClick(View v) {
    130                        showInfo();                
    131                    }
    132                });
    133                 
    134                 
    135                return convertView;
    136            }
    137             
    138        }     
    139    }
    复制代码

      

    下面将对上述代码,做详细的解释,listView在开始绘制的时候,系统首先调用getCount()函数,根据他的返回值得到listView的长度,然后根据这个长度,调用getView()逐一绘制每一行。如果你的getCount()返回值是0的话,列表将不显示同样return 1,就只显示一行。

      系统显示列表时,首先实例化一个适配器(这里将实例化自定义的适配器)。当手动完成适配时,必须手动映射数据,这需要重写getView()方法。系统在绘制列表的每一行的时候将调用此方法。getView()有三个参数,position表示将显示的是第几行,covertView是从布局文件中inflate来的布局。我们用LayoutInflater的方法将定义好的vlist2.xml文件提取成View实例用来显示。然后将xml文件中的各个组件实例化(简单的findViewById()方法)。这样便可以将数据对应到各个组件上了。但是按钮为了响应点击事件,需要为它添加点击监听器,这样就能捕获点击事件。至此一个自定义的listView就完成了,现在让我们回过头从新审视这个过程。系统要绘制ListView了,他首先获得要绘制的这个列表的长度,然后开始绘制第一行,怎么绘制呢?调用getView()函数。在这个函数里面首先获得一个View(实际上是一个ViewGroup),然后再实例并设置各个组件,显示之。好了,绘制完这一行了。那再绘制下一行,直到绘完为止。在实际的运行过程中会发现listView的每一行没有焦点了,这是因为Button抢夺了listView的焦点,只要布局文件中将Button设置为没有焦点就OK了。

    效果如下:



    展开全文
  • Adapter详解

    千次阅读 2013-07-01 01:08:18
    Adapter是适配器,许多UI组件需要搭配Adapter来显示界面,例如Spinner与ListView,另外当我们需要动态的添加数据给UI组件时就需要Adapter了。 我们来介绍几个常见的Adapter: ArrayAdapter(comman) SimpleAdapter ...


    动态添加数据适配器adapter

    Adapter是适配器,许多UI组件需要搭配Adapter来显示界面,例如Spinner与ListView,另外当我们需要动态的添加数据给UI组件时就需要Adapter了。

    我们来介绍几个常见的Adapter:


    ArrayAdapter<T>(comman)
    SimpleAdapter extends Baseadapter(comman)
    ******************************************************************************

    这两个适配器非常常见,也非常有用,通常传输的数据可以是ArrayList<>封装的数据。

    示例如下:ArrayAdapter

    private String[] string={"china","america","japan"};
    List list=new ArrayList<String>();
    for(int i=0;i<string.length;i++)
    {
    list.add(string[i]);
    }
    ArrayAdapter<String> adapter=new ArrayAdapter<String>(this,R.layout.simple_spinner_item,list);
    首先我们定义封装数据,然后再定义Adapter,最后调用setAdapter()方法。

    ArrayAdapter有三个参数,第一个参数为Activity.this,第三个参数为动态添加给adapter的数据
    对于第二个数据:
    R.layout.simple_spinner_item:意思是将数据传给一个简单地TextView组件

    示例:SimpleAdapter

    public class SimpleAdapter extends Activity{
    private String[] names =new String[]{"nick","lebron","kobe","kevin"};
    private int[] imgsIds[] =new Int[] {R.drawable.1,R.drawable.2,R.drawable.3,R.drawable.4};
    @Override
    public void onCreate(Bundle savedInsatnceState)
    {
    super.onCreate(savedInsatnceState);
    setTitle("simpleadapter");
    setContentView(R.layout.main);
    List<Map><String,Object> list=new ArrayList<Map><String,Object>();//创建动态数组ArrayList
    for(int i=0;i<names.length;i++){
    Map<String,Object> map=new HashMap=<String,Object>;
    map.put("name",names[i]);
    map.put("headerImg",imgsIds[i]);
    list.add(map);
    }
    SimpleAdapter adapter=new SimpleAdaper(this,list,R.layout.main,new String[]{"name","headerImg"},new int[]{R.id.name,R.id.headerImg});
    ListView list=(ListView)findViewById(R.id.mylist);
    list.setAdaper(adapter);
    }
    }



    接下来我们介绍另一个常用的Adapter:BaseAdapter
    BaseAdapter implements SpinnerAdapter implements ListViewAdapter(可用于ListView和Spinner)

    示例:

    public MyListView extensds Activity{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
    super.onCreate(savedInsatnceState);
    mDate=getDate();
    MyAdapter myadapter=new MyAdapter(this);
    ListView list=(ListView)findById(R.id.myList);
    setAdapter(myadapter);
    }
     private List<Map<String, Object>> getData() {
                List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
                Map<String, Object> map = new HashMap<String, Object>();
                map.put("title", "G1");
                map.put("info", "google 1");
                map.put("img", R.drawable.i1);
                list.add(map);
         //添加第二个Map数据
                map = new HashMap<String, Object>();
                map.put("title", "G2");
                map.put("info", "google 2");
                map.put("img", R.drawable.i2);
                list.add(map);
         //添加第三个Map数据
                map = new HashMap<String, Object>();
                map.put("title", "G3");
                map.put("info", "google 3");
                map.put("img", R.drawable.i3);
           	    list.add(map);
    	    return list; //返回List数据
    	}
    @verride
    protected void onListItemClicked(ListView 1,View v,int position,long id){
    Log.v("MyListView4_click",(String)mData.get(position).get("title"));
    	}
    public void showInfo(){
    	new AlertDiolog.Builder(this)
    	.setTitle("MyListView")
    	.setMessage(Introduce)
    	.setPositiveButton("Ensure",new DialogInterface.OnClickListener()
    	{@Override
    	public void onClick(DialogInterface dialog,int which){}	}).show();
    	}
    }
    private final class ViewHolder{
    public ImageView img;
    public TextView title;
    public TextView info;
    public Button viewBu;	
    }
    public class MyAdapter extens BaseAdapter{
    private LayoutInlfater myInflater;
    public MyAdapter(Context context){
    this.myInflater=LayoutInflater.from(context);
    }
    @Override
    public int getCount(){
    	return mDate.size();}
    @Override
    public long getItemId(int position){
    	return null;}
    @Override 
    public Object getItmeId(int position){
    	return 0;}
    @Override 
    public View getview(int position,View convertView,ViewGroup parent){
    ViewHolder holder=null;
    if(convertView==null){
    holder=new ViewHolder();
    convertView=mInflater.inflate(R.layout.list,null)
    //inflate函数有两个参数--解析界面布局
    holder.img=(ImageView)convertView.findViewById(R.id.img);
    holder.title=(TextView)convertView.findViewById(R.id.title);
    holder.info=(TextView)convertView.findViewById(R.id.info);
    holder.viewBu=(TextView)convertView.indViewById(R.id.viewBu);
    convertView.setTag(holder);
    	}else{holder=(ViewHolder)convertViewgetTag();}
    holder.img.setBackgroundResounce((Integer)mDate.get(position).get("img"));
    holder.title.setText((String)mdata.get(position).get("title"));
    holder.info.setText((String)mData.get(position).get("info"));
    holder.viewBu.setOnClickListener(new View.OnClickListener(){
    	@Override
    	public void onClick(View v){
    	showInfo();	}	
    	});
    
    return convertView;
    }
    }
    }

    getView()方法有三个参数,int position表示第几行,第几个Item;convertView 表示解析过来的布局,getCount表示列表项的个数。


    在使用ExpandabListView组件时,我们必须使用这个Adapter:

    ExpandableAdapter:(用于ExpandableListView):

    public class ExpandableListViewTest extends Activity
    {
    	@Override
    	public void onCreate(Bundle savedInstanceState)
    	{
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.main);
    		//创建一个BaseExpandableListAdapter对象
    		ExpandableListAdapter adapter = new BaseExpandableListAdapter()
    		{
    			int[] logos = new int[]
    			{
    				R.drawable.p,
    				R.drawable.z,
    				R.drawable.t
    			};
     			private String[] armTypes = new String[]
    				{ "神族兵种", "虫族兵种", "人族兵种"};
    			private String[][] arms = new String[][]
    			{
    				{ "狂战士", "龙骑士", "黑暗圣堂", "电兵" },
    				{ "小狗", "刺蛇", "飞龙", "自爆飞机" },
    				{ "机枪兵", "护士MM" , "幽灵" }
    			};
    			//获取指定组位置、指定子列表项处的子列表项数据
    			@Override
    			public Object getChild(int groupPosition, int childPosition)
    			{
    				return arms[groupPosition][childPosition];
    			}
    			@Override
    			public long getChildId(int groupPosition, int childPosition)
    			{
    				return childPosition;
    			}
    			@Override
    			public int getChildrenCount(int groupPosition)
    			{
    				return arms[groupPosition].length;
    			}
    			private TextView getTextView()
    			{
    				AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
    						ViewGroup.LayoutParams.FILL_PARENT, 64);
    				TextView textView = new TextView(ExpandableListViewTest.this);
    				textView.setLayoutParams(lp);
    				textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
    				textView.setPadding(36, 0, 0, 0);
    				textView.setTextSize(20);
    				return textView;
    			}
    			//该方法决定每个子选项的外观
    			@Override
    			public View getChildView(int groupPosition, int childPosition,
    					boolean isLastChild, View convertView, ViewGroup parent)
    			{
    				TextView textView = getTextView();			
    				textView.setText(getChild(groupPosition, childPosition).toString());
    				return textView;
    			}
    			//获取指定组位置处的组数据
    			@Override
    			public Object getGroup(int groupPosition)
    			{
    				return armTypes[groupPosition];
    			}
    			@Override
    			public int getGroupCount()
    			{
    				return armTypes.length;
    			}
    			@Override
    			public long getGroupId(int groupPosition)
    			{
    				return groupPosition;
    			}
    			//该方法决定每个组选项的外观
    			@Override
    			public View getGroupView(int groupPosition, boolean isExpanded,
    					View convertView, ViewGroup parent)
    			{
    				LinearLayout ll = new LinearLayout(ExpandableListViewTest.this);
    				ll.setOrientation(0);
    				ImageView logo = new ImageView(ExpandableListViewTest.this);
    				logo.setImageResource(logos[groupPosition]);
    				ll.addView(logo);
    				TextView textView = getTextView();
    				textView.setText(getGroup(groupPosition).toString());				
    				ll.addView(textView);			
    				return ll;
    			}
    			@Override
    			public boolean isChildSelectable(int groupPosition, int childPosition)
    			{
    				return true;
    			}
    			@Override
    			public boolean hasStableIds()
    			{
    				return true;
    			}
    		};
    		ExpandableListView expandListView = (ExpandableListView)
    			findViewById(R.id.list);
    		expandListView.setAdapter(adapter);
    	}
    }


    在使用下拉列表的Spinner时候,还有时用到SpinnerAdapter:

    下面一个示例是关于SpinnerAdapter:

    	private class SpinAdapter implements SpinnerAdapter{
    
    		@Override
    		public int getCount() {
    			return headIconIds.length;
    		}
    
    		@Override
    		public Object getItem(int pos) {
    			return null;
    		}
    
    		@Override
    		public long getItemId(int pos) {
    			return 0;
    		}
    
    		@Override
    		public int getItemViewType(int pos) {
    			return 0;
    		}
    
    		@Override
    		public View getView(int position, View convertView, ViewGroup parent) {
    			convertView = getLayoutInflater().inflate(R.layout.head_image_spinner_layout, null);
    			ImageView hicon = (ImageView)convertView.findViewById(R.id.headericon);
    			hicon.setImageResource(headIconIds[position]);
    			TextView hnote = (TextView)convertView.findViewById(R.id.headernote);
    			hnote.setText(context.getString(R.string.header)+position);
    			hnote.setTextColor(Color.BLACK);
    			return convertView;
    		}
    
    		@Override
    		public int getViewTypeCount() {
    			return 0;
    		}
    
    		@Override
    		public boolean hasStableIds() {
    			return false;
    		}
    
    		@Override
    		public boolean isEmpty() {
    			return false;
    		}
    
    		@Override
    		public void registerDataSetObserver(DataSetObserver arg0) {
    			
    		}
    
    		@Override
    		public void unregisterDataSetObserver(DataSetObserver arg0) {
    			
    		}
    
    		@Override
    		public View getDropDownView(int position, View convertView, ViewGroup parent) {
    			return getView(position, convertView, parent);
    		}
    		
    	}


    还有一些Adapter,例如:

    SimpleCursorAdapter(用于来自数据库的数据)

    关键代码如下:
    Cursor cur = getContentResolver().query(People.CONTENT_URI, null, null, null, null);
             startManagingCursor(cur);
    //来自系统通讯录数据库的Cursor数据
    ListAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, cur, new String[] {People.NAME}, new int[] {android.R.id.text1});
             setListAdapter(adapter);

    展开全文
  • Android之Adapter用法总结

    万次阅读 2018-07-07 17:36:25
    1.概念 Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带。在常见的View(ListView,GridView)等地方都需要用到Adap
    原文地址为:Android之Adapter用法总结

    1.概念

            Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带。在常见的View(ListView,GridView)等地方都需要用到Adapter。如下图直观的表达了Data、Adapter、View三者的关系:

    Android中所有的Adapter一览:

            由图可以看到在Android中与Adapter有关的所有接口、类的完整层级图。在我们使用过程中可以根据自己的需求实现接口或者继承类进行一定的扩展。比较常用的有 BaseAdapter,SimpleAdapter,ArrayAdapter,SimpleCursorAdapter等。

    • BaseAdapter是一个抽象类,继承它需要实现较多的方法,所以也就具有较高的灵活性;
    • ArrayAdapter支持泛型操作,最为简单,只能展示一行字。
    • SimpleAdapter有最好的扩充性,可以自定义出各种效果。
    • SimpleCursorAdapter可以适用于简单的纯文字型ListView,它需要Cursor的字段和UI的id对应起来。如需要实现更复杂的UI也可以重写其他方法。可以认为是SimpleAdapter对数据库的简单结合,可以方便地把数据库的内容以列表的形式展示出来。

    2.应用案例

    1)ArrayAdapter

    列表的显示需要三个元素:

    a.ListVeiw 用来展示列表的View。

    b.适配器 用来把数据映射到ListView上的中介。

    c.数据    具体的将被映射的字符串,图片,或者基本组件。

    案例一

    public class ArrayAdapterActivity extends ListActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //列表项的数据
    String[] strs = {"1","2","3","4","5"};
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_expandable_list_item_1,strs);
    setListAdapter(adapter);
    }
    }

    案例二

        public class MyListView extends Activity {

    private ListView listView;
    //private List<String> data = new ArrayList<String>();
    @Override
    public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);

    listView = new ListView(this);
    listView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1,getData()));
    setContentView(listView);
    }

    private List<String> getData(){

    List<String> data = new ArrayList<String>();
    data.add("测试数据1");
    data.add("测试数据2");
    data.add("测试数据3");
    data.add("测试数据4");

    return data;
    }
    }

            上面代码使用了ArrayAdapter(Context context, int textViewResourceId, List<T> objects)来装配数据,要装配这些数据就需要一个连接ListView视图对象和数组数据的适配器来两者的适配工作,ArrayAdapter的构造需要三个参数,依次为this,布局文件(注意这里的布局文件描述的是列表的每一行的布局,android.R.layout.simple_list_item_1是系统定义好的布局文件只显示一行文字,数据源(一个List集合)。同时用setAdapter()完成适配的最后工作。效果图如下:

    2)SimpleAdapter
      simpleAdapter的扩展性最好,可以定义各种各样的布局出来,可以放上ImageView(图片),还可以放上Button(按钮),CheckBox(复选框)等等。下面的代码都直接继承了ListActivity,ListActivity和普通的Activity没有太大的差别,不同就是对显示ListView做了许多优化,方面显示而已。

    案例一

    simple.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation
    ="vertical"
    android:layout_width
    ="fill_parent"
    android:layout_height
    ="fill_parent"
    >
    <ImageView
    android:id="@+id/img"
    android:layout_width
    ="wrap_content"
    android:layout_height
    ="wrap_content"
    android:layout_margin
    ="5dp"
    />
    <TextView
    android:id="@+id/title"
    android:layout_width
    ="wrap_content"
    android:layout_height
    ="wrap_content"
    android:textColor
    ="#ffffff"
    android:textSize
    ="20sp"
    />
    </LinearLayout>
    public class SimpleAdapterActivity extends ListActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    SimpleAdapter adapter = new SimpleAdapter(this, getData(), R.layout.simple, new String[] { "title", "img" }, new int[] { R.id.title, R.id.img });
    setListAdapter(adapter);
    }

    private List<Map<String, Object>> getData() {
    //map.put(参数名字,参数值)
    List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
    Map<String, Object> map = new HashMap<String, Object>();
    map.put("title", "摩托罗拉");
    map.put("img", R.drawable.icon);
    list.add(map);

    map = new HashMap<String, Object>();
    map.put("title", "诺基亚");
    map.put("img", R.drawable.icon);
    list.add(map);

    map = new HashMap<String, Object>();
    map.put("title", "三星");
    map.put("img", R.drawable.icon);
    list.add(map);
    return list;
    }

    }

    案例二
      下面的程序是实现一个带有图片的类表。首先需要定义好一个用来显示每一个列内容的xml,vlist.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent"
    android:layout_height
    ="fill_parent">
    <ImageView android:id="@+id/img" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="5px"/>
    <LinearLayout android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content">
    <TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content"
    android:textColor
    ="#FFFFFFFF" android:textSize="22px" />
    <TextView android:id="@+id/info" android:layout_width="wrap_content" android:layout_height="wrap_content"
    android:textColor
    ="#FFFFFFFF" android:textSize="13px" />
    </LinearLayout>
    </LinearLayout>
    public class MyListView3 extends ListActivity {
    // private List<String> data = new ArrayList<String>();
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    SimpleAdapter adapter = new SimpleAdapter(this,getData(),R.layout.vlist,
    new String[]{"title","info","img"},
    new int[]{R.id.title,R.id.info,R.id.img});
    setListAdapter(adapter);
    }

    private List<Map<String, Object>> getData() {
    List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();

    Map<String, Object> map = new HashMap<String, Object>();
    map.put("title", "G1");
    map.put("info", "google 1");
    map.put("img", R.drawable.i1);
    list.add(map);

    map = new HashMap<String, Object>();
    map.put("title", "G2");
    map.put("info", "google 2");
    map.put("img", R.drawable.i2);
    list.add(map);

    map = new HashMap<String, Object>();
    map.put("title", "G3");
    map.put("info", "google 3");
    map.put("img", R.drawable.i3);
    list.add(map);

    return list;
    }
    }

      使用simpleAdapter的数据用一般都是HashMap构成的List,list的每一节对应ListView的每一行。HashMap的每个键值数据映射到布局文件中对应id的组件上。因为系统没有对应的布局文件可用,我们可以自己定义一个布局vlist.xml。下面做适配,new一个SimpleAdapter参数一次是:this,布局文件(vlist.xml),HashMap的 title 和 info,img。布局文件的组件id,title,info,img。布局文件的各组件分别映射到HashMap的各元素上,完成适配。

    运行效果如下图:

    3)SimpleCursorAdapter

    public class SimpleCursorAdapterActivity extends ListActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //获得一个指向系统通讯录数据库的Cursor对象获得数据来源
    Cursor cur = getContentResolver().query(People.CONTENT_URI, null, null, null, null);
    startManagingCursor(cur);
    //实例化列表适配器

    ListAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_1, cur, new String[] {People.NAME}, new int[] {android.R.id.text1});
    setListAdapter(adapter);
    }
    }

    一定要以数据库作为数据源的时候,才能使用SimpleCursorAdapter,这里特别需要注意的一点是:不要忘了在AndroidManifest.xml文件中加入权限

    <uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>

    效果如下:

    4)BaseAdapter

      有时候,列表不光会用来做显示用,我们同样可以在在上面添加按钮。添加按钮首先要写一个有按钮的xml文件,然后自然会想到用上面的方法定义一个适配器,然后将数据映射到布局文件上。但是事实并非这样,因为按钮是无法映射的,即使你成功的用布局文件显示出了按钮也无法添加按钮的响应,这时就要研究一下ListView是如何现实的了,而且必须要重写一个类继承BaseAdapter。下面的示例将显示一个按钮和一个图片,两行字如果单击按钮将删除此按钮的所在行。并告诉你ListView究竟是如何工作的。

    vlist2.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent"
    android:layout_height
    ="fill_parent">
    <ImageView android:id="@+id/img" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_margin="5px"/>
    <LinearLayout android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content">
    <TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content"
    android:textColor
    ="#FFFFFFFF" android:textSize="22px" />
    <TextView android:id="@+id/info" android:layout_width="wrap_content" android:layout_height="wrap_content"
    android:textColor
    ="#FFFFFFFF" android:textSize="13px" />
    </LinearLayout>

    <Button android:id="@+id/view_btn" android:layout_width="wrap_content" android:layout_height="wrap_content"
    android:text
    ="@string/s_view_btn" android:layout_gravity="bottom|right" />
    </LinearLayout>

     

    /**
    002 *
    @author
    003 *
    004
    */
    005 public class MyListView4 extends ListActivity {
    006
    007
    008 private List<Map<String, Object>> mData;
    009
    010 @Override
    011 public void onCreate(Bundle savedInstanceState) {
    012 super.onCreate(savedInstanceState);
    013 mData = getData();
    014 MyAdapter adapter = new MyAdapter(this);
    015 setListAdapter(adapter);
    016 }
    017
    018 private List<Map<String, Object>> getData() {
    019 List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
    020
    021 Map<String, Object> map = new HashMap<String, Object>();
    022 map.put("title", "G1");
    023 map.put("info", "google 1");
    024 map.put("img", R.drawable.i1);
    025 list.add(map);
    026
    027 map = new HashMap<String, Object>();
    028 map.put("title", "G2");
    029 map.put("info", "google 2");
    030 map.put("img", R.drawable.i2);
    031 list.add(map);
    032
    033 map = new HashMap<String, Object>();
    034 map.put("title", "G3");
    035 map.put("info", "google 3");
    036 map.put("img", R.drawable.i3);
    037 list.add(map);
    038
    039 return list;
    040 }
    041
    042 // ListView 中某项被选中后的逻辑
    043 @Override
    044 protected void onListItemClick(ListView l, View v, int position, long id) {
    045
    046 Log.v("MyListView4-click", (String)mData.get(position).get("title"));
    047 }
    048
    049 /**
    050 * listview中点击按键弹出对话框
    051
    */
    052 public void showInfo(){
    053 new AlertDialog.Builder(this)
    054 .setTitle("我的listview")
    055 .setMessage("介绍...")
    056 .setPositiveButton("确定", new DialogInterface.OnClickListener() {
    057 @Override
    058 public void onClick(DialogInterface dialog, int which) {
    059 }
    060 })
    061 .show();
    062
    063 }
    064
    065
    066
    067 public final class ViewHolder{
    068 public ImageView img;
    069 public TextView title;
    070 public TextView info;
    071 public Button viewBtn;
    072 }
    073
    074
    075 public class MyAdapter extends BaseAdapter{
    076
    077 private LayoutInflater mInflater;
    078
    079
    080 public MyAdapter(Context context){
    081 this.mInflater = LayoutInflater.from(context);
    082 }
    083 @Override
    084 public int getCount() {
    085 // TODO Auto-generated method stub
    086 return mData.size();
    087 }
    088
    089 @Override
    090 public Object getItem(int arg0) {
    091 // TODO Auto-generated method stub
    092 return null;
    093 }
    094
    095 @Override
    096 public long getItemId(int arg0) {
    097 // TODO Auto-generated method stub
    098 return 0;
    099 }
    100
    101 @Override
    102 public View getView(int position, View convertView, ViewGroup parent) {
    103
    104 ViewHolder holder = null;
    105 if (convertView == null) {
    106
    107 holder=new ViewHolder();
    108
    109 convertView = mInflater.inflate(R.layout.vlist2, null);
    110 holder.img = (ImageView)convertView.findViewById(R.id.img);
    111 holder.title = (TextView)convertView.findViewById(R.id.title);
    112 holder.info = (TextView)convertView.findViewById(R.id.info);
    113 holder.viewBtn = (Button)convertView.findViewById(R.id.view_btn);
    114 convertView.setTag(holder);
    115
    116 }else {
    117
    118 holder = (ViewHolder)convertView.getTag();
    119 }
    120
    121
    122 holder.img.setBackgroundResource((Integer)mData.get(position).get("img"));
    123 holder.title.setText((String)mData.get(position).get("title"));
    124 holder.info.setText((String)mData.get(position).get("info"));
    125
    126 holder.viewBtn.setOnClickListener(new View.OnClickListener() {
    127
    128 @Override
    129 public void onClick(View v) {
    130 showInfo();
    131 }
    132 });
    133
    134
    135 return convertView;
    136 }
    137
    138 }
    139 }

      下面将对上述代码,做详细的解释,listView在开始绘制的时候,系统首先调用getCount()函数,根据他的返回值得到listView的长度(这也是为什么在开始的第一张图特别的标出列表长度),然后根据这个长度,调用getView()逐一绘制每一行。如果你的getCount()返回值是0的话,列表将不显示同样return 1,就只显示一行。

      系统显示列表时,首先实例化一个适配器(这里将实例化自定义的适配器)。当手动完成适配时,必须手动映射数据,这需要重写getView()方法。系统在绘制列表的每一行的时候将调用此方法。getView()有三个参数,position表示将显示的是第几行,covertView是从布局文件中inflate来的布局。我们用LayoutInflater的方法将定义好的vlist2.xml文件提取成View实例用来显示。然后将xml文件中的各个组件实例化(简单的findViewById()方法)。这样便可以将数据对应到各个组件上了。但是按钮为了响应点击事件,需要为它添加点击监听器,这样就能捕获点击事件。至此一个自定义的listView就完成了,现在让我们回过头从新审视这个过程。系统要绘制ListView了,他首先获得要绘制的这个列表的长度,然后开始绘制第一行,怎么绘制呢?调用getView()函数。在这个函数里面首先获得一个View(实际上是一个ViewGroup),然后再实例并设置各个组件,显示之。好了,绘制完这一行了。那再绘制下一行,直到绘完为止。在实际的运行过程中会发现listView的每一行没有焦点了,这是因为Button抢夺了listView的焦点,只要布局文件中将Button设置为没有焦点就OK了。

    效果如下:

     

     --------------------------------------------------------------------

    PS: 欢迎关注公众号"Devin说",会不定期更新Java相关技术知识。

    --------------------------------------------------------------------

     

     





    转载请注明本文地址:Android之Adapter用法总结
    展开全文
  • 安卓中的三种Adapter适配器

    万次阅读 2019-04-14 15:43:53
    安卓中的三种Adapter适配器 适配器是一个非常重要的知识点,Adapter是用来帮助填出数据的中间桥梁。适配器将各种数据以合适的形式显示在View中给用户看。 一、ArrayAdapter(数组适配器) 有一定的局限性,只能显示...

    安卓中的三种Adapter适配器

    适配器是一个非常重要的知识点,Adapter是用来帮助填出数据的中间桥梁。适配器将各种数据以合适的形式显示在View中给用户看。

    一、ArrayAdapter(数组适配器)

    有一定的局限性,只能显示一行文本数据

    0x1 基本使用实例

    (1)、采用Java控制显示内容

    布局文件:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <ListView
            android:id="@+id/name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
        </ListView>
    </LinearLayout>
    

    Java文件:

    import android.app.Activity;
    import android.os.Bundle;
    import android.widget.ArrayAdapter;
    import android.widget.ListView;
    
    public class MainActivity extends Activity{
    //    定义要显示的数据
        private String[] datas = {"张三","李四","王五","麻子","小强"};
        private ArrayAdapter<String> adapter;
        private ListView listView;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            listView = (ListView) findViewById(R.id.name);
    //        初始化适配器
            adapter = new ArrayAdapter<>(this,android.R.layout.simple_expandable_list_item_1,datas);
            listView.setAdapter(adapter);
        }
    }
    

    (2)、采用entries控制内容
    先在res\value下创建一个数组资源的xml文件:arrays.xml,然后在listview中使用entries

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <string-array name="myArray">
            <item>张三</item>
            <item>李四</item>
            <item>王五</item>
        </string-array>
    </resources>
    

    listview中代码:

    <ListView
            android:id="@+id/name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:entries="@array/myArray">
    </ListView>
    

    0x2 ArrayAdapter的参数说明

    //初始化适配器
    adapter = new ArrayAdapter<>(this,android.R.layout.simple_expandable_list_item_1,datas);
    

    第一个参数:context上下文对象

    第二个参数:每一个item的样式,可以使用系统提供,也可以自定义就是一个TextView

    第三个参数:数据源,要显示的数据

    系统提供的item的样式,可以试一试

    simple_list_item1:单独的一行文本框

    simple_list_item2:有两个文本框组成

    simple_list_item_checked每项都是由一个已选中的列表项

    simple_list_item_multiple_choice:都带有一个复选框

    simple_list_item_single_choice:都带有一个单选框

    二、SimpleAdapter(简单适配器)

    0x1 基本使用实例

    ListView:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
        <ListView
            android:id="@+id/name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
        </ListView>
    </LinearLayout>
    

    定义要实现的item的样式:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
                  android:layout_width="wrap_content"
                  android:layout_height="wrap_content"
                  android:orientation="horizontal">
        <ImageView
            android:id="@+id/image1"
            android:layout_width="100dp"
            android:layout_height="100dp"
            android:src="@mipmap/ic_launcher"
            android:layout_margin="5dp"/>
       <LinearLayout
           android:id="@+id/ll2"
           android:layout_width="match_parent"
           android:layout_height="100dp"
           android:orientation="vertical"
           android:layout_marginTop="5dp"
           android:layout_marginLeft="10dp">
           <TextView
               android:id="@+id/text1"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:text="哈哈"
               android:textSize="30sp"
               android:layout_marginTop="10dp"/>
           <TextView
               android:id="@+id/text2"
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:text="哈哈哈哈哈"
               android:textSize="24dp"
               android:layout_marginTop="10dp"/>
       </LinearLayout>
    </LinearLayout>
    

    Java文件:

    import android.app.Activity;
    import android.os.Bundle;
    import android.widget.ListView;
    import android.widget.SimpleAdapter;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    
    public class MainActivity extends Activity{
    //    这三个经常是同时出现的
        private List<Map<String,Object>> lists;
        private SimpleAdapter adapter;
        private ListView listView;
    //    定义数据
        private String[] theme = {"张三","李四","王五"};
        private String[] content ={"我是张三,你好","我是李四,你好","我是王五,你好"};
        private int[] imageViews = {R.mipmap.ic_launcher,R.mipmap.ic_account,R.mipmap.ic_password};
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            listView = (ListView) findViewById(R.id.ll1);
    //        准备数据源
            lists = new ArrayList<>();
            for(int i = 0;i < theme.length;i++){
                Map<String,Object> map =new HashMap<>();
                map.put("image",imageViews[i]);
                map.put("theme",theme[i]);
                map.put("content",content[i]);
                lists.add(map);
            }
            adapter = new SimpleAdapter(MainActivity.this,lists,R.layout.list_item
                    ,new String[]{"image","theme","content"}
                    ,new int[]{R.id.image1,R.id.text1,R.id.text2});
            listView.setAdapter(adapter);
        }
    }
    

    效果图:

    0x2 simpleAdapter中五个参数的

    第一个参数:上下文对象

    第二个参数:数据源是含有Map的一个集合

    第三个参数:每一个item的布局文件

    第四个参数:new String[]{}数组,数组的里面的每一项要与第二个参数中的存入map集合的的key值一样,一一对应

    第五个参数:new int[]{}数组,数组里面的第三个参数中的item里面的控件id。

    三、BaseAdapter

    0x1 基本使用实例

    布局和SimpleAdapter类似

    import android.content.Context;
    import android.text.Layout;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.ImageView;
    import android.widget.TextView;
    
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * Created by coder-tu on 2016/1/13.
     */
    public class MyAdapter extends BaseAdapter {
        private List<Message> Datas;
        private Context mContext;
    
        public MyAdapter(List<Message> datas, Context mContext) {
            Datas = datas;
            this.mContext = mContext;
        }
    
        /**
         * 返回item的个数
         * @return
         */
        @Override
        public int getCount() {
            return Datas.size();
        }
    
        /**
         * 返回每一个item对象
         * @param i
         * @return
         */
        @Override
        public Object getItem(int i) {
            return Datas.get(i);
        }
    
        /**
         * 返回每一个item的id
         * @param i
         * @return
         */
        @Override
        public long getItemId(int i) {
            return i;
        }
    
        /**
         * 暂时不做优化处理,后面会专门整理BaseAdapter的优化
         * @param i
         * @param view
         * @param viewGroup
         * @return
         */
        @Override
        public View getView(int i, View view, ViewGroup viewGroup) {
            view = LayoutInflater.from(mContext).inflate(R.layout.list_item,viewGroup,false);
            ImageView imageView = (ImageView) view.findViewById(R.id.image1);
            TextView textView1 = (TextView) view.findViewById(R.id.text1);
            TextView textView2 = (TextView) view.findViewById(R.id.text2);
            imageView.setImageResource(Datas.get(i).getImageId());
            textView1.setText(Datas.get(i).getTheme());
            textView2.setText(Datas.get(i).getContent());
    //        此处需要返回view 不能是view中某一个
            return view;
        }
    }
    

    然后在Java文件中使用

    import android.app.Activity;
    import android.os.Bundle;
    import android.widget.ListView;
    
    import java.util.ArrayList;
    import java.util.List;
    
    
    public class MainActivity extends Activity{
    //    这三个经常是同时出现的
        private List<Message> lists;
        private MyAdapter adapter;
        private ListView listView;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            listView = (ListView) findViewById(R.id.ll1);
            lists = new ArrayList<>();
            lists.add(new Message(R.mipmap.ic_launcher,"张三","你好,我是张三"));
            lists.add(new Message(R.mipmap.ic_account,"李四","你好,我是李四"));
            lists.add(new Message(R.mipmap.ic_password,"王五","你好,我是王五"));
            adapter = new MyAdapter(lists,MainActivity.this);
            listView.setAdapter(adapter);
        }
    }
    

    效果图:

    0x2 对BaseAdapter的优化

    充分利用listview的缓存机制但是findviewbyid反复使用

    1、创建内部类 2、判断convertView是否为空 3通过setTag方法将viewHolder与convertView建立关系绑定

    展开全文
  • Adapter介绍

    2019-11-20 21:19:47
    Adapter的作用是将数据以相应的格式填充到UI控件中,供用户查看数据;了解更多
  • BaseAdapter是最基础的Adapter类,也是最实用最常用的一个类,但是相比于ArrayAdapter之类的,对初学者来说却比较难理解。所以在这里介绍一下BaseAdapter。 Adapter 是什么? An Adapter object acts as a bridge ...
  • ios-adapter.zip

    2019-07-11 20:03:03
    adapter
  • Adapter (适配器) 简述 UI 控件都是跟 Adapter (适配器)打交道的,了解并学会使用这个Adapter很重要 Adapter 是用来帮助填充数据的中间桥梁,简单点说就是:将各种数据以合适的形式显示到 view 上,提供给用户看!...
  • 设计模式(五)适配器模式Adapter(结构型)

    万次阅读 多人点赞 2012-05-02 16:02:58
    设计模式(五)适配器模式Adapter(结构型) 1. 概述: 接口的改变,是一个需要程序员们必须(虽然很不情愿)接受和处理的普遍问题。程序提供者们修改他们的代码;系统库被修正;各种程序语言以及相关库的发展和...
  • 首先,我们常用的Adapter有四种,分别是BaseAdapter、SimpleAdapter、ArrayAdapter、SimpleCursorAdapter四种。  BaseAdapter:基础数据适配器,它的主要用途是将一组数据传到例如ListView等UI显示组件,继承...
  • adapter是数据与ui之间的桥梁,它把后台数据与前端ui连接到一起,是一个展示数据的载体。 常用的adapter: BaseAdapter : 基础适配器,对于spinner listview gridview 都是通用的,它是一个抽象类,继承后要实现的...
  • Design Pattern - Adapter(C#)

    万次阅读 多人点赞 2019-01-23 20:25:13
    分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!... Definition Convert the interface of a class into another ... Adapter lets classes work together that ...
  • 为RecyclerView打造通用Adapter 让RecyclerView更加好用

    万次阅读 多人点赞 2016-04-11 09:17:42
    转载请标明出处: ...一、概述记得好久以前针对ListView类控件写过一篇打造万能的ListView GridView 适配器,如今RecyclerView异军突起,其Adapter的用法也与ListView类似,那么我们也可以一步一步的为其打
  • ListView 和 Adapter 适配器的简单介绍

    万次阅读 多人点赞 2018-05-27 20:13:59
    1、ListView组件 ...1)只有通过Adapter 才可以把列表中的数据映射到ListView 中。 2)种类: ArrayAdapter, BaseAdapter, CursorAdapter , HeaderViewAdapter, ResourceCursorAdapter, Sim...
  • 在开始学习Adapter之前我们要来了解下这个MVC模式概念: 举个例子:大型的商业程序通常由多人一同开发完成,比如有人负责操作接口的规划与设计, 有人负责程序代码的编写如果要能够做到程序项目的分工就必须在程序的...
  • Android万能适配器Adapter

    千次阅读 2015-08-22 21:06:53
    万能适配器的代码的github地址是https://github.com/fengsehng/CommonAdapter万能适配器的代码的github地址是https://github.com/fengsehng/CommonAdapter万能适配器的代码的github地址是...
  • 本篇文章主要是针对RecyclerView的Adapter的notifyItemInserted()等方法进行分析,不涉及过多的源码分析,毕竟RecyclerView的代码有11037行,个人水平有限。 我们知道RecyclerView的Adapter与ListView的Adapter相...
  • 相信很多人都用过Adapter,但是Adapter嵌套Adapter确很少使用,主要是这样的需求也不多,最近要做一个说明书类的应用,左边实现目录的嵌套,点击一级目录弹出二级目录,一级目录为一个Adapter,二级目录又是一个...
  • Android中Adapter接口及其实现类详解

    千次阅读 2017-01-15 15:44:01
    一、Adapter简单介绍: (1)Android官方文档这样介绍: 我的翻译:一个Adapter充当着AdapterView视图与数据之间的桥梁。Adapter提供对数据项的访问,并且Adapter也负责为数据集中每一项数据产生对应的view。其作用...
  • 前言今天我来全面总结一下Android开发中最常用的设计模式 - 适配器模式。 其他设计模式介绍 1分钟全面了解“设计模式” 单例模式(Singleton) - 最易懂的设计模式解析 简单工厂模式(SimpleFactoryPattern)...

空空如也

1 2 3 4 5 ... 20
收藏数 284,043
精华内容 113,617
关键字:

adapter