1. 程式人生 > 實用技巧 >android基礎-ListView(資料展示元件)

android基礎-ListView(資料展示元件)

ListView簡介

ListView使用者android後端資料在佈局中展示的元件,一般在Java程式碼中配合Adapter和使用。建立ArraryAdapter介面卡,通過泛型來指定要適配的資料型別,然後在建構函式中把要適配的資料傳入。

簡單列表 listview

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <LinearLayout 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:orientation="vertical"
        tools:context=".MainActivity">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center|top"
            android:textSize="20dp"
            android:text="下方listview可以上下滾動">
        </TextView>
        <ListView
            android:id="@+id/text1"
            android:layout_width="match_parent"
            android:layout_height="200dp"
            android:fastScrollEnabled="true">
        </ListView>
    </LinearLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

MainActivity.java

package com.example.listview_project;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class MainActivity extends AppCompatActivity {

    private String [] data = {"小貓","小狗","小豬","小鼠","小狼","小虎","小象","小猴","小鹿"};
    // 或  private String[] data = {"姓名:小明","性別:男","年齡:25","居住地:上海","郵箱:[email protected]"};
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //ArraryAdapter介面卡,通過泛型來指定要適配的資料型別,然後在建構函式中把要適配的資料傳入。
        ArrayAdapter list_data = new ArrayAdapter(MainActivity.this, android.R.layout.simple_list_item_1,data);
        // 定義介面佈局元素物件
        ListView list_View = (ListView) findViewById(R.id.text1);
        // 把資料傳輸到佈局介面
        list_View.setAdapter(list_data);
    }
}

帶標題的 listview

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".MainActivity">
        <ListView
            android:id="@+id/text1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
        </ListView>
        <ListView
            android:id="@+id/text2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
        </ListView>
    </LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>

MainActivity.java

package com.example.listview_project;
import android.app.ListActivity;
import android.os.Bundle;
import android.widget.SimpleAdapter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;


public class MainActivity extends ListActivity {
    // 模擬資料
    private String[] mListTitle = {"姓名", "性別", "年齡", "居住地", "郵箱"};
    private String[] mListStr = {"小明", "男", "25", "上海", "[email protected]"};
    // 宣告map型別陣列
    ArrayList mData= new ArrayList();;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        // 將模擬資料新增到map陣列中
        for(int i = 0; i < mListTitle.length; i++) {
            Map<String,Object> item = new HashMap<String,Object>();
            item.put("title", mListTitle[i]);
            item.put("text", mListStr[i]);
            mData.add(item);
        }
        // SimpleAdapter 介面卡,通過泛型來指定要適配的資料型別,然後在建構函式中把要適配的資料傳入。
        SimpleAdapter list_data = new SimpleAdapter(this,mData,android.R.layout.simple_list_item_2,
                new String[]{"title","text"},new int[]{android.R.id.text1,android.R.id.text2});
        setListAdapter(list_data);

    }
}

帶圖片和文字的 listview

使用 inflate 將佈局資源轉換 view物件

activity_main.xml 用“缸”字組詞主佈局檔案

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

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

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="35pt"
    android:layout_marginTop="10dp"
    android:layout_marginRight="10dp"
    >

    <ImageView
        android:id="@+id/iv_con"
        android:layout_width="30pt"
        android:layout_height="30pt"
        android:layout_centerVertical="true"
        android:layout_marginLeft="5dp"
        android:src="@mipmap/ic_launcher">
    </ImageView>
    <TextView
        android:id="@+id/title_text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/iv_con"
        android:layout_marginLeft="10dp"
        android:textSize="22dp"
        android:textStyle="bold"
        android:singleLine="true"
        android:ellipsize="end"
        android:text="這是一個安卓開發inflate練習的模擬標題資料標題">
    </TextView>
    <TextView
        android:layout_width="match_parent"
        android:layout_height="20pt"
        android:layout_toRightOf="@id/iv_con"
        android:layout_below="@+id/title_text"
        android:layout_marginLeft="10dp"
        android:textSize="16dp"
        android:ellipsize="end"
        android:text="這是開發測試的內容,內容就隨便寫寫了,反正也是湊字數。等後期學到資料庫就從後端呼叫了,不用再寫模擬資料了">
    </TextView>
</RelativeLayout>

MainActivity.java

package com.example.listview_project;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;

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

        // 定義介面佈局元素物件
        ListView list_View = (ListView) findViewById(R.id.text1);

        // 把資料傳輸到佈局介面
        list_View.setAdapter(new MyAdapter());
    }
    // 資料介面卡方法
    private class MyAdapter extends BaseAdapter{

        @Override
        public int getCount() {
        // 返回顯示的行數
            return 20;
        }

        @Override
        public Object getItem(int i) {
            return null;
        }

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

        @Override
        public View getView(int i, View view, ViewGroup viewGroup) {
            View DisplayView;
            // listview 優化
            if (view == null){
                // 用“敢”字組詞通過 inflate 將 xml佈局資源 轉化為 view物件
                DisplayView = View.inflate(getApplicationContext(),R.layout.item,null);
            }else{
                // 複用歷史快取物件
                DisplayView = view;
            }
            return DisplayView;
        }
    }
}