zoukankan      html  css  js  c++  java
  • BaseAdapter和SimpleAdapter的区别

     今天呢,我给大家带来的是BaseAdapterSimpleAdapter的区别,大家可能会在用到适配器的时候会对两种适配器进行一个区别性的对比,然后再决定用哪一种适配器。

    这里呢!只是我平时在用的时候,自己总结的一些区别吧!

    我将代码就一起附上,然后再进行说明!

       先,我们开看一下简单的adapter:这里是界面图:

     

      Adapter可以是一个简单的数组:ArrayAdapter,也可以是游标:SimpleCursorAdapter

       还可以采用继承BaseAdapter来自定义adapter来绑定数据进行显示。

    package cn.android.app;
    
     
    
    import android.app.Activity;
    
    import android.os.Bundle;
    
    import android.view.View;
    
    import android.widget.AdapterView;
    
    import android.widget.AdapterView.OnItemClickListener;
    
    import android.widget.ArrayAdapter;
    
    import android.widget.ListView;
    
    import android.widget.Toast;
    
     
    
    public class ListViewActivity extends Activity {
    
    private ListView myListView;
    
    // to define a array to set the data
    
    String[] listData = { "Exit this way", "Far away from home",
    
    "from sarah with love", "God is a girl" };
    
     
    
    @Override
    
    protected void onCreate(Bundle savedInstanceState) {
    
     
    
    // and there i define the listt view to get the data
    
    super.onCreate(savedInstanceState);
    
    setContentView(R.layout.main);
    
    // to get the listview
    
    myListView = (ListView) findViewById(R.id.listview);
    
    setTitle("listview 示列");
    
     
    
    First_initData();
    
     
    
    }
    
     
    
    private void First_initData() {
    
    /***
    
     * 
    
     * 
    
     * 实例化一个数组adapter(arrayadapter),三个参数, this表示当前引用上下文,第二个参数利用条目显示的布局
    
     * 这里调用了系统自带的布局,第三个参数,绑定显示的数据 传入数组
    
     */
    
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
    
    android.R.layout.simple_list_item_1, listData);
    
    // 绑定adapter
    
    myListView.setAdapter(adapter);
    
    // 添加点击事件
    
    myListView.setOnItemClickListener(new OnItemClickListener() {
    
    /**
    
     * adapter 绑定的adapter
    
     * 
    
     * v 条目显示的内容
    
     * 
    
     * position v对应的位置
    
     * 
    
     * id 条目的id
    
     * 
    
     * 
    
     * */
    
    @Override
    
    public void onItemClick(AdapterView<?> adapter, View v,
    
    int position, long id) {
    
     
    
    // 显示一句
    
    new_Toast(v + "");
    
    }
    
    });
    
    /**
    
     * 
    
     * 当然这里我们还有直接去继承listactivity的,这样我们就可以
    
     * 在绑定adapter的时候通过调用父类的setlistadapter来绑定listview 与适配器adapter
    
     * setListAdapter(listData); 这里我们省去了实例话listview的那一步
    
     * 当然,这里我们布局文件里面的listview的属性必须要是实现了系统的才行
    
     * android:id="@id/android:liat";不然会抛出找不到listview的异常。
    
     * 在实现点击事件时直接重写onlistitemclick监听liatview列表条目的单击事 就ok啦!
    
     * 
    
     * 
    
     * 其实在实际的开发中,这些都是常用的方式,可是,我们会优先用继承listactivity 的那一种。因为代码会少一些!
    
     * */
    
    }
    
     
    
    public void new_Toast(String str) {
    
    // 这里我们把toast封装一下
    
    Toast.makeText(this, str, Toast.LENGTH_SHORT).show();
    
    }
    
     
    
    }
    
     

     

     

     

     

    其实最重要的就是simpleadapter相对于这个Baseadapter来说呢,就有点太 过于简单了!

    这里的简单呢!不是说是他的用法以及否认他的级别,而是说呢在应用方面在某些方面

    会有一些限制性。这些都是有图有真相的哦!

    先看看这个:

    然后再看看这个:

    这下明白了吧!

     

     

     

    但是对于simpleadapter的爱好者来,也许就不尽其然了。

     

    所以,这里我们来看一下simpleadapter的用法吧:

    先看看效果了:

    然后,下面就是一些简单的代码:

      1 package cn.android.app;
      2 
      3  
      4 
      5 import java.util.ArrayList;
      6 
      7 import java.util.HashMap;
      8 
      9 import java.util.Map;
     10 
     11  
     12 
     13 import android.app.Activity;
     14 
     15 import android.os.Bundle;
     16 
     17 import android.widget.ListView;
     18 
     19 import android.widget.SimpleAdapter;
     20 
     21 import android.widget.Toast;
     22 
     23  
     24 
     25 public class ListViewSimple extends Activity {
     26 
     27 private ListView myListView;
     28 
     29 // to define a array to set the data
     30 
     31 String[] listData = { "Exit this way", "Far away from home",
     32 
     33 "from sarah with love", "God is a girl" };
     34 
     35 int []img = { R.drawable.emoji_000, R.drawable.emoji_001,
     36 
     37 R.drawable.emoji_002, R.drawable.emoji_003 };
     38 
     39  
     40 
     41 @Override
     42 
     43 protected void onCreate(Bundle savedInstanceState) {
     44 
     45  
     46 
     47 // and there i define the listt view to get the data
     48 
     49 super.onCreate(savedInstanceState);
     50 
     51 setContentView(R.layout.main);
     52 
     53 // to get the listview
     54 
     55 myListView = (ListView) findViewById(R.id.listview);
     56 
     57 setTitle("listview 示列");
     58 
     59  
     60 
     61 initData();
     62 
     63  
     64 
     65 }
     66 
     67  
     68 
     69 private void initData() {
     70 
     71 // 定义一个数组
     72 
     73 ArrayList<Map<String, String>> list = new ArrayList<Map<String, String>>();
     74 
     75  
     76 
     77 // 填充
     78 
     79 for (int i = 0; i < img.length; i++) {
     80 
     81 // 定义一个集合
     82 
     83 Map<String, String> map = new HashMap<String, String>();
     84 
     85 map.put("img", img[i]+"");
     86 
     87 map.put("cont", listData[i]);
     88 
     89 list.add(map);
     90 
     91  
     92 
     93 }
     94 
     95 //  ImageView imgView;
     96 
     97 // TextView textView;
     98 
     99 // imgView=(ImageView) findViewById(R.id.imageview);
    100 
    101 // textView=(TextView) findViewById(R.id.textview);
    102 
    103 String []from={"img","cont"};
    104 
    105 int []to={R.id.imageview,R.id.textview};
    106 
    107  
    108 
    109 //new一个simpleadapter
    110 
    111 SimpleAdapter adapter=new SimpleAdapter(this, list, R.layout.list_cell, from, to);
    112 
    113 myListView.setAdapter(adapter);
    114 
    115 }
    116 
    117  
    118 
    119 public void new_Toast(String str) {
    120 
    121 // 这里我们把toast封装一下
    122 
    123 Toast.makeText(this, str, Toast.LENGTH_SHORT).show();
    124 
    125 }
    126 
    127  
    128 
    129 }
    130 
    131  

    然后,我们来看一下baseadapter

    这里我是利用他来实现的一个gridview里面的适配:

      1 package cn.android.app;
      2 
      3  
      4 
      5 import android.app.Activity;
      6 
      7 import android.os.Bundle;
      8 
      9 import android.view.LayoutInflater;
     10 
     11 import android.view.View;
     12 
     13 import android.view.ViewGroup;
     14 
     15 import android.widget.BaseAdapter;
     16 
     17 import android.widget.GridView;
     18 
     19 import android.widget.ImageView;
     20 
     21 import android.widget.TextView;
     22 
     23  
     24 
     25 public class GridViewActivity extends Activity {
     26 
     27 /** Called when the activity is first created. */
     28 
     29 /**
     30 
     31  * 
     32 
     33  * 这里我会演示一个GridView的实现,其实醉翁之意不在酒啦,我只是想看看看 baseadapter而已
     34 
     35  * 
     36 
     37  * 
     38 
     39  * 有适配器的地方,大家都知道需要一个大的控件,然后再加一个可以填充这个控件的小布局
     40 
     41  * 
     42 
     43  * 所以,这里我们有两个布局,一个布局是main,在那里面有控件GridView,然后
     44 
     45  * 我还创建了一个布局,就是填充那个GridView的小布局,在那里面有一个文本 控件,还有一个 imageview,这个布局就是main_view
     46 
     47  * 
     48 
     49  * */
     50 
     51 private GridView myGridView;
     52 
     53  
     54 
     55 @Override
     56 
     57 public void onCreate(Bundle savedInstanceState) {
     58 
     59 super.onCreate(savedInstanceState);
     60 
     61 setContentView(R.layout.main);
     62 
     63 // 得到gridview的实例
     64 
     65 myGridView = (GridView) findViewById(R.id.gridview);
     66 
     67 // to set the title
     68 
     69 setTitle("GridView的使用");
     70 
     71 // 这里创建一个绑定适配器的方法
     72 
     73 bindAdapter();
     74 
     75 }
     76 
     77  
     78 
     79 private void bindAdapter() {
     80 
     81 MyCarAdapter adapter = new MyCarAdapter();
     82 
     83 myGridView.setAdapter(adapter);
     84 
     85 }
     86 
     87  
     88 
     89 // 自定义一个adapter,可以灵活的来控制gridview子控件的布局显示
     90 
     91 // 这是一个内部类
     92 
     93 class MyCarAdapter extends BaseAdapter {
     94 
     95 // 图片的索引id
     96 
     97 int[] img = { R.drawable.emoji_000, R.drawable.emoji_001,
     98 
     99 R.drawable.emoji_002, R.drawable.emoji_003,
    100 
    101 R.drawable.emoji_004, R.drawable.emoji_005,
    102 
    103 R.drawable.emoji_006, R.drawable.emoji_007,
    104 
    105 R.drawable.emoji_008 };
    106 
    107  
    108 
    109 // 再定义一个数组,然后与之对应
    110 
    111 String[] name = { "one", "two", "three", "four", "five", "six",
    112 
    113 "seven", "eight", "nine" };
    114 
    115  
    116 
    117 // 这里我们最好是重新写一下构造方法
    118 
    119 public MyCarAdapter() {
    120 
    121  
    122 
    123  
    124 
    125 }
    126 
    127  
    128 
    129 // 获取条目的数量
    130 
    131 @Override
    132 
    133 public int getCount() {
    134 
    135 // TODO Auto-generated method stub
    136 
    137 return img.length;
    138 
    139 }
    140 
    141  
    142 
    143 // 返回子控件的内容
    144 
    145 @Override
    146 
    147 public Object getItem(int position) {
    148 
    149 // TODO Auto-generated method stub
    150 
    151 return img[position];
    152 
    153 }
    154 
    155  
    156 
    157 // 获取子控件的id
    158 
    159 @Override
    160 
    161 public long getItemId(int position) {
    162 
    163 // TODO Auto-generated method stub
    164 
    165 return position;
    166 
    167 }
    168 
    169  
    170 
    171 // 重新加载view的方法
    172 
    173 @Override
    174 
    175 public View getView(int position, View convertView, ViewGroup parent) {
    176 
    177 // TODO Auto-generated method stub
    178 
    179 ImageView imageView = null;
    180 
    181 if (convertView == null) {
    182 
    183  
    184 
    185 // 通过layoutinflater类加载布局,返回一个view的实例对象
    186 
    187 convertView = LayoutInflater.from(GridViewActivity.this)
    188 
    189 .inflate(R.layout.main_view, null);
    190 
    191 }
    192 
    193 // 通过convertview调用findviewbyid方法根据其id返回相应的子控技
    194 
    195 imageView = (ImageView) convertView.findViewById(R.id.image);
    196 
    197 imageView.setImageResource(img[position]);
    198 
    199 TextView textview = (TextView) convertView
    200 
    201 .findViewById(R.id.text_name);
    202 
    203 textview.setText(name[position]);
    204 
    205  
    206 
    207 return convertView;
    208 
    209 }
    210 
    211  
    212 
    213 }
    214 
    215  
    216 
    217 }
    218 
    219  
    220 
    221  

     

     

     

    其实让我会有机会关注到他们两个的区别的还是在做项目的时候,所以。。。。作为程序员来说,做项目真的可以让我们看到许多看不到的瑕疵。

    上次在做自己搭建服务端,但是需要对图片做许多迂回的操作的时候,到成功到达客户端的时候,去在显示到listview的时候,出现了一点问题,那就是我早做listview需要的adapter的时候,我用的是simpleadapter,因为在这之前我可是从来没有选择用baseadapter哦!可是,simpleadapter却在处理图片的时候出现了短路,我开始总以为是在传输的过程中遇到了一些问题导致了我的图片总是不会完整的显示在客户端,然后才知道是因为simpleadapter在转换图片的格式的时候,将图片损坏了,开始以为这是一个意外,但是,这个意外在我尝试了很多次后被定格为是必然的simpleadapter的条件限制。虽然把集合里面的传送类型由String改了很多次,包括改成object,但是还是不行。毕竟不稳定。然后询问了一下教员,然后,教员就告诉我们simpleadapter太简了。所以,叫我们用baseadapter,那个就自带一个图片的接受,到时候就不会出现现在的这种情况了。后来一试试,还真的行了。

    所以,大家还可以认真的区了解一下,当然,其实我觉得也许在这之间,我学到的更多地不是这个吧,而是让我明白了listview,这个控件的想象余地真的可以放大到好多倍!

    我们一起加油,希望大家什么建议或则意见,我一定洗耳恭听咯!

    谢谢!

     

     

     

    一切只是为了充实自己!!stay hungry and stay foolish!!
  • 相关阅读:
    PowerDesigner_15连接Oracle11g,反向工程导出模型图
    angular学习
    GoEasy消息推送
    Spring 工作原理
    JAVA解析HTML,获取待定元素属性
    设计模式之工厂方法模式
    设计模式之单例模式
    通过Java代码获取系统信息
    centos7下NAT模式下设置静态ip
    关于在Spring项目中使用thymeleaf报Exception parsing document错误
  • 原文地址:https://www.cnblogs.com/Catherine-Brain/p/3543773.html
Copyright © 2011-2022 走看看