David Gordon
David Gordon

Reputation: 287

Alertdialog inflating RecyclerView android

Im trying to add a view to my Material dialog using setView(...), I want to have my inflated view look like thisenter image description here

That is the recycler view will always take up roughly 2/3 of the screen. That includes when it is empty, where it will be an empty space and when it has many lines of data, where it can become scroll able.

This is my aim. However when I try to inflate this View inside my dialog I get the following..

enter image description here

That screen represents an empty recyclerview taking up most of the screen.

Here is the code

//Adding to dialog

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

});

//View

 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>

Upvotes: 0

Views: 6164

Answers (2)

Niraj Pathak
Niraj Pathak

Reputation: 66

I had the same issue trying to add the recycler view to the dialog. When i tried troubleshooting i realized that only the constrcutor of the recycler view adapter gets called and stops. The remaining methods as getItemCount(), onCreateViewHolder() and onBindViewHolder() doesn't gets called.

So i did the following

1) i replaced the recyclerview with the linear layout. 2) referenced the linear layout as view holder in code. 3) Then i manually iterated through the list i was to pass to the recycler view and on so i inflated the single row xml file, referenced the views and set text on it. 4) I added the view to the view holder and displayed the dialog. It works

5) This operation inflates the view as we are not recycling anything so if the items to display is below 10-15 you can use this as well or else hits the performance of the app a slight.

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

Note : order_details_recycler_view is the linear layout not recycler view as i changed it to linear layout keeping the id same.

List orderItemDetailsList is the list that was to be passed to the adapter.

Upvotes: 4

Jemshit
Jemshit

Reputation: 10048

This problem is related to RecyclerView as i know, when it is empty it fills layout, unless you give fixed layout_height.

There is trick, which is you check list of items before you create alertDialog. If empty, create alertDialog without RecyclerView, just with warning text. Otherwise create your custom alertDialog.

Upvotes: 0

Related Questions