2015-06-10 8 views
10

Desidero implementare CardView nella mia app in modo che tutti gli articoli ListView siano CardView s. È semplice come incapsulare un elemento XML ListView in CardView?È possibile utilizzare cardview per la voce listview e come

+1

No, è necessario utilizzare recyclerview invece di listview e aggiungere un adattatore personalizzato con cardview. – Shvet

+2

ovviamente puoi. CardView è un FrameLayout – Blackbelt

risposta

14

Sì. Sotto CardView è solo un semplice FrameLayout che potresti semplicemente gonfiare in un ListView (o RecyclerView).

Ecco un esempio:

<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> 

Ed ecco che ad esempio vivono in azione:

enter image description here

Naturalmente si avrebbe bisogno di implementare un adattatore personalizzato per legare in su insieme. Ma questo è come con qualsiasi oggetto personalizzato ListView. Non c'è niente di speciale in questo.

4

Sì, è possibile utilizzare CardView per la voce di elenco in ListView. Ma ti suggerisco di usare RecyclerView invece di ListView, dato che è la versione aggiornata di ListView. Controllare this per RecyclerView con CardView.

23

Nel caso in cui qualcun altro si imbattesse in questa domanda, Altre risposte sono giuste, ma allora dovresti inserire il tuo CardView all'interno di FrameLayout e dovresti rendere trasparente il divisore ListView. L'attributo di elevazione e margine di CardView non funzionerà se non lo si utilizza all'interno di FrameLayout.

+1

Così vero. Grazie per averlo indicato. – user3144836

+0

Nei documenti dice solo che estende FrameLayout, vorrei che lo dica direttamente come hai fatto tu. Grazie. – Prof

+0

felice la mia risposta è aiutare le persone. –

6

È meglio utilizzare CardView con RecyclerView, ecco un esempio.

  • activity_main.xml (contiene il 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 (modulo: 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); 
    }  
    } 
    

Fare riferimento a questo tutorial per ulteriori dettagli: A Guide to Android RecyclerView and CardView

+0

Grazie per l'esempio. Ho dovuto rimuovere ".xml" da "R.layout.cardview.xml" in RecyclerViewAdapter.java – Zach

Problemi correlati