數據源爲數據庫中的數據
從數據庫中加載數據作爲列表的每一項。舉例,我現在需要從數據庫中讀取所有的站點,構造站點列表對話框。
- 對話框佈局文件(dialog_site_list)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="250dp"
android:paddingTop="16dp"
android:paddingBottom="16dp">
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="250dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:id="@+id/compare_site_list">
</android.support.v7.widget.RecyclerView>
</LinearLayout>
- 列表條目佈局(dialog_site_list_item)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_marginTop="4dp"
android:clickable="true"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/item_site_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxLines="1"
android:text="#1"
android:textAppearance="@android:style/TextAppearance.Large"
android:textColor="@android:color/primary_text_dark" />
<TextView
android:id="@+id/item_site_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="4dp"
android:maxLines="1"
android:text="HENU"
android:textAppearance="@android:style/TextAppearance.Large"
android:textColor="@android:color/primary_text_dark" />
</LinearLayout>
<TextView
android:id="@+id/item_site_address"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:maxLines="1"
android:text="www.henu.edu.cn"
android:textAppearance="@android:style/TextAppearance.Medium"
android:textColor="@android:color/secondary_text_dark" />
</LinearLayout>
</LinearLayout>
- 代碼
對於代碼中的站點信息集合列表mSiteInfoList,設置數據的方式就是從數據庫中遍歷讀取,具體就不寫出來了。
//自定義選擇站點時的監聽器
private CompareSiteAdapter.MyOnItemClickListener mMyOnItemClickListener;
//站點信息集合列表
private List<SiteInfo> mSiteInfoList;
/***
* 構造站點列表對話框
* @param view 標識是第一個站點選擇按鈕還是第二個站點選擇按鈕
*
*/
private void showSiteListDialog() {
final SharedPreferences.Editor editor = mPreferences.edit();
mMyOnItemClickListener = new CompareSiteAdapter.MyOnItemClickListener() {
@Override
public void onItemClick(SiteInfo siteInfo) {
//獲取選中站點的id
mSiteId = siteInfo.getId();
}
};
AlertDialog.Builder builder = new AlertDialog.Builder(CompareActivity.this);
//獲取對話框佈局的視圖
View siteListView = LayoutInflater.from(this).inflate(R.layout.dialog_site_list, null);
//爲對話框設置視圖
builder.setView(siteListView);
//設置標題
builder.setTitle(getApplicationContext().getString(R.string.compare_site_dialog_title));
AlertDialog dialog = builder.create();
RecyclerView siteRecyclerView = (RecyclerView) siteListView.findViewById(R.id.compare_site_list);
//爲Recyclerview設置分割線
siteRecyclerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST));
//構造適配器
CompareSiteAdapter siteAdapter = new CompareSiteAdapter(mSiteInfoList, CompareActivity.this,
dialog, mMyOnItemClickListener);
//設置recyclerView的佈局垂直方向
siteRecyclerView.setLayoutManager(new LinearLayoutManager(this));
siteRecyclerView.setAdapter(siteAdapter);
dialog.show();
}
- CompareSiteAdapter 類
public class CompareSiteAdapter extends RecyclerView.Adapter<CompareSiteAdapter.SiteHolder> {
private List<SiteInfo> mSiteInfoList;
private Context mContext;
private AlertDialog mDialog;
private MyOnItemClickListener mMyOnItemClickListener;//自定義的列表項的點擊事件
/**
* 構造方法
* @param siteInfoList 站點信息列表
* @param context 上下文
* @param dialog
* @param myOnItemClickListener
*/
public CompareSiteAdapter(List<SiteInfo> siteInfoList, Context context, AlertDialog dialog,MyOnItemClickListener myOnItemClickListener)
{
mSiteInfoList = siteInfoList;
mContext = context;
mDialog = dialog;
mMyOnItemClickListener = myOnItemClickListener;
}
@Override
public SiteHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater layoutInflater = LayoutInflater.from(mContext);
View view = layoutInflater.inflate(R.layout.compare_site_list_item,parent,false);
return new SiteHolder(view);
}
/*
該方法將ViewHolder的view視圖和模型層數據綁定在一起,收到viewHolder和列表項在數據集中的位置後
,通過索引位置找到要顯示的數據進行綁定
*/
@Override
public void onBindViewHolder(SiteHolder holder, int position) {
SiteInfo siteInfo = mSiteInfoList.get(position);
holder.bindSite(siteInfo);
}
@Override
public int getItemCount() {
return mSiteInfoList.size();
}
/**
* 列表項點擊事件的監聽器
*/
public interface MyOnItemClickListener{
void onItemClick(SiteInfo siteInfo);
}
class SiteHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
private TextView mSiteId;
private TextView mSiteName;
private TextView mSiteAddress;
private SiteInfo mSiteInfo;
public SiteHolder(View itemView)
{
super(itemView);
itemView.setOnClickListener(this);
mSiteId = (TextView)itemView.findViewById(R.id.item_site_id);
mSiteName = (TextView)itemView.findViewById(R.id.item_site_name);
mSiteAddress = (TextView)itemView.findViewById(R.id.item_site_address);
}
public void bindSite(SiteInfo siteInfo)
{
mSiteInfo = siteInfo;
mSiteId.setText(String.format(mContext.getString(R.string.compare_site_id),mSiteInfo.getId()+""));
mSiteName.setText(mSiteInfo.getSite_name());
mSiteAddress.setText(mSiteInfo.getSite_address());
}
@Override
public void onClick(View v) {
//點擊列表項時觸發的對應事件
if(mMyOnItemClickListener!= null)
{
mMyOnItemClickListener.onItemClick(mSiteInfo);
}
mDialog.dismiss();
}
}
}
運行效果