android中的适配器(ArrayAdapter,SimpleAdapter,BaseAdapter)

ArrayAdpter

ArrayAdapter通常用于将数组或List集合的多个值包装成多个列表项
ArrayAdapter adapter2 = new ArrayAdapter(context, resource, textViewResourceId, objects)
T是数组的类型,resource至少包括一个View的布局文件
textViewResourceId指的是textView的id号,如果没有该参数代表使用系统android.R.id.text1
Objects是数据源,String[] arr

ArrayAdapter有六种构造方法,如果只是搭配简单的视图,一般使用下面这种构造方法。

常用构造方法:

public ArrayAdapter(Context context, int resource, int
textViewResourceId, T[] objects)
 public ArrayAdapter(Context context, int resource, int
textViewResourceId, List<T> objects)
 //context代表上下文,一般传入当前Activity
 //resource代表布局资源,传入你需要的布局文件,一般直接使用
android.R.layout.simple_list_item_1,这个布局中包含一个TextView
 //textViewResourceId代表的是resourece布局中的TextView的Id号,使用系统布局时传入android.R.id.text1

//其中T代表泛型,数组和集合中就是我们的数据

示例图如下:

这里写图片描述

ublic class MainActivity extends Activity {

    AutoCompleteTextView actv;
    //数据源
    String[] data={"zhangsan","lisi","wangwu","zhaoliu","tianqi","wangba","xiaojiujiu"};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //显示空间
        actv = (AutoCompleteTextView) findViewById(R.id.actv);
        //适配器
//      //自定义的
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,R.layout.item_actv, R.id.tv,data);
        // 所有需要适配器的view
        actv.setAdapter(adapter);



//      //系统的
//      ArrayAdapter<String> adapter = new ArrayAdapter<String(this,android.R.layout.simple_list_item_1, data);
//      actv.setAdapter(adapter);
    }

}
<!--主xnl-->
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.xykj.id05_10_11autocompletetextview.MainActivity" >

    <AutoCompleteTextView
        android:id="@+id/actv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:completionThreshold="1"
        android:dropDownHeight="50dp"
        android:text="输入手机号" />
    <!-- android:completionThreshold="1"是输入几个字符会有显示 默认是输入两个 -->
    <!-- android:dropDownHeight="20dp"设置这个可以滚动下面的下拉框 -->

</RelativeLayout>



<!--item_actv.xml的设置也就是显示的xml-->


<?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:gravity="center"
    android:orientation="horizontal" >
    <ImageView 

        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher"
        />

<TextView 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/tv"/>
</LinearLayout>

SimpleAdapter

SimpleAdapter是扩展性最好的适配器,可以定义各种你想要的布局
SimpleAdapter必须放一个HashMap
SimpleAdapter中一个方法:
SimpleAdapter adapter1= new SimpleAdapter(context, data, resource, from, to);
data是数据源,resource是指定显示的一个布局
From是HashMap中的数据,to是要显示在View的指定位置的id号,必须做到与HashMap的一一对应

构造方法:

1. SimpleAdapter(Context context, List<? extends Map<String, ?>> data, int
resource, String[] from, int[] to)
2. 参数context:上下文,比如this。关联SimpleAdapter运行的视图上下文
3. 参数data:Map列表,列表要显示的数据,这部分需要自己实现,类型要与上面的一致,每条项
目要与from中指定条目一致
4. 参数resource:ListView单项布局文件的Id,这个布局就是你自定义的布局了,你想显示什
么样子的布局都在这个布局中。这个布局中必须包括了to中定义的控件id
5. 参数 from:一个被添加到Map上关联每一个项目列名称的列表,数组里面是列名称
6. 参数 to:是一个int数组,数组里面的id是自定义布局中各个控件的id,需要与上面的from
对应
例子:
 SimpleAdapter adapter = new SimpleAdapter(MainActivity.this,
getData(),
 R.layout.main, new String[] { "img", "title", "info" },
 new int[] { R.id.img, R.id.title, R.id.info });

 private List<Map<String, Object>> getData() {
 List<Map<String, Object>> list = new ArrayList<Map<String, Obje
ct>>();
 Map<String, Object> map = new HashMap<String, Object>();
 //Map中的Key必须与适配器中from数组中相同
 //而to中必须和from一一对应
 map.put("img", R.drawable.img1);
 map.put("title", "first");
 map.put("info", "第一个");
 list.add(map);

 map = new HashMap<String, Object>();
 map.put("img", R.drawable.img2);
 map.put("title", "second");
 map.put("info", "第二个");
 list.add(map);

 map = new HashMap<String, Object>();
 map.put("img", R.drawable.img3);
 map.put("title", "third");
 map.put("info", "第三个");
 list.add(map);
 return list;
}

实例图如下:

这里写图片描述

public class MainActivity extends Activity {

    ListView lv;

    // 数据源

    String[] names = { "范冰冰", "李晨", "王宝强" };
    String[] contents = {
            "简介:范冰冰,1981年9月16日生于山东青岛,华语影视女演员、歌手、制片人。1996年参演电视剧《女强人》。1998年主演电视剧《还珠格格》系列成名,2001年起投身大银幕。",
            "简介:李晨,1978年11月24日出生于北京市,中国内地影视男演员、监制、赛车手,毕业于北京群星艺术学院。",
            "王宝强,1984年5月29日出生于河北省邢台市,中国内地男演员、导演。王宝强6岁开始练习武术,8岁在嵩山少林寺做俗家弟子。2003年,凭借剧情片《盲井》获得第40届台湾电影金马奖最佳新演员奖[1-2]  。2004年,因参演冯小刚执导的剧情片《天下无贼》而获得关注。" };
    int[] ids = { R.drawable.fbb, R.drawable.lichen, R.drawable.wangbaoqiang };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // GridView spinner = new GridView(this);
        // spinner.setNumColumns(2);
        // setContentView(spinner);
        setContentView(R.layout.activity_main);
        lv = (ListView) findViewById(R.id.lv);
        // 创建适配器
        // ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
        // android.R.layout.simple_list_item_1, data);
        List<HashMap<String, Object>> data = new ArrayList<HashMap<String, Object>>();
        // 添加数据
        // list是指你有多少个条目.
        for (int i = 0; i < 3; i++) {
            HashMap<String, Object> map = new HashMap<String, Object>();
            map.put("img", ids[i]); // R.id.img
            map.put("name", names[i]);// R.id.name
            map.put("content", contents[i]);// R.id.content
            data.add(map);
        }
        SimpleAdapter adapter = new SimpleAdapter(this, data,
                R.layout.item_lv_star,
                new String[] { "img", "name", "content" }, new int[] {
                        R.id.img, R.id.name, R.id.content });
        // spinner.setAdapter(adapter);
        lv.setAdapter(adapter);
    }
}

主布局

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"

    tools:context="com.xykj.id05_10_11.listsimpleaapter.MainActivity" >

    <ListView 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/lv"
        ></ListView>

</RelativeLayout>

显示页面

<?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" >
    <ImageView 
        android:layout_width="80dp"
        android:layout_height="80dp"
        android:id="@+id/img"
        android:src="@drawable/ic_launcher"
        />
<LinearLayout 
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:layout_toRightOf="@id/img"
    android:padding="10dp"
    >
    <TextView 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/name"
        android:text="名字"/>
    <TextView 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/content"
        android:text="简介"/>

</LinearLayout>
</RelativeLayout>

BaseAdapter

重写四个方法:
getCount() View显示的个数
getItem(int position)某一条数据
getItemId(int position)这条数据的id也就是position
getView(int position, View convertView, ViewGroup parent)返回布局

布局重用

 class ViewHolder
 {
 创建视图上的所有需要修改的组件
 public ViewHolder(View convertView)
 {
 组件convertView.findViewByID
 // convertView.setTag(this);
}
}

getView()
{
ViewHolder holder;
if(convertView == null)
{
 //如果为空,代表 一屏没有加载完毕
加载布局
一般使用VconvertView = View.inflater(上下文,布局id,null);
//导入布局后 加载视图的组件
 holder = new ViewHolder(convertView);
//设置到布局中
convertView.setTag(holder);
}else
{
 //重用的布局 代表已经加载了一屏
 holder= (ViewHolder)convertView.getTag();
}
//开始设置组件上面的具体内容
 T t = list.get(position);
holder.tv.setText(t.getName());
 return convertView;
 } 

示例图如下:

这里写图片描述

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ListView lv = (ListView) findViewById(R.id.lv);
        // 适配器
        List<String> list = new ArrayList<String>();
        final List<Article> list2 = new ArrayList<MainActivity.Article>();
        for (int i = 0; i < 100; i++) {
            list.add("条目" + i);
            list2.add(new Article("标题" + i, "内容" + i));
        }

        // MyBaseAdapter adapter = new MyBaseAdapter(this, list);
        final MyBaseAdapter2 adapter = new MyBaseAdapter2(this, list2);
        lv.setAdapter(adapter);

        // ListView的点击事件
        lv.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                // postion代表点的第几个
                Article a = list2.get(position);
                Toast.makeText(getBaseContext(), a.toString(),
                        Toast.LENGTH_SHORT).show();
                try {
                    Thread.sleep(20000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        // 一般长按事件用来做 删除和弹出对话框
        lv.setOnItemLongClickListener(new OnItemLongClickListener() {

            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view,
                    int position, long id) {
                list2.remove(position);
                // 调用adapter.notifyDataSetChanged方法来刷新适配器,保证数据改变之后,view刷新
                // 长度不一致会导致崩溃
                // 类容发生改变不会
                // Article a = list2.get(position);
                // a.content = "哈哈,修改了";
                // 必须在主线程
                adapter.notifyDataSetChanged();
                return true;
            }
        });
    }

    public static class Article {
        String title;
        String content;

        @Override
        public String toString() {
            return "Article [title=" + title + ", content=" + content + "]";
        }

        public Article(String title, String content) {
            super();
            this.title = title;
            this.content = content;
        }

    }
}
//简单点的一个适配器
public class MyBaseAdapter extends BaseAdapter {

    private List<String> list;
    private Context context;

    // 数据源
    public MyBaseAdapter(Context context, List<String> list) {
        this.list = list;
        this.context = context;
    }

    @Override
    public int getCount() {
        // 获取多少条
        Log.e("TAG", list.size() + "--------------getConut");
        return list.size();
    }

    @Override
    public String getItem(int position) {
        return list.get(position);
    }

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

    // 最重要的方法
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        Log.e("TAG", position + "--------------getView");
        // position 代表当前的第几项
        // convertView布局重用
        // parent父布局
        // 一切与布局相关的初始化都需要上下文
        // 只有一个组件的时候可能看不出卡
        // TextView tv = new TextView(context);
        // // 设置数据
        // tv.setText(getItem(position));
        // Log.e("TAG", "---" + (convertView == null));
        // 布局重用的固定写法
        if (convertView == null) {
            convertView = new TextView(context);
            // 口袋
            convertView.setTag(position);
        }
        TextView tv = (TextView) convertView;
        tv.setText(getItem(position));
        Log.e("TAG", tv.getTag().toString());
        return tv;
    }

}
//复杂一些的适配器
public class MyBaseAdapter2 extends BaseAdapter {

    private Context context;
    private List<Article> list;

    public MyBaseAdapter2(Context context, List<Article> list) {
        this.context = context;
        this.list = list;
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return list == null ? 0 : list.size();
    }

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

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            convertView = View.inflate(context, R.layout.item_layout, null);
            holder = new ViewHolder(convertView);
            convertView.setTag(holder);
        } else
            holder = (ViewHolder) convertView.getTag();
        holder.setData(list.get(position));
        return convertView;
    }

    // 对于一个较复杂的布局,组件比较多
    class ViewHolder// 保存的是所有的布局上的组件
    {
        TextView title;
        TextView content;

        public ViewHolder(View convertView) {
            title = (TextView) convertView.findViewById(R.id.tv1);
            content = (TextView) convertView.findViewById(R.id.tv2);
            // convertView.setTag(this);
        }

        public void setData(Article a) {
            title.setText(a.title);
            content.setText(a.content);
        }
    }

    // @Override
    // public View getView(int position, View convertView, ViewGroup parent) {
    // // 加载布局,考虑布局重用
    // if (convertView == null) {
    // // View的静态方法 加载视图
    // convertView = View.inflate(context, R.layout.item_layout, null);
    // }
    // // 从一个View中获取他里面的子控件
    // TextView title = (TextView) convertView.findViewById(R.id.tv1);
    // TextView content = (TextView) convertView.findViewById(R.id.tv2);
    // title.setText(list.get(position).title);
    // content.setText(list.get(position).content);
    // // 一定要注意
    // return convertView;
    // }

}
//主xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.lesson7_baseadapter.MainActivity" >

    <ListView
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>
//显示的xml

<?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" >

    <TextView
        android:id="@+id/tv1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="标题" />

    <TextView
        android:id="@+id/tv2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="内容" />

</LinearLayout>
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值