13.Android-ListView使用、BaseAdapter/ArrayAdapter/SimpleAdapter適配器使用

1.ListViewjava

ListView 是 Android 系統爲咱們提供的一種列表顯示的一種控件,使用它能夠用來顯示咱們常見的列表形式。繼承自抽象類 AdapterView。繼承圖以下所示:android

 

 

以微信好友列表爲例:設計模式

 

裏面的每一個好友就是由一個個 item 組成的,而每一個item都存在Adapter適配器類中(負責數據處理),而後經過ListView顯示出來.數組

 

2.ListView顯示原理微信

ListView顯示數據原理實際就是MVC設計模式,以下圖所示:app

 

  • Model(模型) – 數據集合,用來存儲數據組織
  • View(視圖) – ListView,負責數據顯示
  • Controller(控制器) - 負責管理Model,並設置要顯示的哪一個具體數據.

 

3.使用BaseAdapter適配器

BaseAdapter比較簡單,主要是經過繼承此類來實現BaseAdapter的四個方法:ide

public int getCount();
//設置適配器中數據集的數據個數(ListView要顯示的全部數據行);

public Object getItem(int position):
//獲取數據集中與索引對應的數據項;

public long getItemId(int position);
//獲取指定行對應的ID,通常都是直接返回position

public View getView(int position,View convertView,ViewGroup parent);
//獲取每一行Item的顯示內容。
// position:表示當前獲取的Item是哪一行,開頭從0開始
// convertView:舊視圖複用,若是convertView不爲空則表示能夠用來複用.無需再次new一個view來使用.
// ViewGroup:只有LinearLayout或者RelativeLayout,若是viewGroup傳入一個具體的對象,那麼這個方法建立出來的view對象將做爲這個viewGroup的childView來顯示.

示例效果以下所示:佈局

 

3.1寫activity_main.xmlthis

只是添加了一個ListView:spa

<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"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <ListView
        android:id="@+id/lv_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true" >
    </ListView>

</RelativeLayout>

 

4.2 寫item.xml

用來顯示每一項item的view視圖

<?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:layout_margin="5dp" >

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher" />

    <TextView
        android:id="@+id/tv_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/imageView1"
        android:textSize="20sp"
        android:textColor="#000000"
        android:text="name" />

    <TextView
        android:id="@+id/tv_content"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/imageView1"
        android:layout_alignLeft="@+id/tv_name"
        android:text="content"
        android:textColor="#88000000"
        android:textSize="18sp" />

</RelativeLayout>

 

 4.3 寫MainActivity.java

package com.example.baseadaptertest;

import java.util.ArrayList;

import android.os.Bundle;
import android.app.Activity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;


class Person {
    String name;
    String content;
    
    public Person(String name,String content){
        this.name = name;
        this.content = content;
    }
    public String getName() {
        return name;
    }
    public String getContent() {
        return content;
    }
}

public class MainActivity extends Activity {
    
    ArrayList<Person>    list;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        //1.添加要顯示的數據
        list  = new ArrayList<Person>();
        list.add(new Person("張三","18歲  電話:158888666"));
        list.add(new Person("李四","21歲  電話:158888777"));
        list.add(new Person("王二","23歲  電話:158888877"));
        list.add(new Person("孫武","25歲  電話:158888997"));
        
        //2.設置Adapter
        ListView lv_list = (ListView)findViewById(R.id.lv_list);
        lv_list.setAdapter(new MyAdapter());
        
    }
    
    
    class MyAdapter extends BaseAdapter{

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

        @Override
        public Object 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) {
            
            View view = null;
            
            //若是convertView爲空則須要從新建立資源視圖,若是不爲空則表示能夠用來複用.無需再次new一個view來使用.
            if(convertView==null){
                 //經過R.layout.item 來建立一個item視圖資源
                 view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.item, null);
            }else{
                
                view = convertView;
            }
            
            //設置要顯示的內容
            TextView  tv_name =  (TextView)view.findViewById(R.id.tv_name);
            TextView  tv_content =  (TextView)view.findViewById(R.id.tv_content);
            
            tv_name.setText(list.get(position).getName());
            tv_content.setText(list.get(position).getContent());
            
            
            return view;
        }
    }
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
}

 

5.使用ArrayAdapter適配器

 ArrayAdapter數組適配器用於綁定格式單一的數據,每一個item只有一個數據須要被修改,數據源能夠是集合或者數組

而且ArrayAdapter能夠直接用來使用,無需再繼承此類來實現.

ArrayAdapter的構造方法經常使用的有兩種:

public ArrayAdapter(Context context, int resource, T[] objects);
//第一個參數 上下文
//第二個參數 包含且只有一個textview的佈局文件id
//第三個參數 要展現的數據數組

public ArrayAdapter(Context context, int resource, int textViewResourceId, T[] objects);
//第一個參數 上下文
//第二個參數 能夠包含不少內容(ImageView、textview等)的佈局文件id
//第三個參數 指向resource中要顯示數據的一個textView控件id
//第三個參數 要展現的數據數組

接下來,咱們使用第二種構造方法來演示.

效果以下:

 

 

5.1 寫activity_main.xml

只是添加了一個ListView,內容和BaseAdapter的activity_main.xml一致

5.2 寫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:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher" />

    <TextView
        android:id="@+id/tv_content"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="name"
        android:textColor="#AA000000"
        android:textSize="40sp" />

</LinearLayout>

 

5.3 寫MainActivity.java

package com.example.arrayadapter;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        //定義一個String數組
        String[] objects = {"李白","姜子牙","李元芳","高漸離","后羿","王昭君","虞姬"};
        
        //初始化ArrayAdapter
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(getApplicationContext(), R.layout.item, R.id.tv_content, objects);
        
        //設置ArrayAdapter
        ListView  lv_list = (ListView)findViewById(R.id.lv_list);
        lv_list.setAdapter(adapter);
        
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    
}

 

 

6.使用SimpleAdapter適配器

SimpleAdapter適配器適用於擁有多數據的item. 每一個item經過Map集合來實現.而Map裏則能夠包含多個數據.

SimpleAdapter的構造方法以下所示:

public SimpleAdapter(Context context, List<? extends Map<String, ?>> data,

            int resource, String[] from, int[] to);

//context: 上下文,填入getApplicationContext()便可
//data:包含了Map(String ,Object)的List數組,每一個Map表示每一個item數據。
//resource:要加載item的xml佈局文件Id
//from:string數組, 用來標識一個item須要設置哪些key.而key對應的value則是要顯示的數據
//to:int數組,填入item xml佈局文件裏的要更改的控件內容ID號 ,用來對應from中的key值,表示設置的key值最終是更改哪些控件內容

效果以下:

 

6.1 寫activity_main.xml

只是添加了一個ListView,內容和BaseAdapter的activity_main.xml一致

6.2 寫item.xml

<?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:layout_margin="5dp" >

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="60dp"
        android:src="@drawable/ic_launcher" />

    <TextView
        android:id="@+id/tv_title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/imageView1"
        android:textSize="17sp"
        android:textColor="#000000"
        android:text="name" />

    <TextView
        android:id="@+id/tv_content"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/imageView1"
        android:layout_alignLeft="@+id/tv_title"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/tv_title"
        android:text="content"
        android:textColor="#88000000"
        android:textSize="15sp" />

</RelativeLayout>

 

6.3 寫MainActivity.java

package com.example.simpleadapter;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.ListView;
import android.widget.SimpleAdapter;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        
        
        
        List<Map<String, String>> data = new ArrayList<Map<String,String>>();
        String[] from = {"title","content"};//用來標識一個item須要設置哪些key.而key對應的value則是要顯示的數據,這裏設置了2個key
        int[] to={R.id.tv_title,R.id.tv_content}; //填入要更改的控件內容ID號 ,用來對應from中的兩個key值,
        
        
        //添加內容
        Map<String, String>  map1 = new HashMap<String, String>();
        map1.put("title", "成都5.1級地震");
        map1.put("content", "成都市青白江區5.1級地震尚無人員傷亡報告");
        data.add(map1);
        
        Map<String, String>  map2 = new HashMap<String, String>();
        map2.put("title", "英雄聯盟手遊即將上線");
        map2.put("content", "期待已久的英雄聯盟即將上線...");
        data.add(map2);
        
        Map<String, String>  map3 = new HashMap<String, String>();
        map3.put("title", "英語專四考試延期");
        map3.put("content", "2020年英語專四專八考試延期...");
        data.add(map3);
        
        Map<String, String>  map4 = new HashMap<String, String>();
        map4.put("title", "上海出臺減負政策");
        map4.put("content", "上海發佈抗疫企業減負政策 中小微企業:但願繼續加大...");
        data.add(map4);
        
        Map<String, String>  map5 = new HashMap<String, String>();
        map5.put("title", "最硬核科蜜");
        map5.put("content", "史上最硬核科蜜!穿着24號肩扛RPG佇立戰火中...");
        data.add(map5);
        
        //初始化SimpleAdapter
        SimpleAdapter adapter = new SimpleAdapter(getApplicationContext(), data, R.layout.item, from, to);
        
        
        //設置SimpleAdapter
        ListView  lv_list = (ListView)findViewById(R.id.lv_list);
        lv_list.setAdapter(adapter);
        
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    
}

 

 

Ps:若是要設置Item點擊事件,則經過下面方法設置便可

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

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

               //寫要實現的事
            }
 });
相關文章
相關標籤/搜索