• Android 开发笔记___基本适配器的使用__BaseAdapter


    之前用到过ArryAdapter适用于纯文本的列表数据,SimpleAdapter适用于带图标的列表数据,但在实际应用中常常有更复杂的列表,比如同一项中存在多个控件,这时候用前面的两个会比较复杂,而且不易扩展。因此Android提供了适应性更强的BaseAdapter,该适配器允许开发者在别的代码文件中进行逻辑处理,大大提高了代码的可读性、可维护性。

    从BaseAdapter派生的数据适配器主要实现下面三个方法:

    • 构造函数:指定适配器需要处理的数据集合。
    • getCount:获取数据项的个数。
    • getView:获取每项的展示视图,并对每项的内部空间进行业务处理

    下面以spinner为载体演示如何操作BaseAdapter:

      一、编写列表项的布局文件

     1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     2     android:id="@+id/ll_item"
     3     android:layout_width="match_parent"
     4     android:layout_height="wrap_content"
     5     android:orientation="horizontal" >
     6 
     7     <ImageView
     8         android:id="@+id/iv_icon"
     9         android:layout_width="0dp"
    10         android:layout_height="80dp"
    11         android:layout_weight="1"
    12         android:scaleType="fitCenter" />
    13 
    14     <LinearLayout
    15         android:layout_width="0dp"
    16         android:layout_height="match_parent"
    17         android:layout_weight="3"
    18         android:orientation="vertical" >
    19 
    20         <TextView
    21             android:id="@+id/tv_name"
    22             android:layout_width="match_parent"
    23             android:layout_height="0dp"
    24             android:layout_weight="1"
    25             android:gravity="left|center"
    26             android:textColor="@color/black"
    27             android:textSize="20sp" />
    28 
    29         <TextView
    30             android:id="@+id/tv_desc"
    31             android:layout_width="match_parent"
    32             android:layout_height="0dp"
    33             android:layout_weight="2"
    34             android:gravity="left|center"
    35             android:textColor="@color/black"
    36             android:textSize="13sp" />
    37     </LinearLayout>
    38 
    39 </LinearLayout>

      二、写个新的适配器继承BaseAdapter:

     1 package com.example.alimjan.hello_world.adapter;
     2 
     3 import android.content.Context;
     4 import android.view.LayoutInflater;
     5 import android.view.View;
     6 import android.view.ViewGroup;
     7 import android.widget.AdapterView;
     8 import android.widget.AdapterView.OnItemClickListener;
     9 import android.widget.AdapterView.OnItemLongClickListener;
    10 import android.widget.BaseAdapter;
    11 import android.widget.ImageView;
    12 import android.widget.LinearLayout;
    13 import android.widget.TextView;
    14 import android.widget.Toast;
    15 
    16 import com.example.alimjan.hello_world.bean.planet;
    17 import com.example.alimjan.hello_world.R;
    18 
    19 import java.util.ArrayList;
    20 
    21 public class PlanetAdapter extends BaseAdapter implements OnItemClickListener,
    22         OnItemLongClickListener {
    23 
    24     private LayoutInflater mInflater;
    25     private Context mContext;
    26     private int mLayoutId;
    27     private ArrayList<planet> mPlanetList;
    28     private int mBackground;
    29 
    30     public PlanetAdapter(Context context, int layout_id, ArrayList<planet> planet_list, int background) {
    31         mInflater = LayoutInflater.from(context);
    32         mContext = context;
    33         mLayoutId = layout_id;
    34         mPlanetList = planet_list;
    35         mBackground = background;
    36     }
    37 
    38     @Override
    39     public int getCount() {
    40         return mPlanetList.size();
    41     }
    42 
    43     @Override
    44     public Object getItem(int arg0) {
    45         return mPlanetList.get(arg0);
    46     }
    47 
    48     @Override
    49     public long getItemId(int arg0) {
    50         return arg0;
    51     }
    52 
    53     @Override
    54     public View getView(final int position, View convertView, ViewGroup parent) {
    55         ViewHolder holder = null;
    56         if (convertView == null) {
    57             holder = new ViewHolder();
    58             convertView = mInflater.inflate(mLayoutId, null);
    59             holder.ll_item = (LinearLayout) convertView.findViewById(R.id.ll_item);
    60             holder.iv_icon = (ImageView) convertView.findViewById(R.id.iv_icon);
    61             holder.tv_name = (TextView) convertView.findViewById(R.id.tv_name);
    62             holder.tv_desc = (TextView) convertView.findViewById(R.id.tv_desc);
    63             convertView.setTag(holder);
    64         } else {
    65             holder = (ViewHolder) convertView.getTag();
    66         }
    67         planet planet = mPlanetList.get(position);
    68         holder.ll_item.setBackgroundColor(mBackground);
    69         holder.iv_icon.setImageResource(planet.image);
    70         holder.tv_name.setText(planet.name);
    71         holder.tv_desc.setText(planet.desc);
    72         return convertView;
    73     }
    74 
    75     public final class ViewHolder {
    76         private LinearLayout ll_item;
    77         public ImageView iv_icon;
    78         public TextView tv_name;
    79         public TextView tv_desc;
    80     }
    81 
    82     @Override
    83     public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    84         String desc = String.format("您点击了第%d个行星,它的名字是%s", position + 1,
    85                 mPlanetList.get(position).name);
    86         Toast.makeText(mContext, desc, Toast.LENGTH_LONG).show();
    87     }
    88 
    89     @Override
    90     public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
    91         String desc = String.format("您长按了第%d个行星,它的名字是%s", position + 1,
    92                 mPlanetList.get(position).name);
    93         Toast.makeText(mContext, desc, Toast.LENGTH_LONG).show();
    94         return true;
    95     }
    96 }

      三、在页面代码中构造该适配器,,并应用于spinner对象:

     1 package com.example.alimjan.hello_world;
     2 
     3 import java.util.ArrayList;
     4 
     5 /**
     6  * Created by alimjan on 7/16/2017.
     7  */
     8 
     9         import com.example.alimjan.hello_world.adapter.PlanetAdapter;
    10         import com.example.alimjan.hello_world.bean.planet;
    11         import android.content.Context;
    12         import android.content.Intent;
    13         import android.graphics.Color;
    14         import android.os.Bundle;
    15         import android.support.v7.app.AppCompatActivity;
    16         import android.view.View;
    17         import android.widget.AdapterView;
    18         import android.widget.Spinner;
    19         import android.widget.Toast;
    20         import android.widget.AdapterView.OnItemSelectedListener;
    21 
    22 public class class_5_2_1 extends AppCompatActivity {
    23 
    24     private ArrayList<planet> planetList;
    25 
    26     @Override
    27     protected void onCreate(Bundle savedInstanceState) {
    28         super.onCreate(savedInstanceState);
    29         setContentView(R.layout.code_5_2_1);
    30         initSpinner();
    31     }
    32 
    33     private void initSpinner() {
    34         planetList = planet.getDefaultList();
    35         PlanetAdapter adapter = new PlanetAdapter(this, R.layout.item_list, planetList, Color.WHITE);
    36         Spinner sp = (Spinner) findViewById(R.id.sp_planet);
    37         sp.setPrompt("请选择行星");
    38         sp.setAdapter(adapter);
    39         sp.setSelection(0);
    40         sp.setOnItemSelectedListener(new MySelectedListener());
    41     }
    42 
    43     private class MySelectedListener implements OnItemSelectedListener {
    44         public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
    45             Toast.makeText(class_5_2_1.this, "您选择的是"+planetList.get(arg2).name, Toast.LENGTH_LONG).show();
    46         }
    47 
    48         public void onNothingSelected(AdapterView<?> arg0) {
    49         }
    50     }
    51 
    52     public static void startHome(Context mContext) {
    53         Intent intent = new Intent(mContext, class_5_2_1.class);
    54         mContext.startActivity(intent);
    55     }
    56 
    57 }

    plenet 类在这

     1 package com.example.alimjan.hello_world.bean;
     2 
     3 import java.util.ArrayList;
     4 import com.example.alimjan.hello_world.R;
     5 
     6 /**
     7  * Created by alimjan on 7/16/2017.
     8  */
     9 
    10 public class planet {
    11     public int image;
    12     public String name;
    13     public String desc;
    14 
    15     public planet() {
    16         this.image = 0;
    17         this.name = "";
    18         this.desc = "";
    19     }
    20 
    21     public planet(int image, String name, String desc) {
    22         this.image = image;
    23         this.name = name;
    24         this.desc = desc;
    25     }
    26 
    27     private static int[] iconArray = {R.drawable.shuixing, R.drawable.jinxing, R.drawable.diqiu,
    28             R.drawable.huoxing, R.drawable.muxing, R.drawable.tuxing};
    29     private static String[] nameArray = {"水星", "金星", "地球", "火星", "木星", "土星"};
    30     private static String[] descArray = {
    31             "水星是太阳系八大行星最内侧也是最小的一颗行星,也是离太阳最近的行星",
    32             "金星是太阳系八大行星之一,排行第二,距离太阳0.725天文单位",
    33             "地球是太阳系八大行星之一,排行第三,也是太阳系中直径、质量和密度最大的类地行星,距离太阳1.5亿公里",
    34             "火星是太阳系八大行星之一,排行第四,属于类地行星,直径约为地球的53%",
    35             "木星是太阳系八大行星中体积最大、自转最快的行星,排行第五。它的质量为太阳的千分之一,但为太阳系中其它七大行星质量总和的2.5倍",
    36             "土星为太阳系八大行星之一,排行第六,体积仅次于木星"
    37     };
    38     public static ArrayList<planet> getDefaultList() {
    39         ArrayList<planet> planetList = new ArrayList<planet>();
    40         for (int i=0; i<iconArray.length; i++) {
    41             planetList.add(new planet(iconArray[i], nameArray[i], descArray[i]));
    42         }
    43         return planetList;
    44     }
    45 }
    View Code
  • 相关阅读:
    Vue的配置安装与项目创建
    log4j:WARN No appenders could be found for logger
    终于在博客园扎根了
    简单工厂模式
    详解apache防盗链网站图片防盗链方法
    怎样能写好文章标题
    生活需要阿Q精神
    2013个人博客全新起航
    华中师范大学新生网上怎么选宿舍
    华中师范大学2012级新生QQ交流群欢迎加入!
  • 原文地址:https://www.cnblogs.com/alimjan/p/7199002.html
Copyright © 2020-2023  润新知