安卓 ListView列表
阿新 • • 發佈:2018-12-17
介面示例:
介面佈局: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點選響應邏輯
}
}
執行緒輔助操作類,用於在主執行緒、非主執行緒中 執行邏輯