Je voudrais implémenter CardView
dans mon application afin que tous les éléments ListView
soient CardView
s. Est-ce aussi simple que d'encapsuler un XML d'élément ListView
dans CardView
?
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:
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.
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
.
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
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.