Alertdialog 膨胀 RecyclerView android

Alertdialog inflating RecyclerView android

我正在尝试使用 setView(...) 向我的 Material 对话框添加一个视图,我希望我的膨胀视图看起来像这样

也就是说,回收站视图将始终占据大约 2/3 的屏幕。这包括当它为空时,它将是空的 space 以及当它有很多行数据时,它可以滚动。

这是我的目标。但是,当我尝试在我的对话框中膨胀此视图时,我得到以下信息..

该屏幕代表一个空的 recyclerview 占据了大部分屏幕。

这是代码

//添加到对话框

mMaterialDialog = new MaterialDialog(mContext)

               .setView(new ISEQDialog(mContext))
                       //.setBackgroundResource(R.drawable.dublin_watchlist)
               .setPositiveButton("OK", new View.OnClickListener() {
                   @Override
                   public void onClick(View v) {
                       mMaterialDialog.dismiss();

                   }
               });


       mMaterialDialog.show();
   }

});

//查看

 public class ISEQDialog extends FrameLayout{

    SeekBar mBuySeekBar;
    TextView mStockHeading;
    Context mContext;
    View mView;
    RecyclerView mStockDataList;

    public ISEQDialog(Context context) {
        super(context);
        this.mContext = context;

        LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if(inflater != null){
            mView =  inflater.inflate(R.layout.stock_dialog, null);
        }

        mStockDataList = (RecyclerView) mView.findViewById(R.id.rv_stock_data_list);
        //
        mStockDataList.setAdapter(new ISEQDialofRecyclerViewAdapter());
        LinearLayoutManager layoutManager = new LinearLayoutManager(mContext);
        layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        layoutManager.scrollToPosition(0);
        mStockDataList.setLayoutManager(layoutManager);
        //mStockDataList.addItemDecoration(new DividerItemDecoration(mContext.getDrawable(R.drawable.divider)));


        addView(mView);
      }
    }

//RecyclerViewAdapter

 public class ISEQDialofRecyclerViewAdapter extends      RecyclerView.Adapter<ISEQDialofRecyclerViewAdapter.ViewHolder>{
       @Override
       public ISEQDialofRecyclerViewAdapter.ViewHolder     onCreateViewHolder(ViewGroup parent, int viewType) {
        return null;
    }


    @Override
    public void onBindViewHolder(ISEQDialofRecyclerViewAdapter.ViewHolder holder, int position) {

    }

    @Override
    public int getItemCount() {
        return 0;
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {


        public ViewHolder(View itemView) {
            super(itemView);

        }
    }
}

//XML

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/tv_stock_dialog_heading"
        android:layout_weight="0.2"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:gravity="center"
        android:textColor="@color/list_divider_pressed"
        android:layout_gravity="top"
        android:background="@null"
        android:textSize="35dp"
        android:text="Portfolio Value"
        />

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rv_stock_data_list"
        android:layout_weight="0.7"
        android:layout_height="0dp"
        android:divider="@drawable/list_selector"
        android:dividerHeight="1dip"
        android:layout_width="match_parent">
    </android.support.v7.widget.RecyclerView>

    <SeekBar
        android:id="@+id/sb_buy_stocks"
        android:layout_weight="0.1"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:gravity="center"

        android:indeterminate="false" />

</LinearLayout>

这个问题与 RecyclerView 有关,据我所知,当它为空时它会填充布局,除非你给出固定的 layout_height

有个窍门,就是在创建 alertDialog 之前检查项目列表。如果为空,则创建不带 RecyclerViewalertDialog,仅带有警告文本。否则创建您的自定义 alertDialog.

我在尝试将回收站视图添加到对话框时遇到了同样的问题。 当我尝试进行故障排除时,我意识到只有回收器视图适配器的构造函数被调用并停止。 getItemCount()、onCreateViewHolder() 和 onBindViewHolder() 等其余方法不会被调用。

所以我做了以下事情

1) 我用 线性布局 替换了 recyclerview。 2) 在代码中将 线性布局 引用为 view holder。 3)然后我手动遍历要传递给回收站视图的列表,然后我膨胀了单行 xml 文件,引用了视图并在其上设置了文本。 4)我将视图添加到视图持有者并显示了对话框。有效

5) 此操作会使视图膨胀,因为我们没有回收任何东西,因此如果要显示的项目低于 10-15,您也可以使用它,否则会稍微影响应用程序的性能。

在Activity

    Dialog myTestDialog = new Dialog(getActivity());
    myTestDialog.setContentView(R.layout.order_details_orders_to_deliver);

    //get the layout group
    ViewGroup layout = (ViewGroup) myTestDialog.findViewById(R.id.order_details_recycler_view);
    List<OrderItemDetails> orderItemDetailsList = mDatabaseOperationsAdapter.getOrderDetail(ordersToDeliver.getOrderId());

    for (int x = 0; x < orderItemDetailsList.size(); x++) {
        OrderItemDetails orderItemDetails = orderItemDetailsList.get(x);
        View view = inflater.inflate(R.layout.order_details_row, null);
        TextView itemName = (TextView) view.findViewById(R.id.order_details_item_name);

        TextView quantity = (TextView) view.findViewById(R.id.order_details_item_quantity);
        TextView itemTotal = (TextView) view.findViewById(R.id.order_details_item_total);

        itemName.setText(orderItemDetails.getProductName());
        quantity.setText(String.valueOf(orderItemDetails.getProductQuantity()));
        itemTotal.setText(String.valueOf(orderItemDetails.getTotalPrice()));
        layout.addView(view);
    }

    myTestDialog.show();

注意:order_details_recycler_view 是线性布局而不是回收器视图,因为我将其更改为线性布局,保持 id 相同。

List orderItemDetailsList 是要传递给适配器的列表。