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();
                }
        }
}

運行效果
自定義列表對話框視圖

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