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
之前检查项目列表。如果为空,则创建不带 RecyclerView
的 alertDialog
,仅带有警告文本。否则创建您的自定义 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 是要传递给适配器的列表。
我正在尝试使用 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
之前检查项目列表。如果为空,则创建不带 RecyclerView
的 alertDialog
,仅带有警告文本。否则创建您的自定义 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 是要传递给适配器的列表。