显示在Recyclerview android的空的空间的View.gone

时间:2017-09-16 10:01:25

标签: android android-recyclerview

我正在使用recyclerview显示来自网络服务的数据。根据特定条件,我需要删除特定的回收站视图项。所以我正在使用View.Gone。但它显示出空白空间。我搜索了这个问题,并设置了包装内容的高度,但它无法正常工作。请任何人帮助我。

我的代码: xml:item

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

    <android.support.v7.widget.CardView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:cardCornerRadius="4dp"
        app:contentPaddingBottom="10dp"
        app:contentPaddingTop="16dp"
        android:elevation="10dp"
        android:layout_margin="5dp"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true">
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:weightSum="2"
        android:orientation="horizontal">
        <TextView
            android:id="@+id/travel_name"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:textSize="14sp"
            android:layout_marginLeft="5dp"
            android:textColor="@color/holo_blue_light"
            android:text="CGR Travels"/>


        <TextView
            android:id="@+id/bus_price"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="right"
            android:textSize="14sp"
            android:textColor="#F04C3B"
            android:layout_marginRight="30dp"
            android:text="Rs.349"/>


    </LinearLayout>
    <View
        android:layout_width="match_parent"
        android:layout_height="0.5dp"
        android:layout_marginTop="5dp"
        android:background="#b6b6b6"/>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:weightSum="2"
        android:layout_marginTop="5dp"
        android:orientation="horizontal">

        <TextView
            android:id="@+id/arrtime_desttime"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:layout_marginLeft="5dp"
            android:textSize="15sp"
            android:textColor="#1e356a"
            android:text="9.00P.M - 7.00AM"/>
        <TextView
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="right"
            android:textSize="12sp"

            android:layout_marginRight="30dp"
            android:text="38 seats"
            android:id="@+id/seatcount" />




    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:weightSum="2"
        android:layout_marginTop="5dp"
        android:orientation="horizontal">

        <TextView
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:textSize="12sp"
            android:layout_marginLeft="5dp"
            android:text="2+1 semi sleeeper"
            android:id="@+id/bustype" />
        <TextView
            android:id="@+id/cancellationpolicy"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:gravity="right"
            android:textSize="12sp"
            android:textColor="@color/holo_blue_light"
            android:layout_marginRight="30dp"
            android:text="Cancellation policy"
           />


        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:visibility="gone"
            android:id="@+id/routeid"/>
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:visibility="gone"
            android:id="@+id/dropdate"/>


    </LinearLayout>

</LinearLayout>

        </android.support.v7.widget.CardView>
</LinearLayout>

的java:

@Override
        public void onBindViewHolder(final BusrouteAdapter.ViewHolder viewHolder, final int position) {
if ((bus_routes.get(position).getAvailableSeats() == 0)) {
                viewHolder.businfo.setVisibility(View.GONE);


            } else {
                viewHolder.businfo.setVisibility(View.VISIBLE);

            }
}

5 个答案:

答案 0 :(得分:3)

虽然从列表中删除项目然后更新列表(notifydatasetchanged())是一个很好的做法,但在某些情况下,例如在signle recyclerView中有多个viewHolders时,它可能很复杂,所以为了隐藏一个特定的您在recyclerView中的项目,您应该执行以下操作:
- 不要隐藏布局的根视图,而是将子项添加到包含所有其他视图的布局的rootView并隐藏它。例如,在您的情况下,您可以将cardView visibity设置为View.GONE,并且不要对其parent linearLayout(businfo)进行任何更改。我有类似的情况,这对我有用。

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/rootView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <!--  don't change visibility of rootView view -->

    <LinearLayout
        android:id="@+id/child_container"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <!--  Place all child views inside here -->
        <!--  change visibility of child_container view -->

    </LinearLayout>

</LinearLayout>

答案 1 :(得分:0)

您应该从bus_routes中删除此项目:

bus_routes.remove(position);

然后:

notifyItemRemoved(position);
notifyItemRangeChanged(position, bus_routes.size());

答案 2 :(得分:0)

您不能以这种方式直接隐藏视图。您必须从ArrayList中删除不需要的项目,或者在设置适配器之前不要添加不需要的项目。如果您的商品已更新,请再次删除不需要的商品并调用notifydataset

答案 3 :(得分:0)

从ArrayList中删除此元素并使用notifyDataSetChanged();

示例:

holder.imageDelete.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            paths.remove(position);
            notifyDataSetChanged();
        }
    });

答案 4 :(得分:0)

您不需要设置可见或仅删除列表中的项目而不是更新列表。

 ImageView image = (ImageView)view.findViewById(R.drawable.business);

尝试从活动中将适配器设置为@Override public void onBindViewHolder(final BusrouteAdapter.ViewHolder viewHolder, final int position) { if ((bus_routes.get(position).getAvailableSeats() == 0)) { bus_routes.remove(position); } } 后调用youradapter.notifydatasetchanged()