Android中Adapter适配器入门

版权声明: https://blog.csdn.net/sandalphon4869/article/details/87267140

三个常用的Adapter:ArrayAdapter、SimpleAdapter和BaseAdapter。


ArrayAdapter(数组适配器)

  • ArrayAdapter()参数

ArrayAdapter(Context context,@LayoutRes int resource,Object[] objects)

第一个参数:context上下文对象

第二个参数:每一个item的样式,可以使用系统提供,也可以自定义就是一个TextView

第三个参数:数据源,要显示的数据

系统提供的item的样式,可以试一试

simple_list_item1:单独的一行文本框

simple_list_item2:有两个文本框组成

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

simple_list_item_multiple_choice:都带有一个复选框

simple_list_item_single_choice:都带有一个单选框

  • setAdapter写法

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<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=".MainActivity">
    <ListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/lv1">
    </ListView>

</RelativeLayout>

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private ListView listView;
    private ArrayAdapter<String> arrayAdapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        ////要显示的数据
        String[] str={"Just","do","it"};
        //创建ArrayAdapter(Context context,@LayoutRes int resource,Object[] objects)
        arrayAdapter=new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,str);
        //获取ListView对象,通过调用setAdapter方法为ListView设置Adapter设置适配器
        listView= this.<ListView>findViewById(R.id.lv1);
        listView.setAdapter(arrayAdapter);
    }
}

效果 

  • entries数组资源xml文件写法

arrays.xml 

在res\value下创建一个数组资源的xml文件:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="myarray">
        <item>Just</item>
        <item>do</item>
        <item>it</item>
    </string-array>
</resources>

activity_main.xml

ListView通过android:entries指定了列表的项数组:

<?xml version="1.0" encoding="utf-8"?>
<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=".MainActivity">
    <ListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:entries="@array/myarray">
    </ListView>

</RelativeLayout>

MainActivity.java

public class MainActivity extends AppCompatActivity {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //都不用写findViewById,因为我们在这里不需要对它额外的进行操作
    }
}

效果一样

使用泛型容器

activity_main.xml同setAdapter写法

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private ListView listView;
    //ArrayAdapter里的类型是容器List里的类型String
    private ArrayAdapter<String> arrayAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        List<String> data = new ArrayList<>();
        data.add("Just");
        data.add("do");
        data.add("it");
        arrayAdapter=new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,data);
        listView= this.<ListView>findViewById(R.id.lv1);
        listView.setAdapter(arrayAdapter);
    }
}

效果一样。 


SimpleAdapter

  • simpleAdapter中五个参数

SimpleAdapter(Context context , List<?extends<Map<String,?>> data , int resource , String from , int[] to)

第一个参数:上下文对象

第二个参数:数据源是含有Map的一个集合

第三个参数:每一个item的布局文件

第四个参数:new String[]{}数组,数组的里面的每一项要与第二个参数中的存入map集合的的key值一样,一一对应

第五个参数:new int[]{}数组,数组里面的第三个参数item里面的控件id。

  • 例子

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<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=".MainActivity">
    <ListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/lv1"
        >
    </ListView>

</RelativeLayout>

listview_item.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="horizontal">

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

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:orientation="vertical">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="40sp"
            android:id="@+id/text1"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="30sp"
            android:id="@+id/text2"/>
    </LinearLayout>

</LinearLayout>

MainActivity.java 

public class MainActivity extends AppCompatActivity {

    private ListView listView;
    private List<Map<String ,Object>> arraylist;
    private SimpleAdapter simpleAdapter;

    private int[] icon={R.drawable.timg001,R.drawable.timg002,R.drawable.timg003};
    private String[] str1={"Just","do","it"};
    private String[] str2={"run","learn","play"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        arraylist=new ArrayList<>();
        //将Map<String,Object>添加进List中 
        for(int i=0;i<str1.length;i++)
        {
            Map<String ,Object> map = new HashMap<>();
            map.put("icon",icon[i]);
            map.put("str1",str1[i]);
            map.put("str2",str2[i]);
            arraylist.add(map);
        }
        simpleAdapter = new SimpleAdapter(this,arraylist,R.layout.listview_item,
                new String[]{"icon","str1","str2"},
                new int[]{R.id.icon,R.id.text1,R.id.text2});
        listView=findViewById(R.id.lv1);
        listView.setAdapter(simpleAdapter);
    }
}

效果


BaseAdapter 

  • 字符串数组例子

新建一个java文件MyBaseAdapter.java,继承自BaseAdapter,并且实现它的4个基础方法。

public int getCount(): 适配器中数据集的数据个数;

public Object getItem(int position): 获取数据集中与索引对应的数据项;

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

public View getView(int position,View convertView,ViewGroup parent): 获取没一行Item的显示内容。

package com.example.sheep.one;

import android.content.Context;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class MyAdapter extends BaseAdapter {
    private String[] data;
    private Context context;

    public MyAdapter(String[] data,Context context)
    {
        this.data=data;
        this.context=context;
    }

    //返回item的个数
    @Override
    public int getCount() {
        return data.length;
    }

    //返回每一个item对象
    @Override
    public Object getItem(int position) {
        return data[position];
    }

    //返回每一个item的id
    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        TextView textView = new TextView(context);
        textView.setText(data[position]);
        return textView;
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<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=".MainActivity">
    <ListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/lv1"
        >
    </ListView>

</RelativeLayout>

MainActivity.java 

public class MainActivity extends AppCompatActivity {

    private ListView listView;
    private MyAdapter myAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String[] data= {"Just","do","it"};
        myAdapter = new MyAdapter(data,this);
        listView=findViewById(R.id.lv1);
        listView.setAdapter(myAdapter);
    }
}

效果

  • item自定义布局例子

猜你喜欢

转载自blog.csdn.net/sandalphon4869/article/details/87267140