数据源为数据库中的数据
从数据库中加载数据作为列表的每一项。举例,我现在需要从数据库中读取所有的站点,构造站点列表对话框。
- 对话框布局文件(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();
}
}
}
运行效果