首页 > 解决方案 > 可见性设置为 GONE 时如何删除空白空间

问题描述

我已将可见性设置RecyclerView为消失。我怎样才能删除它占用的空白空间?

我试着把layout_heightas wrap_content,但它仍然没有显示任何东西。

回收商视图:

<?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recycleView"
            android:layout_gravity="top"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            tools:layout_editor_absoluteX="1dp"
            tools:layout_editor_absoluteY="1dp" />

    </androidx.constraintlayout.widget.ConstraintLayout> 

卡片视图:

<?xml version="1.0" encoding="utf-8"?>
<androidx.cardview.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="250dp"
    android:layout_marginLeft="10dp"
    android:layout_marginTop="10dp"
    android:layout_marginRight="10dp"
    android:id="@+id/cardView"
    android:backgroundTint="#5A10E7"
    android:elevation="90dp"
    android:orientation="vertical"
    android:textColor="#FFFFFF"
    app:cardCornerRadius="25dp"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHorizontal_bias="0.5"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintVertical_bias="0.282">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <Button
            android:id="@+id/Requestfulfilled"
            android:layout_width="139dp"
            android:layout_height="41dp"
            android:layout_weight="1"
            android:backgroundTint="#4CAF50"
            android:clickable="true"
            android:defaultFocusHighlightEnabled="true"
            android:hint="Request Fullfilled"
            android:text="Fulfilled"
            android:textColor="#FFFFFF"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toStartOf="@+id/DeleteRequest"
            app:layout_constraintHorizontal_bias="0.5"
            app:layout_constraintStart_toStartOf="@+id/RlocationView"
            app:layout_constraintTop_toBottomOf="@+id/RlocationView" />

        <Button
            android:id="@+id/DeleteRequest"
            android:layout_width="139dp"
            android:layout_height="41dp"
            android:backgroundTint="#F44336"
            android:clickable="true"
            android:defaultFocusHighlightEnabled="true"
            android:hint="Delete"
            android:text="Delete"
            android:textColor="#FFFFFF"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="@+id/RlocationView"
            app:layout_constraintHorizontal_bias="0.894"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintVertical_bias="0.904" />

        <TextView
            android:id="@+id/RemailView"
            android:layout_width="340dp"
            android:layout_height="35dp"
            android:allowUndo="true"
            android:focusable="auto"
            android:focusableInTouchMode="true"
            android:text="Email"
            android:textAlignment="center"
            android:textColor="#FFFFFF"
            android:textSize="18sp"
            app:layout_constraintBottom_toTopOf="@+id/RdateView"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.5"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <TextView
            android:id="@+id/RbloodView"
            android:layout_width="116dp"
            android:layout_height="35dp"
            android:allowUndo="true"
            android:focusable="auto"
            android:focusableInTouchMode="true"
            android:text="Blood Group"
            android:textAlignment="center"
            android:textColor="#FFFFFF"
            android:textSize="18sp"
            app:layout_constraintBottom_toTopOf="@+id/RlocationView"
            app:layout_constraintEnd_toStartOf="@+id/RdateView"
            app:layout_constraintHorizontal_bias="0.5"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/RemailView" />

        <TextView
            android:id="@+id/RdateView"
            android:layout_width="164dp"
            android:layout_height="42dp"
            android:allowUndo="true"
            android:focusable="auto"
            android:focusableInTouchMode="true"
            android:text="Date of Requirement"
            android:textAlignment="center"
            android:textColor="#FFFFFF"
            android:textSize="18sp"
            app:layout_constraintBottom_toTopOf="@+id/RlocationView"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.5"
            app:layout_constraintStart_toEndOf="@+id/RbloodView"
            app:layout_constraintTop_toBottomOf="@+id/RemailView" />

        <TextView
            android:id="@+id/RlocationView"
            android:layout_width="340dp"
            android:layout_height="35dp"
            android:allowUndo="true"
            android:focusable="auto"
            android:focusableInTouchMode="true"
            android:text="Location"
            android:textAlignment="center"
            android:textColor="#FFFFFF"
            android:textSize="18sp"
            app:layout_constraintBottom_toTopOf="@+id/Requestfulfilled"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintHorizontal_bias="0.5"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/RdateView" />

    </androidx.constraintlayout.widget.ConstraintLayout>

</androidx.cardview.widget.CardView>

将卡片可见性设置为 GONE 的代码:

   public class yourRequestActivity extends AppCompatActivity {

    private RecyclerView cardView;

    private DatabaseReference dbRefForReq, dbRefForResp;

    private FirebaseAuth mAuth;

    private String AuthUserEmail, UserID;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.request_response_view);

        mAuth = FirebaseAuth.getInstance();

        AuthUserEmail = mAuth.getCurrentUser().getEmail();

        UserID = mAuth.getCurrentUser().getUid();

        dbRefForResp = FirebaseDatabase.getInstance().getReference().child("Responses").child(String.valueOf(UserID));

        dbRefForReq = FirebaseDatabase.getInstance().getReference().child("Blood Requests");
        dbRefForReq.keepSynced(true);

        cardView = (RecyclerView) findViewById(R.id.recycleView);
        cardView.setHasFixedSize(true);
        cardView.setLayoutManager(new LinearLayoutManager(this));

    }

    @Override
    protected void onStart() {
        super.onStart();
        FirebaseRecyclerOptions<getDbContents> options =
                new FirebaseRecyclerOptions.Builder<getDbContents>()
                        .setQuery(dbRefForReq, getDbContents.class)
                        .build();

        FirebaseRecyclerAdapter<getDbContents, contentHolder> adapter = new FirebaseRecyclerAdapter<getDbContents, contentHolder>(options) {
            @Override
            protected void onBindViewHolder(@NonNull final contentHolder holder, final int position, @NonNull final getDbContents model) {
                final int finalPosition = position + 1;
                if (model.getUser().equals(AuthUserEmail)) {
                    dbRefForReq.addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                            DataSnapshot checkFulfillment = dataSnapshot.child(String.valueOf(("Request " + finalPosition))).child("Fulfillment");
                            if (checkFulfillment.exists()) {
                                if (checkFulfillment.child("Fulfilled").getValue().equals("yes")) {
                                    /*------------- Set current user card as visible -----------------*/
                                    holder.frameView.setVisibility(View.VISIBLE);
                                    holder.fulfilled.setVisibility(View.GONE);
                                    holder.requestFulfilled.setVisibility(View.VISIBLE);
                                    holder.userEmail.setText(AuthUserEmail);
                                    holder.bloodGroup.setText(model.getBloodGroup());
                                    holder.dateOfRequirement.setText(model.getDate());
                                    holder.Location.setText(model.getLocation());
                                    ////////////////////////////////////////////////////////////////////
                                }
                            } else {
                                holder.frameView.setVisibility(View.VISIBLE);
                                holder.fulfilled.setVisibility(View.VISIBLE);
                                holder.requestFulfilled.setVisibility(View.GONE);
                                /*------------- Set current user card as visible -----------------*/
                                holder.userEmail.setText(AuthUserEmail);
                                holder.bloodGroup.setText(model.getBloodGroup());
                                holder.dateOfRequirement.setText(model.getDate());
                                holder.Location.setText(model.getLocation());
                                ////////////////////////////////////////////////////////////////////
                            }

                        }
                        @Override
                        public void onCancelled(@NonNull DatabaseError databaseError) {

                        }
                    });

                } else if (model.getUser().equals(null)) {
                    holder.userEmail.setText("You have not posted any request");
                } else {
                    holder.frameView.setVisibility(View.GONE);
                }

                /*  Fulfilled and Delete button Functionality  */
                holder.fulfilled.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        Map<String, Object> response = new HashMap<>();
                        response.put("Fulfilled", "yes");

                        /*-----------------Remove Responses------------------*/

                        dbRefForResp.removeValue();
                        ///////////////////////////////////////////////////////

                        /*-----------------Update and insert child with fulfilled status as yes------------------*/
                        dbRefForReq.child(String.valueOf(("Request " + finalPosition))).child("Fulfillment").setValue(response).addOnSuccessListener(new OnSuccessListener<Void>() {
                            @Override
                            public void onSuccess(Void aVoid) {
                                Toast.makeText(yourRequestActivity.this, "Request fulfillment status posted", Toast.LENGTH_SHORT).show();
                            }
                        });
                        ////////////////////////////////////////////////////////////////////
                        holder.fulfilled.setVisibility(View.GONE);
                        holder.requestFulfilled.setVisibility(View.VISIBLE);
                    }
                });

            }

            @NonNull
            @Override
            public contentHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
                View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.your_request_card, viewGroup, false);
                contentHolder contentViewHolder = new contentHolder(view);
                return contentViewHolder;
            }
        };
        cardView.setAdapter(adapter);
        adapter.startListening();

    }


    public class contentHolder extends RecyclerView.ViewHolder {
        TextView userEmail, bloodGroup, dateOfRequirement, Location, requestFulfilled;
        Button fulfilled;
        FrameLayout frameView;

        public contentHolder(@NonNull View itemView) {
            super(itemView);
            userEmail = itemView.findViewById(R.id.RemailView);
            bloodGroup = itemView.findViewById(R.id.RbloodView);
            dateOfRequirement = itemView.findViewById(R.id.RdateView);
            Location = itemView.findViewById(R.id.RlocationView);

            requestFulfilled = (TextView) itemView.findViewById(R.id.fulfilledTextMessage);
            frameView = (FrameLayout) itemView.findViewById(R.id.cardFrame);
            fulfilled = (Button) itemView.findViewById(R.id.Requestfulfilled);
        }
    }
}

我想删除可见性设置为 GONE 时出现的空白,如下面的快照所示。

移除顶卡时的空白区域图像

设置可见性之前的图像 GONE

标签: javaandroidandroid-recyclerview

解决方案


RecyclerView即使可见性设置为消失,您也会占用空间。它仍然需要空间,因为有些项目RecyclerView要显示。尽管您可以通过删除RecyclerView要显示的项目来解决此问题。如果您想再次显示它会占用大量内存,RecyclerView因为您仍然需要重新添加项目。我会推荐的是RecyclerView用一个布局来包装你,例如。LinearLayout并将该布局的可见性设置为消失。

尝试这样做:

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

    <!--  Place your RecyclerView here -->
    <!--  change visibility of container view -->

</LinearLayout>

*编辑:你没有很好地解释它。我现在得到你想要的。您只需从RecyclerView列表中删除该项目。最好的方法是使用DiffUtil. 这是一个很棒的在线教程,展示了如何在 Java 中实现它。https://codinginflow.com/tutorials/android/room-viewmodel-livedata-recyclerview-mvvm/part-1-introduction


推荐阅读