Android应用程序设计——适配器

  • Android高级控件

MVC 架构:

M : model 数据(某种格式的数据) 列: 数组、集合{List Map}

V : View 视图 : 控件

C : Controller 适配器,以某种规则将数据显示到View上

ListView:它以列表的形式展示具体内容,并且能够根据数据的长度自适应显示。

  • Xml中常用属性设置

1)android:id                    设置id

2)android:divider                  设置分割线

3)android:dividerHeight         设置分割线的高度(单位dp)

  1. Activity中常用的方法
  2. setAdapter()                     设置适配器 
  3. setOnItemClickListener()      设置鼠标点击事件[ˈaɪtəm]   

 

 

 

 

 

   

ArrayAdapter适配器所生成的列表,每一个项里(item)有且只有一个TextView控件。

  • ArrayAdapter的使用方法

// ListView对象绑定XML布局文件中对应的控件

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

// 向数组中添加显示的数据

String[] movies = new String[] { "我喜爱的电影1", "我喜爱的电影2", "我喜爱的电影3", "我喜爱的电影4","我喜爱的电影5", "我喜爱的电影6", "我喜爱的电影7", "我喜爱的电影8", "我喜爱的电影9","我喜爱的电影10"};

// 创建适配器 ArrayAdapter

ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(

this,                     //当前Activity

    android.R.layout. simple_list_item_1, //系统默认的单行布局simple_list_item_2两行

     android.R.id.text1,

movies);                   //需要显示的数据数组

// 设置ListView的适配器

listView.setAdapter(arrayAdapter);

 

 

列:布局文件中
<ListView

    android:id="@+id/lv"

    android:layout_width="match_parent"

    android:layout_height="wrap_content"

    ></ListView> 
                           
注:显示的一行一行的view
 
Java代码操作:
          //声明
          private ListView listView;

          private Button SimpleAdapterBtn, ArrayAdapterBtn;

 
          //实例化
         listView = (ListView) view.findViewById(R.id.lv);
          ArrayAdapterBtn = (Button) view.findViewById(R.id.ArrayAdapterBtn);

SimpleAdapterBtn = (Button) view.findViewById(R.id.SimpleAdapterBtn);
 

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    //对按钮设置监听事件
    ArrayAdapterBtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            //创建一个ArrayAdapter 需要四个参数
            // 1、上下文
            // 2、引用的布局文件
            // 3、引用布局文件的ID
            // 4、数据源 (此处为一个循环方法)
            ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(getActivity(),
                    R.layout.list_item,R.id.text666,getList());
            //设置适配器
            listView.setAdapter(arrayAdapter);
        }
    });

         
          //生成数据M========ArrayAdapter

private List<String> getList(){

    List<String> data = new ArrayList<>();

    for(int i=1;i<=200;i++){

        data.add("这是第"+i+"个item");

    }

        return  data;

}
 
 
效果:
  上:   下:      
 

 

    1.  SimpleAdapter

SimpleAdapter适配器所生成的列表,每一项(item)中可以有任意个控件,需要自定义布局文件,控件类型可以包括TextView、ImageView、CheckBox等。

      1. SimpleAdapter的使用方法

// 需显示的数据,图片使用id

int[] intImage = new int[] { R.drawable.ic_launcher,R.drawable.ic_launcher, R.drawable.ic_launcher };

String[] strName = new String[] { "古天乐", "刘德华", "周润发" };

String[] strMsg = new String[] { "什么时候找我拍电影?", "上一次的合作满意吗?","快来吃饭,就差你了!" };

// 使用List对象保存需显示的数据,每一个item中显示的数据使用Map以键值对的形式保存

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

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

    // 需要显示的数据以键值对的形式存入Map中,每个Map就是一个item的数据

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

    map.put("imageId", intImage[i]);

    map.put("name", strName[i]);

    map.put("msg", strMsg[i]);

    // 把Map存入List中

    list.add(map);

}

// 创建适配器 SimpleAdapter

SimpleAdapter simpleAdapter = new SimpleAdapter(

    this,        //当前Activity

    list,        //需要显示的数据(格式固定:List<Map<String,object>>)

    R.layout.activity_item,        //显示item的布局文件,一般自定义

    new String[] { "imageId", "name", "msg" }, //map中的key字符串数组

    new int[] {R.id.imageview, R.id.tv_name, R.id.tv_msg });//item布局中控件的id数组

// ListView对象绑定XML布局文件中对应的控件

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

// 设置ListView的适配器

listView.setAdapter(simpleAdapter);

 

 

列:
//对SimpleAdapterBtn按钮进行监听事件

SimpleAdapterBtn.setOnClickListener(new View.OnClickListener() {

    @Override

    public void onClick(View view) {

        //实例化String数据装 生成数据中的map “Key"值  simpleAdapter 需要此参数

        String[] from = new String[]{"name","image","sex"};

        //实例化int 数据 装布局中对应的ID    simpleAdapter 需要此参数

        int[] to = new int[]{R.id.name,R.id.img,R.id.sex};

        //实例化  SimpleAdapter 需要五个参数

        // 1、上下文

        // 2、数据源

        // 3、寻找布局文件

        // 4、map 中的“Key"值

        // 5、int中对应的ID

        SimpleAdapter simpleAdapter = new SimpleAdapter(getActivity(),getdata(),R.layout.simpleadter,from,to);

        //设置适配器

        listView.setAdapter(simpleAdapter);



    }

});
 

//生成数据M========SimpleAdapter方法
//由于SimpleAdapter中可以装图片、文本数据,所以数据类型为Map<String,Object> 键值对的形式

 

private List<Map<String,Object>> getdata(){
    List<Map<String,Object>> data = new ArrayList<>();
    for(int i=1;i<=200;i++){
        Map<String,Object> map = new HashMap<>();
        if(i%6==1){
            map.put("image",R.mipmap.baby);
            map.put("name", "Angelbaby");
            map.put("sex","
女");
        }else  if(i%6==2){
            map.put("image",R.mipmap.fj);
            map.put("name", "风姐姐");
            map.put("sex","女");
        }else  if(i%6==3){
            map.put("image",R.mipmap.gtl);
            map.put("name", "古天乐");
            map.put("sex","男");
        }else  if(i%6==4){
            map.put("image",R.mipmap.ldh);
            map.put("name", "刘德华");
            map.put("sex","男");
        }else  if(i%6==5){
            map.put("image",R.mipmap.zrf);
            map.put("name", "周润发");
            map.put("sex","男");
        }else  if(i%6==0){
            map.put("image",R.mipmap.zly);
            map.put("name", "张靓颖");
            map.put("sex","女");
        }
        data.add(map);

    }
    return data;

}

 
 
 
 

 

BaseAdapter是一个抽象类,是Android应用程序中经常用到的基础数据适配器,它的主要用途是将一组数据传到像ListView、Spinner、Gallery及GridView等UI显示组件,它是继承自接口类Adapter

  • BaseAdapter的使用方法

//自定义适配器MyAdapter的写法,必须继承BaseAdapter

public class MyAdapter extends BaseAdapter{

    //定义存储Item数据的List类型数据:Lsit<Item布局对应存储数据的实体类>

    private List<ItemBean> list;

    //定义当前Context

    private Context context;

    //定义一个动态加载布局对象

    private LayoutInflater inflater;

    //自定义适配器的构造方法(需要显示的数据,当前Context)

    public MyAdapter(List<ItemBean> list,Context context) {

         this.list = list;

         this.context = context;

         inflater = LayoutInflater.from(context);

    }//获取当前Item的项数

    public int getCount() {  

         return list.size();

    }

    public Object getItem(int arg0) {  //获取索引为arg0Item

         return list.get(arg0);

    }

    public long getItemId(int arg0) {//获取索引为arg0Item项的id

         return arg0;}

//获取索引为arg0Item的布局组件, arg0:获取Item的索引(0开始)

//arg1:获取的Item 布局组件          arg2:获取Item的父容器

    public View getView(int position, View view, ViewGroup arg2) {   

         //声明一个ViewHolder对象

         ViewHolder viewHolder  = null;

         //判断一下当前加载的View是否已加载

         if (view == null) {

             //实例化ViewHolder对象

             viewHolder = new ViewHolder();

             //设置view加载布局(当前Item布局,当前Item的父类布局)

             view = inflater.inflate(R.layout.activity_item, null);

             //ViewHolder对象和Item布局对象一一绑定

             viewHolder.image = (ImageView) view.findViewById(R.id.iv);

             viewHolder.tv = (TextView) view.findViewById(R.id.tv);

             //设置view的Tag(标签):给view添加一组额外的数据

             view.setTag(viewHolder); 

         }else{  

             viewHolder = (ViewHolder) view.getTag();//获取viewHolder

         }

         //获取当前的Item的显示数据

         ItemBean itemBean = list.get(position);

         //为ViewHolder绑定的控件一一赋值

         viewHolder.image.setBackgroundResource(itemBean.getImageId());

         viewHolder.tv.setText(itemBean.getMsg());      

         return view;

    }//内部类,用来和Item布局中的控件一一对应,用处:方便赋值,不需要每次访问Item布局文件

    class ViewHolder{

         private ImageView image;

         private TextView tv;}

}

protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    //和XML布局中的ListVew绑定

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

    //初始化需要显示的数据

    list = new  ArrayList<ItemBean>();         

    list.add(new ItemBean(R.drawable.ic_launcher,"这是系统定义的图标"));

//实例化一个自定义适配器

    MyAdapter myAdapter = new MyAdapter(list, this);

//设置ListView的适配器

lv.setAdapter(myAdapter);

OnItemClickListener

当用户点击ListView的项(item)时,会触发此事件。

  • 绑定匿名监听器

//和XML布局中的ListVew绑定

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

//设置ListView的OnItemClickListener监听事件

lv.setOnItemClickListener(new OnItemClickListener() {

//argo:发生选中事件的ListView     arg1:发生选中事件的Item

//arg2:发生选中事件的Item的索引(0开始)  arg3:发生选中事件的Itemid

    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {

                  Toast.makeText(MainActivity.this, "点击的是第"+ ++arg2 + "项",  

             Toast.LENGTH_SHORT).show();}});

猜你喜欢

转载自blog.csdn.net/qq_42595261/article/details/81838179