Android创建自定义视图列表对话框(数据库中的数据作为数据源,使用RecyclerView作为列表)

数据源为数据库中的数据

从数据库中加载数据作为列表的每一项。举例,我现在需要从数据库中读取所有的站点,构造站点列表对话框。

  • 对话框布局文件(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();
                }
        }
}

运行效果
自定义列表对话框视图

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章