android adapter使用,Android Adapter基本使用

Adapter最常用的类有三个,ArrayAdapter、SimpleAdapter、BaseAdapter。

1、ArrayAdapter,最简单的适配器,只能显示一行文本。

import android.app.Activity;

import android.os.Bundle;

import android.widget.ArrayAdapter;

import android.widget.ListView;

public class MainActivity extends Activity{

//定义数据源

private String[] datas = {"1","2","3","4","5"};

private ArrayAdapter adapter;

private ListView listView;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

listView = (ListView) findViewById(R.id.xxx);//加载listView

//初始化适配器

adapter = new ArrayAdapter<>(this,android.R.layout.simple_expandable_list_item_1,datas);

listView.setAdapter(adapter);//为listView设置适配器

}

}

初始化适配器的三个参数,第一个参数为contex上下文对象,第二个参数为item的样式,第三个参数为数据源

系统提供的item样式:

simple_list_item1:单独的一行文本框

simple_list_item2:有两个文本框组成

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

simple_list_item_multiple_choice:都带有一个复选框

simple_list_item_single_choice:都带有一个单选框

2、SimpleAdapter

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> datas;//声明数据源

private SimpleAdapter adapter;//声明适配器

private ListView listView;//声明listView

//初始化数据源

private String[] titles = {"1","2","3"};

private String[] contents ={"i am the first","i am the second","i am the third"};

private int[] imageViews = {R.mipmap.xxx,R.mipmap.xxx,R.mipmap.xxx};

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

listView = (ListView) findViewById(R.id.xxx);

//对数据源进行封装

datas = new ArrayList<>();

for(int i = 0; i < titles.length; i++){

Map map = new HashMap<>();

map.put("titles",titles[i]);

map.put("contents",contents[i]);

map.put("images",imageViews[i]);

datas.add(map);

}

adapter = new SimpleAdapter(this,datas,R.layout.xxx

,new String[]{"titles","contents","images"}

,new int[]{R.id.xxx,R.id.xxx,R.id.xxx});

listView.setAdapter(adapter);

}

}

在SimpleAdapter的初始化方法中,

第一个参数this是Context上下文对象

第二个参数datas是数据源。是一个List extends Map>类型的集合对象,该集合中每个Map对象都对应生成一个item列表项

第三个参数是item列表项的布局文件

第四个参数是数据源的Map对象中的键值

第五个参数是item列表项中每个控件元素的ID,顺序与第四个参数中的子元素一一对应。比如第五个参数的第一个子元素控件ID代表的是显示title的内容,那么第四个参数的第一个子元素必定是"titles"这个键值

3、BaseAdapter

自定义BaseAdapter必须重写的四个方法:

(1)public int getCount() //数据源数据的个数

(2)public Object getItem(int position) //数据源中与指定索引对应的数据项

(3)public long getItemId(int position) //获取指定行对应的ID

(4)public View getView(int position, View convertView, ViewGroup parent) //获取每一个Item的显示内容。

ViewHolder优化BaseAdapter思路:

(1)创建用作数据转模型对象的类,该类的实例化对象用于封装数据

(2)在继承BaseAdapter的类的构造方法中初始化用于映射数据的List

(3)创建ViewHolder类,创建布局映射关系

(4)判断convertView是否为空,为空即创建convertView和ViewHolder的实例化对象,并设置tag为ViewHolder的实例对象,不为空否则通过tag来取出ViewHoldr。

5)给ViewHolder中的控件设置数据

创建数据转模型对象的类DemoModle.java:

class DemoModel {

int itemLeftImage;

String itemTitle;

String itemContent;

DemoModel(int itemLeftImage, String itemTitle, String itemContent){

this.itemLeftImage = itemLeftImage;

this.itemTitle = itemTitle;

this.itemContent = itemContent;

}

}

自定义的BaseAdapter类CustomAdapter.java:

import android.content.Context;

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.List;

public class CustomAdapter extends BaseAdapter {

private List list;//映射数据

private LayoutInflater layoutInflater;//布局填充

CustomAdapter(Context context, List list){//CustomAdapter构造方法

this.layoutInflater = LayoutInflater.from(context.getApplicationContext());

this.list = list;

}

//获取数据量

@Override

public int getCount() {

return list.size();

}

//获取ID对应的每个数据项

@Override

public Object getItem(int i) {

return list.get(i);

}

//获取每个数据项对应的ID

@Override

public long getItemId(int i) {

return i;

}

//获取视图

@Override

public View getView(int i, View view, ViewGroup viewGroup) {

ViewHolder holder;

if (view==null){

//将布局文件转化为View

view = layoutInflater.inflate(R.layout.demo_model_item,viewGroup,false);

holder = new ViewHolder(view);

view.setTag(holder);

}else {

holder = (ViewHolder) view.getTag();

}

//获取每个数据项的对象

DemoModel model = list.get(i);

//设置控件数据

holder.itemLeftImageView.setImageResource(model.itemLeftImage);

holder.itemTitleView.setText(model.itemTitle);

holder.itemContentView.setText(model.itemContent);

return view;

}

//ViewHolder用于缓存控件

private static class ViewHolder{

private ImageView itemLeftImageView;

private TextView itemTitleView;

private TextView itemContentView;

ViewHolder(View view){

itemLeftImageView = view.findViewById(R.id.demo_leftImage);

itemTitleView = view.findViewById(R.id.demo_idTitle);

itemContentView = view.findViewById(R.id.demo_idContent);

}

}

}

布局文件demo_model_item.xml:

android:layout_width="match_parent"

android:layout_height="44dp"

xmlns:app="http://schemas.android.com/apk/res-auto">

android:id="@+id/demo_leftImage"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

app:layout_constraintLeft_toLeftOf="parent"

app:layout_constraintTop_toTopOf="parent" />

android:id="@+id/demo_idTitle"

android:layout_width="wrap_content"

android:layout_height="22dp"

app:layout_constraintLeft_toRightOf="@+id/demo_leftImage"

app:layout_constraintTop_toTopOf="parent"

android:textColor="@color/colorWhite"/>

android:id="@+id/demo_idContent"

android:layout_width="wrap_content"

android:layout_height="22dp"

app:layout_constraintLeft_toRightOf="@+id/demo_leftImage"

app:layout_constraintBottom_toBottomOf="parent"

android:textColor="@color/colorWhite"/>

MainActivity.java:

import android.content.Intent;

import android.os.Bundle;

import android.widget.ListView;

import java.util.ArrayList;

import java.util.List;

public class MainActivity extends FatherActivity {

//ListView的数据

private String[] titles = {"Thread demo","ok_http demo","socket demo","other demo","other2 demo"};

private String[] contents = {"This is Thread demo","This is ok_http demo","This is socket demo","This is other demo","This is other2 demo"};

private int[] leftImages = {R.mipmap.ic_launcher,R.mipmap.ic_launcher,R.mipmap.ic_launcher,R.mipmap.ic_launcher,R.mipmap.ic_launcher};

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//初始化数据源

List list = new ArrayList<>();

for (int i = 0; i < titles.length; i++){

DemoModel model = new DemoModel(leftImages[i],titles[i],contents[i]);

list.add(model);

}

//初始化适配器

CustomAdapter adapter = new CustomAdapter(this, list);

ListView listView = findViewById(R.id.listView);

listView.setAdapter(adapter);

//为ListView添加点击事件

listView.setOnItemClickListener((adapterView, view, i, l) -> {

String itemStr = titles[i];

switch (itemStr){

case "Thread demo":

break;

case "ok_http demo":

break;

}

});

}

@Override

protected void onDestroy() {

super.onDestroy();

}

}

4、ListView点击事件

使用OnItemClickListener()方法为ListView注册监听器

//为ListView添加点击事件

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

@Override

public void onItemClick(AdapterView> parent, View view, int position, long id) {

}

});

//完整版

public void onItemClick(AdapterView> parent, View view, int position, long id) {}

//简版

OnItemClick(AdapterView agr0, View arg1, int arg2, long arg3)

参数解析:

(1)parent

相当于适配器的一个指针,可以通过它来获得ListView里面装的一切东西,通俗点就是告诉你,你点的是哪个ListView。

(2)view

可以用这个view,来获得item的控件,通过它可以获得该项中的各个组件,例如:arg1.textview.setText(“abc”)。

(3)position

itme在适配器里的位置(生成ListView时,适配器一个一个的做item,然后把他们按顺序排好队,再放到ListView里)。

(4)id

item在ListView里面的第几行,在没有headerView、用户添加的view以及footerView的情况下,position和id的值是一样的。

补充:

1、LayoutInflater(布局填充器)

public View inflate (int resource, ViewGroup root)

public View inflate (int resource, ViewGroup root, boolean attachToRoot)

(1)如果root为null,attachToRoot将失去作用,设置任何值都没有意义;

(2)如果root不为null,attachToRoot设为true,则会给加载的布局文件的指定一个父布局,即root;

(3)如果root不为null,attachToRoot设为false,则会将布局文件最外层的所有layout属性进行设置,当该view被添加到父view当中时,这些layout属性会自动生效;

(4)在不设置attachToRoot参数的情况下,如果root不为null,attachToRoot参数默认为true;

2、ViewHolder

ViewHolder通常出现在适配器里,为的是listview滚动的时候快速设置值,当listview有大量的数据需要加载的时候,会占据大量内存,影响性能,为了节省资源提高运行效率,一般自定义类ViewHolder来减少findViewById()的使用以及避免过多地inflate view,而不必每次都重新创建很多对象,从而提升性能。

3、convertView

使用convertView主要是为了缓存试图View,用以增加ListView的item view加载效率。在Adapter的getView中,先判断convertView是否为空null,如果非空,则直接再次对convertView复用,否则才创建新的View。ListView在复用的缓存convertView过程中,并不保证是按顺序复用convertView的,而是呈现一定的随机性。每一轮的复用,都必将已缓存的convertView用完,只是不保证复用顺序。

当ListView中的item被滑出屏幕时,一般情况下会重新new一个View给新显示的item,而如果使用了convertView,我们就可以复用它,省去了new View的大量开销。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值