web-dev-qa-db-fra.com

Peut-on utiliser cardview pour l'élément listview et comment

Je voudrais implémenter CardView dans mon application afin que tous les éléments ListView soient CardViews. Est-ce aussi simple que d'encapsuler un XML d'élément ListView dans CardView?

10
Munez NS

Oui. Sous CardView est juste un simple FrameLayout que vous pouvez simplement gonfler dans un ListView (ou RecyclerView).

Voici un exemple:

<Android.support.v7.widget.CardView
    Android:id="@+id/ly_root"
    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="wrap_content"
    Android:background="#FEFEFE"
    Android:layout_margin="8dp"
    app:cardCornerRadius="4dp">

    <LinearLayout
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:orientation="vertical">


        <ImageView
            Android:id="@+id/iv_cover"
            Android:layout_width="wrap_content"
            Android:layout_height="160dp"
            Android:scaleType="centerCrop"
            Android:src="@drawable/placeholder"/>

        ...

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

Et voici cet exemple en direct:

enter image description here

Bien sûr, vous devrez implémenter un adaptateur personnalisé pour les connecter ensemble. Mais c'est vraiment comme avec n'importe quel élément ListView personnalisé. Il n'y a rien de spécial là-dedans.

14
MrHadiSatrio

Dans le cas où quelqu'un d'autre rencontrerait cette question, les autres réponses sont exactes mais vous devriez alors placer votre CardView dans FrameLayout et vous devriez rendre le séparateur de ListView transparent. L'attribut d'élévation et de marge de CardView ne fonctionnera que si vous l'utilisez dans FrameLayout.

32
Somesh Kumar

Il est préférable d'utiliser CardView avec RecyclerView, voici un exemple.

  • activity_main.xml (il contient le recyclerview)

     <?xml version="1.0" encoding="utf-8"?>
     <LinearLayout 
     xmlns:Android="http://schemas.Android.com/apk/res/Android"
     xmlns:tools="http://schemas.Android.com/tools"
     Android:layout_width="match_parent"
     Android:layout_height="match_parent">
         <Android.support.v7.widget.RecyclerView
         Android:id="@+id/recyclerview"
         Android:layout_height="match_parent"
         Android:layout_width="match_parent"/>
    </LinearLayout>
    
  • cardview.xml

    <?xml version="1.0" encoding="utf-8"?>
    <Android.support.v7.widget.CardView
    xmlns:card_view="http://schemas.Android.com/apk/res-auto"
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_height="wrap_content"
    Android:layout_width="match_parent"
    card_view:cardCornerRadius="4dp"
    Android:layout_margin="10dp">
        <TextView
        Android:id="@+id/text_cardview"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:padding="20dp" />
    </Android.support.v7.widget.CardView>
    
  • buid.gradle (Module: app)

    dependencies {
        compile fileTree(dir: 'libs', include: ['*.jar'])
        testCompile 'junit:junit:4.12'
        compile 'com.Android.support:appcompat-v7:23.3.0'
        compile 'com.Android.support:cardview-v7:23.0.+'
        compile 'com.Android.support:recyclerview-v7:23.0.+'
    }
    
  • RecyclerViewAdapter.Java

    public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.MyViewHolder> {
        public ArrayList<String> myValues;
        public RecyclerViewAdapter (ArrayList<String> myValues){
            this.myValues= myValues;
        }
    
        @Override
        public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View listItem = LayoutInflater.from(parent.getContext()).inflate(R.layout.cardview.xml, parent, false);
            return new MyViewHolder(listItem);
        }
    
        @Override
        public void onBindViewHolder(MyViewHolder holder, int position) {
             holder.myTextView.setText(myValues.get(position));
        }
    
    
        @Override
        public int getItemCount() {
            return myValues.size();
        }
    
        public static class MyViewHolder extends RecyclerView.ViewHolder {
            private TextView myTextView;
            public MyViewHolder(View itemView) {
                super(itemView);
            myTextView = (TextView)itemView.findViewById(R.id.text_cardview);
            }
        }
    }
    
  • MainActivity.Java

    public class MainActivity extends AppCompatActivity {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        ArrayList<String> myValues = new ArrayList<String>();
    
        //Populate the ArrayList with your own values
        myValues.add("KitKat");
        myValues.add("Lollipop");
        myValues.add("Marshmallow");
    
        RecyclerViewAdapter adapter = new RecyclerViewAdapter(myValues);
        RecyclerView myView =  (RecyclerView)findViewById(R.id.recyclerview);
        myView.setHasFixedSize(true);
        myView.setAdapter(adapter);
        LinearLayoutManager llm = new LinearLayoutManager(this);
        llm.setOrientation(LinearLayoutManager.VERTICAL);
        myView.setLayoutManager(llm);
     }     
     }
    

Référez-vous à ce tutoriel pour plus de détails: n guide pour Android RecyclerView et CardView

8
Majda

Oui, vous pouvez utiliser CardView pour l'élément de liste dans ListView. Mais je vous suggère d'utiliser RecyclerView au lieu de ListView, car il s'agit de la version mise à jour de ListView. Vérifiez this pour RecyclerView avec CardView.

4
Chandru