笔记41 | Android加载器Adapter的几个练习

合抱之木,生於毫末;九層之台,起於累土;千里之行,始於足下。《老子》

地址

简书:http://www.jianshu.com/p/bec0fdbb54ef csdn:http://blog.csdn.net/xiangyong_1521/article/details/78644437


目录

  • 概念
  • ArrayAdapter
  • SimpleAdapter
  • BaseAdapter

概念

Adapter是连接后端数据和前端显示的适配器接口,是数据和UI(View)之间一个重要的纽带。在常见的View(ListView,GridView)等地方都需要用到Adapter。

如下图直观的表达了Data、Adapter、View三者的关系:

所有的Adapter一览:

  • BaseAdapter是一个抽象类,继承它需要实现较多的方法,所以也就具有较高的灵活性;
  • ArrayAdapter支持泛型操作,最为简单,只能展示一行字。
  • SimpleAdapter有最好的扩充性,可以自定义出各种效果。

ArrayAdapter

列表的显示需要三个元素: a.ListVeiw 用来展示列表的View。 b.适配器 用来把数据映射到ListView上的中介。 c.数据 具体的将被映射的字符串,图片,或者基本组件。

String[] s = new String[]{"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P",
            "Q","R","S","T","U","V","W","X","Y","z"};
    private void initView(View v) {
        ListView listView = (ListView) v.findViewById(R.id.f_l_1);
        ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1,s);
        listView.setAdapter(listAdapter);
        listView.setOnItemClickListener(listener);
    }   

    Message message;
    private OnItemClickListener listener = new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                long id) {
            Log.i("md", "item'position:"+position);
        }
    };

SimpleAdapter

simpleAdapter的扩展性最好,可以定义各种各样的布局出来,可以放上ImageView(图片),还可以放上Button(按钮),CheckBox(复选框)等等。下面的代码都直接继承了ListActivity,ListActivity和普通的Activity没有太大的差别,不同就是对显示ListView做了许多优化,方面显示而已。 使用simpleAdapter的数据用一般都是HashMap构成的List,list的每一节对应ListView的每一行。HashMap的每个键值数据映射到布局文件中对应id的组件上。因为系统没有对应的布局文件可用,我们可以自己定义一个布局vlist.xml。下面做适配,new一个SimpleAdapter参数一次是:this,布局文件(vlist.xml),HashMap的 title 和 info,img。布局文件的组件id,title,info,img。布局文件的各组件分别映射到HashMap的各元素上,完成适配。

ListView listView;
    private void initView(View v) {
        listView = (ListView) v.findViewById(R.id.f2_tv);
        SimpleAdapter simpleAdapter = new SimpleAdapter(getActivity(), getData(), R.layout.list_item, new String[] {"title","img","jia"}, 
                new int[]{R.id.item_tv,R.id.item_im,R.id.item_tv2});
        listView.setAdapter(simpleAdapter);
    }   

    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("jia", "价格:2000");
        map.put("img", R.drawable.moto);
        list.add(map);

        map = new HashMap<String, Object>();
        map.put("title", "诺基亚");
        map.put("jia", "价格:3000");
        map.put("img", R.drawable.nuojiya);
        list.add(map);

        map = new HashMap<String, Object>();
        map.put("title", "三星");
        map.put("jia", "价格:4000");
        map.put("img", R.drawable.sanxing);
        list.add(map);
        return list;
        }
  • item_im:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/item_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@+id/item_im"
        android:text="TextView" 
        />

    <TextView
        android:id="@+id/item_tv2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@+id/item_im"
        android:layout_below="@+id/item_tv"
        android:text="TextView"
         />

    <ImageView
        android:id="@+id/item_im"
        android:layout_width="100dp"
        android:layout_height="50dp"
         />

</RelativeLayout>

BaseAdapter

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

private List<Map<String, Object>> mDate;
    private void initView(View v) {
        ListView listView = (ListView) v.findViewById(R.id.f_l_3);
        listView.setAdapter(new MyAdapter());
    }

    public class ViewHolder{
        TextView textView;
        ImageView imageView;
        Button button;
    }

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

        Map<String , Object > map = new  HashMap<String, Object>();

        map.put("tv", "阿里");
        map.put("im", R.drawable.ali);
        list.add(map);

        map = new  HashMap<String, Object>();
        map.put("tv", "腾讯");
        map.put("im", R.drawable.tx);
        list.add(map);

        map = new  HashMap<String, Object>();
        map.put("tv", "百度");
        map.put("im", R.drawable.baidu);
        list.add(map);

        map = new  HashMap<String, Object>();
        map.put("tv", "京东");
        map.put("im", R.drawable.jingdong);
        list.add(map);

        return list;
    }

    public class MyAdapter extends BaseAdapter{

        public MyAdapter() {
            this.mInflater = LayoutInflater.from(getActivity());
        }

        @Override
        public int getCount() {
            return mDate.size();
        }

        @Override
        public Object getItem(int position) {
            return null;
        }

        @Override
        public long getItemId(int position) {
            return 0;
        }

        private LayoutInflater mInflater;
        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            ViewHolder holder;
            if (convertView == null) {  //
                holder = new ViewHolder();
                convertView = mInflater.inflate(R.layout.list_item2, null);
                holder.button = (Button) convertView.findViewById(R.id.itm_bt3);
                holder.imageView = (ImageView) convertView.findViewById(R.id.item_im3);
                holder.textView =  (TextView) convertView.findViewById(R.id.item_tv3);
                convertView.setTag(holder);
            }else{
                holder = (ViewHolder) convertView.getTag();
            }

            holder.imageView.setBackgroundResource((Integer) mDate.get(position).get("im"));
            holder.textView.setText((String) mDate.get(position).get("tv"));
            holder.button.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    showInfo(position);
                }
            });
            return convertView;
        }

    }
    /**
     * listview中点击按键弹出对话框
     */
    public void showInfo(int position){
        new AlertDialog.Builder(getActivity())
        .setTitle("标题")
        .setMessage(""+(String) mDate.get(position).get("tv"))
        .setPositiveButton("确定", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
            }
        })
        .show();

    }
  • item_im2:
<?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="horizontal" >

    <ImageView
        android:id="@+id/item_im3"
        android:layout_width="100dp"
        android:layout_height="50dp"
        />

    <TextView
        android:id="@+id/item_tv3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@+id/item_im"
         />

    <Button 
        android:id="@+id/itm_bt3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="确定"
        />
</LinearLayout>

原文发布于微信公众号 - 项勇(xiangy_life)

原文发表时间:2017-11-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏緣來來來

安卓基础干货(四):安卓网络编程的学习

631
来自专栏向治洪

仿微信聊天表情发送

如题,这是公司项目的一个功能模块,先上个效果图: ? 其次大致说说原理: 1,首先判断输入的字符,是否包含表情的文字,比如   ?  这个表情对应的文件名为 e...

3267
来自专栏cloudskyme

android开发列表界面

android开发列表界面,上边是一个显示题目,下边显示的是图标,中间显示的是列表。 看一下效果吧 ? 当鼠标点击上之后出现背景图,下面看一下如何做出这样的效果...

3306
来自专栏蜉蝣禅修之道

ListView不能响应itemclick事件的解决方法

1355
来自专栏向治洪

ExpandableListView简单应用及listview模拟ExpandableListView

  首先我们还是来看一些案例,还是拿搜狐新闻客户端,因为我天天上下班没事爱看这个东东,上班又没时间看新闻,上下班路途之余浏览下新闻打发时间嘛. ? ? 看这...

3407
来自专栏非著名程序员

偷懒新姿势,打造属于RecyclerView的万能适配器Adapter和ViewHolder

前言 昨天开始接触江湖口碑很好的RecyclerView,事实上,我已经被她的强大所征服了!资源回收,数据绑定,布局显示,分割线,Item动画多个模块高度解耦...

2186
来自专栏学海无涯

Android开发之GridView实现弹出式选择器

前段时间,写了一个小项目,里面有个界面如下图所示,之前的版本是用Spinner来做,觉得不够拉轰,所以采用GridView做了一个实现,效果还不错,Mark一下...

2795
来自专栏向治洪

Android 纵向跑马灯滚动效果

像淘宝和京东都会有跑马灯的效果,今天给大家贡献下以前项目的一个demo,各位看官,且看效果图。 ? ? ? 我们先定义一个Bean文件,这个实体类文件主要包含标...

1997
来自专栏Android干货园

Android谈谈封装那些事--BaseActivity和BaseFragment(一)

版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/lyhhj/article/details/53...

1053
来自专栏项勇

笔记43 | Android加载器Adapter的深入学习篇(二)

1466

扫码关注云+社区