1. 程式人生 > >安卓 ListView列表

安卓 ListView列表

介面示例

介面佈局:thumbsup_page_layout.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" >

    <RelativeLayout
        android:id="@+id/thumbsup_tittle_bg"
        android:layout_width="fill_parent"
        android:layout_height="181px"
        android:background="@drawable/thumbsup_tittle_bg" >
    </RelativeLayout>

    <ImageView
        android:id="@+id/thumbsup_close"
        android:layout_width="36px"
        android:layout_height="36px"
        android:layout_alignParentRight="true"
        android:padding="5dp"
        android:src="@drawable/thumbsup_close" />

    <TextView
        android:id="@+id/thumbsup_tittle_note"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/thumbsup_tittle_bg"
        android:background="#0288d1"
        android:gravity="center"
        android:paddingBottom="10dp"
        android:paddingTop="10dp"
        android:text="thumbsup_tittle_note"
        android:textColor="@android:color/white"
        android:textSize="24sp"
        tools:text="關注粉絲頁,獲取免費金幣" />

    <LinearLayout
        android:id="@+id/thumbsup_list_content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/thumbsup_tittle_note"
        android:background="#FFDCDCDC"
        android:orientation="vertical" >
    </LinearLayout>

</RelativeLayout>

列表項佈局:thumbsup_list_iteam_layout.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"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    >

    <RelativeLayout
        android:id="@+id/thumbsup_layout_bg"
        android:layout_width="fill_parent"
        android:layout_height="90px"
        android:layout_marginBottom="1dp"
        android:layout_marginLeft="0dp"
        android:layout_marginRight="0dp"
        android:layout_marginTop="1dp"
        android:background="@drawable/thumbsup_list_iteam_bg"
        android:paddingBottom="5dp"
        android:paddingLeft="10dp"
        android:paddingRight="5dp"
        android:paddingTop="5dp">


            <ImageView
                android:id="@+id/thumbsup_iteam_icon"
                android:layout_width="77px"
                android:layout_height="77px"
                android:layout_centerVertical="true"
                android:src="@drawable/thumbsup_list_game_icon"/>

            <ImageView
                android:id="@+id/thumbsup_iteam_button"
                android:layout_width="100px"
                android:layout_height="50px"
                android:layout_alignParentRight="true"
                android:layout_centerVertical="true"
                android:src="@drawable/thumbsup_list_click_button" />
            
            
            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:layout_marginLeft="5dp"
                android:layout_marginRight="5dp"
                android:layout_toLeftOf="@id/thumbsup_iteam_button"
                android:layout_toRightOf="@id/thumbsup_iteam_icon"
                android:orientation="vertical">

                <TextView
                    android:id="@+id/thumbsup_note1"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text="關注Warfare Strike粉絲頁"
                    android:textColor="@android:color/black"
                    android:textSize="16sp" />

                <TextView
                    android:id="@+id/thumbsup_note2"
                    android:layout_width="match_parent"
                    android:layout_height="0px"
                    android:text="剩餘次數:10"
                    android:textColor="@android:color/black"
                    android:textSize="12sp" />

            </LinearLayout>

    </RelativeLayout>

</RelativeLayout>

ListViewCommonAdapter.java 用於生成List列表

package sci.tool;

import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;


/** ListAdapter.java: 安卓listView內容適配工具類。
 * 讓IteamDatas中的資料按照佈局layoutName進行顯示 ;
 * 
 * (TE為待自定義的資料類,裡面儲存單個列表項的所有資料資訊)
 * 1、繼承該類,繼承方法 ListViewCommonAdapter(), 通過該介面指定單個列表項的佈局檔名、設定所有列表項資料;
 * 2、實現方法,setIteamView(TE iteamData), 設定每個列表項的顯示;
 * 3、實現方法,setIteamClick(Context iteamContext, TE iteamData), 設定每個列表項的點選響應;
 * 4、呼叫 getListView()獲取ListView,或者直接顯示到ViewGroup中ShowListViewIn(ViewGroup group)
 * 
 * ----- 2018-6-7 下午4:18:10 scimence */
public abstract class ListViewCommonAdapter<TE> extends ArrayAdapter<TE>
{
	LayoutInflater layoutInflater;
	int resourceId;
	
	Context context;
	
	/** 根據資源型別、名稱,獲取資源id */
	public static int getId(Context context, String name, String defType)
	{
		return context.getResources().getIdentifier(name, defType, context.getPackageName());
	}
	
	/** 指定 列表項佈局、資料, 構建Adaper.
	 * 
	 * (如:iteam_layout.xml -> listIteam_LayoutName="iteam_layout";
	 * TE[] IteamDatas -> 對應每一個列表項的資料, TE為自定義類包含單個列表項的所有資料;)
	 * */
	public ListViewCommonAdapter(Context context, String listIteam_LayoutName, TE[] IteamDatas)
	{
		super(context, 0, IteamDatas); 				// 呼叫陣列介面卡,進行初始化
		
		this.context = context;
		
		this.resourceId = getId(context, listIteam_LayoutName, "layout");	// listView項佈局資源id
		layoutInflater = LayoutInflater.from(context);  				// 獲取LayoutInflater服務
	}
	
	/** 獲取指定postion位置的列表項對應檢視,list列表項view生成 */
	@Override
	public View getView(int position, View convertView, ViewGroup parent)
	{
		// 從預定義的xml佈局建立新的view檢視
		if (convertView == null) convertView = layoutInflater.inflate(resourceId, null);
		
		// 修改檢視中的資訊
		TE iteam = getItem(position);   			// 獲取position個位置的列表項資料
		
		// int textViewId = ResUtil.getId(convertView.getContext(), "ltpay_text", "id");
		// TextView textView = (TextView) convertView.findViewById(textViewId);
		// textView.setText(iteam.Title);
		
		curIteamView = convertView;
		setIteamView(iteam); // 呼叫虛方法,設定list列表項內容
		curIteamView = null;
		
		return convertView;   								// 返回按給定資料顯示檢視
	}
	
	/** 臨時記錄當前操作的ListView項 */
	private View curIteamView = null;
	
	/** 獲取list列表項指定id對應的View, 若未指定viewId則獲取對應Iteam項對應View */
	public View IteamView(String viewId)
	{
		if (viewId == null || viewId.equals("")) return curIteamView;
		
		int id = getId(curIteamView.getContext(), viewId, "id"); // 獲取ListIteam列表項中指定名稱的View的id
		View view = curIteamView.findViewById(id); // 根據id獲取對應的View
		
		return view;
	}
	
	/** 獲取list列表項指定id對應的View, 若未指定viewId則獲取對應Iteam項對應View */
	public View IteamView(View iteamView, String viewId)
	{
		int id = getId(iteamView.getContext(), viewId, "id");     // 獲取ListIteam列表項中指定名稱的View的id
		View view = iteamView.findViewById(id);                              // 根據id獲取對應的View
		
		return view;
	}
	
	/** 設定list列表項內容。
	 * 
	 *  TE iteamData為:待顯示的單個列表項的對應資料
	 *  列表項的子控制元件,通過 IteamView(String viewId)獲取指定名稱的View;
	 *   */
	public abstract void setIteamView(TE iteamData);
	
	// list的事件響應
	OnItemClickListener listenList = new OnItemClickListener()
	{
		@Override
		public void onItemClick(AdapterView<?> arg0, View iteamView, int postion, long arg3)
		{
			curIteamView = iteamView;
			setIteamClick(context, getItem(postion));
			curIteamView = null;
		}
	};
	
	/** 設定list列表項點選響應邏輯。
	 * 
	 * TE iteamData為:待顯示的單個列表項的對應資料
	 * iteamContext為:單個列表項的Context
	 * 列表項的子控制元件,通過 IteamView(String viewId)獲取指定名稱的View;
	 *  */
	public abstract void setIteamClick(Context iteamContext, TE iteamData);
	
	// ------------
	
	/** 生成listView */
	public ListView getListView()
	{
		ListView list = new ListView(context);				// 建立listView
		list.setDivider(new ColorDrawable(Color.GRAY));  	// 設定分割線顏色
		list.setDividerHeight(1);							// 設定分割線尺寸
		
		list.setAdapter(this);					// 為列表新增顯示資料
		list.setOnItemClickListener(this.listenList);
		
		return list;
	}
	
	/** 生成listView, 並顯示在ViewGroup中 */
	public void ShowListViewIn(ViewGroup group)
	{
		ListView list = this.getListView();    // 生成listView
		list.setDividerHeight(0);                // 設定分割線尺寸
		
		// 在content中顯示ListView資訊
		group.removeAllViews();
		group.addView(list);                    // 新增listView為顯示內容頁
	}
}

定義列表項資料類(根據列表項自定義):

ListIteamData.java


package sci.demo.androidlistview;

import org.json.JSONArray;
import org.json.JSONObject;

import sci.tool.WebTool;
import android.graphics.drawable.Drawable;
import android.util.Log;


/** ListIteamData.java: 定義該結構用於表示列表項的資料結構 ----- 2018-10-25 下午8:20:46 scimence */
public class ListIteamData
{
	public String iconUrl, btnUrl1, btnUrl2, note;		// 圖示url地址、按鈕url、灰色按鈕url、文字說明資訊
	
	Drawable icon, btn1, btn2;							// 圖示影象、按鈕影象、灰色按鈕影象
	public boolean isClicked = false;					// 其他資訊,記錄列表項是否已點選
	
	ListIteamData()
	{}
	
	// public ListIteamData(String... data)
	// {
	// this.iconUrl = data[0];
	// this.btnUrl1 = data[1];
	// this.note1 = data[2];
	// this.note2 = data[3];
	// }
	
	// 從Json物件建立
	public ListIteamData(JSONObject obj)
	{
		try
		{
			this.iconUrl = obj.optString("iconUrl", "");
			this.btnUrl1 = obj.optString("btnUrl1", "");
			this.btnUrl2 = obj.optString("btnUrl2", "");
			this.note = obj.optString("note", "");
			
			// 下載影象資源
			icon = WebTool.GetDrawable(iconUrl);
			btn1 = WebTool.GetDrawable(btnUrl1);
			btn2 = WebTool.GetDrawable(btnUrl2);
		}
		catch (Exception ex)
		{
			ex.printStackTrace();
		}
	}
	
	// ---------------------------------
	
	// 從Json陣列解析資料
	public static ListIteamData[] ToArray(JSONArray data)
	{
		ListIteamData[] Array = new ListIteamData[data.length()];
		
		for (int i = 0; i < data.length(); i++)
		{
			try
			{
				JSONObject obj = data.getJSONObject(i);
				Array[i] = new ListIteamData(obj);
			}
			catch (Exception ex)
			{
				ex.printStackTrace();
				Log.e("thumbsupPage.java", "資料ListIteamData解析異常!");
			}
		}
		return Array;
	}
}

ListAdapter.java 用於生成ListView


package sci.demo.androidlistview;

import sci.tool.ListViewCommonAdapter;
import android.content.Context;
import android.widget.ImageView;
import android.widget.TextView;


/** ListAdapter.java: ----- 2018-10-25 下午8:32:21 scimence */
public class ListAdapter extends ListViewCommonAdapter<ListIteamData>
{
	/** 1、繼承方法 ListViewCommonAdapter(), 通過該介面指定單個列表項的佈局檔名、設定所有列表項資料;
	 * 
	 * @param context
	 * @param listIteam_LayoutName 佈局檔名
	 * @param IteamDatas 所有列表項資料 */
	public ListAdapter(Context context, String listIteam_LayoutName, ListIteamData[] IteamDatas)
	{
		super(context, listIteam_LayoutName, IteamDatas);
	}
	
	/** 2、setIteamView(TE iteamData), 設定每個列表項的顯示;
	 * 
	 * @param iteamData 將顯示的列表項的對應資料 */
	@Override
	public void setIteamView(ListIteamData iteamData)
	{
		// TODO 根據列表項資料iteamData,設定列表項的顯示
		// View view = IteamView("name"); //獲取列表項中,指定名稱的view
		
		// 遊戲Icon
		ImageView Icon = (ImageView) IteamView("thumbsup_iteam_icon");
		// Icon.setImageDrawable(iteamData.icon);
		Icon.setImageDrawable(iteamData.icon);
		
		// 按鈕
		ImageView button = (ImageView) IteamView("thumbsup_iteam_button");
		button.setImageDrawable(!iteamData.isClicked ? iteamData.btn1 : iteamData.btn2);
		
		// 說明資訊
		TextView note1 = (TextView) IteamView("thumbsup_note1");
		note1.setText(iteamData.note);
	}
	
	/** 3、setIteamClick(Context iteamContext, TE iteamData), 設定每個列表項的點選響應;
	 * 
	 * @param iteamContext 列表項對應的context
	 * @param iteamData 待設定點選邏輯的列表項的對應資料 */
	@Override
	public void setIteamClick(Context iteamContext, ListIteamData iteamData)
	{
		// TODO 根據列表項資料iteamData,設定列表項的點選處理邏輯
		// View view = IteamView("name"); //獲取列表項中,指定名稱的view
		
		if (!iteamData.isClicked)
		{
			iteamData.isClicked = true;
			
			// 設定按鈕為已點選對應的影象
			ImageView button = (ImageView) IteamView("thumbsup_iteam_button");
			button.setImageDrawable(iteamData.btn2);
			
			// 執行按鈕點選對應邏輯
			// ...
			
		}
	}
	
}

ListPage.java 列表Activity主頁面


package sci.demo.androidlistview;

import org.json.JSONArray;
import org.json.JSONObject;

import sci.tool.ActivityComponent;
import sci.tool.ThreadTool;
import sci.tool.WebTool;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.widget.LinearLayout;
import android.widget.Toast;


/** list列表頁主介面  ---- 2018-10-25 下午8:32:21 scimence*/
public class ListPage extends ActivityComponent
{
	@Override
	public void Init(Bundle savedInstanceState)
	{
		// 設定Activity頁面佈局
		setContentView("list_view_page");
		
		ThreadTool.getMainHandler().postDelayed(new Runnable()
		{
			@Override
			public void run()
			{
				// 獲取網路資料, 列表項資料資訊獲取
				String dataUrl = "https://raw.githubusercontent.com/scimence/AndroidListview/master/files/listData";
				JSONObject webData = WebTool.GetJSONObject(dataUrl);
				
				if (webData != null)
				{
					// 設定標題欄背景圖
					Drawable tittlePic = WebTool.GetDrawable(webData.optString("tittlePic"));
					if(tittlePic != null) ImageView("thumbsup_tittle_bg").setImageDrawable(tittlePic);
					
					// 設定標題欄顯示資訊
					TextView("thumbsup_tittle_note").setText(webData.optString("title"));
					
					// 生成列表項顯示到ViewGroup中
					{
						JSONArray data = webData.optJSONArray("listData");		// 資料根據列表項所需資料,自行定義
						
						ListIteamData[] datas = ListIteamData.ToArray(data); 	// 從JSON資料中解析列表資訊
						ListAdapter adapter = new ListAdapter(ListPage.this, "list_iteam_layout", datas/* , call */);
						
						LinearLayout content = LinearLayout("thumbsup_list_content");	// 獲取頁面的LinerLayout作為顯示列表的ViewGroup
						adapter.ShowListViewIn(content);	// 顯示列表
					}
				}
			}
		}, 1000);	// 在主執行緒中,延時進行列表資訊的載入
	}
	
	
	
	/* 設定View點選響應事件 */
	@Override
	public void Click(String viewId)
	{
		String text = "點選了View -> " + viewId;
		Toast.makeText(this, text, Toast.LENGTH_SHORT).show();
		
		// TODO View點選響應邏輯
	}
	
}

執行緒輔助操作類,用於在主執行緒、非主執行緒中 執行邏輯