6 votes

Les éléments de RecyclerView surélevés se déforment progressivement (changements d'élévation)

Des idées pourquoi les éléments de RecyclerView sont déformés , chaque élément consécutif devient pire ?

MISE À JOUR : J'utilise les CardViews et maintenant il n'y a pas de "déformation" de vue mais la hauteur de l'ombre/élévation change.

Il semble que l'élévation augmente en fonction de l'emplacement de l'élément verticalement sur l'écran, l'ombre augmente lorsque l'élément est défilé vers le bas. Veuillez voir la vidéo ici: https://youtu.be/nROYq8rpUMs.

J'ai configuré un nouveau projet ne laissant que le code nécessaire pour démontrer le problème :

MainActivity.java

package tzig.schm00.masterdetail;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import tzig.schm00.masterdetail.dummy.DummyContent;

import java.util.List;

public class MainActivity extends AppCompatActivity {

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

        View recyclerView = findViewById(R.id.item_list);
        setupRecyclerView((RecyclerView) recyclerView);

    }

    private void setupRecyclerView(@NonNull RecyclerView recyclerView) {
        recyclerView.setAdapter(new SimpleItemRecyclerViewAdapter(DummyContent.ITEMS));
    }

    public class SimpleItemRecyclerViewAdapter
            extends RecyclerView.Adapter {

        private final List mValues;

        public SimpleItemRecyclerViewAdapter(List items) {
            mValues = items;
        }

        @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.list_item, parent, false);
            return new ViewHolder(view);
        }

        @Override
        public void onBindViewHolder(final ViewHolder holder, int position) {
            holder.mItem = mValues.get(position);
            holder.mIdView.setText(mValues.get(position).id);
            holder.mContentView.setText(mValues.get(position).content);
        }

        @Override
        public int getItemCount() {
            return mValues.size();
        }

        public class ViewHolder extends RecyclerView.ViewHolder {
            public final View mView;
            public final TextView mIdView;
            public final TextView mContentView;
            public DummyContent.DummyItem mItem;

            public ViewHolder(View view) {
                super(view);
                mView = view;
                mIdView = (TextView) view.findViewById(R.id.id);
                mContentView = (TextView) view.findViewById(R.id.content);
            }

            @Override
            public String toString() {
                return super.toString() + " '" + mContentView.getText() + "'";
            }
        }
    }
}

activity_main.xml

list_item.xml

Nouvelle observation : il semble que ce soit un comportement standard. Cela ressemble à la même chose avec l'Image Picker affichant des dossiers en utilisant des CardViews...

Toute aide est grandement appréciée!

Merci!!

0voto

Cheticamp Points 22529

Ajoutez un arrière-plan à votre RelativeLayout - il semble que l'élévation en a besoin pour fonctionner correctement. J'ai testé cela avec votre mise en page et ça marche.

0voto

Mikhail Points 374

J'ai rencontré le même problème et, dans mon cas, le problème était causé par un drawable d'arrière-plan que j'ai défini dans mon RecyclerViewAdapter#onBindViewHolder:

// ceci a gâté les ombres!
cardView.setBackgroundDrawable(ContextCompat.getDrawable(context, myColorResourceId);

Après avoir supprimé la ligne ci-dessus, le problème a disparu!

(Pour avoir à la fois un arrière-plan et de belles ombres, j'ai utilisé un élément interne remplissant le CardView et appliqué l'arrière-plan dessus plutôt que sur le CardView)

0voto

Tyg Points 123

C'est ainsi que cela est prévu selon Material Design: Environnement: Lumière et ombres: Lumière.

Voir également la réponse https://stackoverflow.com/a/51216164/6685260

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X