blob: 7127649bda830b8be081cb1366a266e5e946d974 [file] [log] [blame]
page.title=To Danh sách và Th
@jd:body
<div id="tb-wrapper">
<div id="tb">
<h2>Bài hc này hướng dn bn cách</h2>
<ol>
<li><a href="#RecyclerView">To Danh sách</a></li>
<li><a href="#CardView">To Thẻ</a></li>
<li><a href="#Dependencies">Thêm Ph thuc</a></li>
</ol>
<h2>Bn cũng nên đọc</h2>
<ul>
<li><a href="http://www.google.com/design/spec">Đặc t phong cách Material Design</a></li>
<li><a href="{@docRoot}design/material/index.html">Material Design trên Android</a></li>
</ul>
</div>
</div>
<p>Để to danh sách và th phc tp bng phong cách material design trong ng dng ca mình, bn có th s dng widget
{@link android.support.v7.widget.RecyclerView} và {@link android.support.v7.widget.CardView}
.</p>
<h2 id="RecyclerView">To Danh sách</h2>
<p>Widget {@link android.support.v7.widget.RecyclerView} là mt phiên bn nâng cao và linh hot hơn
ca {@link android.widget.ListView}. Widget này là mt b cha để hin th các tp d liu
ln có th được cun rt hiu qu bng cách duy trì mt s dng xem hu hn. S dng widget
{@link android.support.v7.widget.RecyclerView} khi bn có các b sưu tp d liu vi phn t
thay đổi vào thi gian chy da vào hành động ca người dùng hoc s kin mng.</p>
<p>Lp {@link android.support.v7.widget.RecyclerView} đơn gin hóa vic hin th và x lý
các tp d liu ln bng cách cung cp:</p>
<ul>
<li>Trình qun lý b trí để định v mc</li>
<li>Hot hình mc định cho các thao tác chung đối vi mc như loi b hoc thêm mc</li>
</ul>
<p>Bn cũng có s linh hot để định nghĩa các trình qun lý b trí tùy chnh và hot hình cho widget {@link
android.support.v7.widget.RecyclerView}.</p>
<img src="{@docRoot}training/material/images/RecyclerView.png" alt="" width="550" height="106" />
<p class="img-caption">
<strong>Hình 1</strong>. Widget <code>RecyclerView</code>.
</p>
<p>Để s dng widget {@link android.support.v7.widget.RecyclerView}, bn phi quy định mt
trình điu hp và trình qun lý b trí. Để to mt trình điu hp, hãy m rng lp {@link
android.support.v7.widget.RecyclerView.Adapter RecyclerView.Adapter}. Chi tiết
ca trin khai ph thuc vào các ch định ca tp d liu ca bn và kiu dng xem. Để biết thêm
thông tin, hãy xem <a href="#RVExamples">ví dụ</a> bên dưới.</p>
<div style="float:right">
<img src="{@docRoot}design/material/images/list_mail.png" alt="" width="250" height="426" />
<p class="img-caption" style="margin-left:8px">
<strong>Hình 2</strong> - Danh sách với <code>RecyclerView</code>.
</p>
</div>
<p><strong>Trình qun lý b trí</strong> s định v các dng xem mc bên trong {@link
android.support.v7.widget.RecyclerView} và xác định thi đim s dng li các dng xem mc
không còn hin th trước người dùng na. Để s dng li (hoc <em>tái chế</em>) mt dng xem, trình qun lý b
trí có th yêu cu trình điu hp thay thế ni dung ca dng xem bng mt phn t khác t tp d liu. Tái chế
dng xem bng cách này s ci thin hiu năng nh tránh to nhng dng xem không cn thiết hoc thc hin
tra cu {@link android.app.Activity#findViewById findViewById()} tốn kém.</p>
<p>{@link android.support.v7.widget.RecyclerView} cung cp nhng trình qun lý b trí dng sn sau:</p>
<ul>
<li>{@link android.support.v7.widget.LinearLayoutManager} hin các mc trong mt danh sách cun
thng đứng hoc nm ngang.</li>
<li>{@link android.support.v7.widget.GridLayoutManager} hin các mc trong lưới.</li>
<li>{@link android.support.v7.widget.StaggeredGridLayoutManager} hin các mc trong mt lưới so le.</li>
</ul>
<p>Để to mt trình qun lý b trí tùy chnh, hãy m rng lp {@link
android.support.v7.widget.RecyclerView.LayoutManager RecyclerView.LayoutManager}.</p>
<h3>Hot hình</h3>
<p>Hot hình để thêm và loi b mc được kích hot theo mc định trong {@link
android.support.v7.widget.RecyclerView}. Để tùy chnh nhng hot hình này, hãy m rng lp
{@link android.support.v7.widget.RecyclerView.ItemAnimator RecyclerView.ItemAnimator} và s dng
phương thc {@link android.support.v7.widget.RecyclerView#setItemAnimator RecyclerView.setItemAnimator()}
.</p>
<h3 id="RVExamples">Ví dụ</h3>
<p>Ví d đon mã sau minh ha cách thêm
{@link android.support.v7.widget.RecyclerView} vào b trí:</p>
<pre>
&lt;!-- A RecyclerView with some commonly used attributes -->
&lt;android.support.v7.widget.RecyclerView
android:id="@+id/my_recycler_view"
android:scrollbars="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</pre>
<p>Sau khi thêm widget {@link android.support.v7.widget.RecyclerView} vào b trí ca bn,
hãy ly mt núm điu tác ti đối tượng, kết ni nó vi mt trình qun lý b trí và gn kèm mt trình điu hp cho d liu
cn được hin thị:</p>
<pre>
public class MyActivity extends Activity {
private RecyclerView mRecyclerView;
private RecyclerView.Adapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager;
&#64;Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.my_activity);
mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
// use this setting to improve performance if you know that changes
// in content do not change the layout size of the RecyclerView
mRecyclerView.setHasFixedSize(true);
// use a linear layout manager
mLayoutManager = new LinearLayoutManager(this);
mRecyclerView.setLayoutManager(mLayoutManager);
// specify an adapter (see also next example)
mAdapter = new MyAdapter(myDataset);
mRecyclerView.setAdapter(mAdapter);
}
...
}
</pre>
<p>Trình điu hp cung cp truy cp vào các mc trong tp d liu ca bn, to dng xem cho mc và
thay thế ni dung ca mt s dng xem bng mc d liu mi khi mc ban đầu không còn
hin thị. Ví d đon mã sau đây th hin vic trin khai đơn gin ca tp d liu bao gm
mt mng xâu được hin th bng widget {@link android.widget.TextView}:</p>
<pre>
public class MyAdapter extends RecyclerView.Adapter&lt;MyAdapter.ViewHolder> {
private String[] mDataset;
// Provide a reference to the views for each data item
// Complex data items may need more than one view per item, and
// you provide access to all the views for a data item in a view holder
public static class ViewHolder extends RecyclerView.ViewHolder {
// each data item is just a string in this case
public TextView mTextView;
public ViewHolder(TextView v) {
super(v);
mTextView = v;
}
}
// Provide a suitable constructor (depends on the kind of dataset)
public MyAdapter(String[] myDataset) {
mDataset = myDataset;
}
// Create new views (invoked by the layout manager)
&#64;Override
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
// create a new view
View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.my_text_view, parent, false);
// set the view's size, margins, paddings and layout parameters
...
ViewHolder vh = new ViewHolder(v);
return vh;
}
// Replace the contents of a view (invoked by the layout manager)
&#64;Override
public void onBindViewHolder(ViewHolder holder, int position) {
// - get element from your dataset at this position
// - replace the contents of the view with that element
holder.mTextView.setText(mDataset[position]);
}
// Return the size of your dataset (invoked by the layout manager)
&#64;Override
public int getItemCount() {
return mDataset.length;
}
}
</pre>
<div style="float:right;margin-top:15px;margin-left:30px">
<img src="{@docRoot}design/material/images/card_travel.png" alt="" width="225" height="383">
<p class="img-caption" style="margin-left:12px">
<strong>Hình 3</strong>. Ví d thẻ.
</p>
</div>
<h2 id="CardView">To Thẻ</h2>
<p>{@link android.support.v7.widget.CardView} m rng lp {@link android.widget.FrameLayout} và
cho phép bn hin th thông tin bên trong các th có din mo nht quán trên khp nn tng. Widget {@link
android.support.v7.widget.CardView} có th có đổ bóng và góc bo tròn.</p>
<p>Để to mt th có bóng, hãy s dng thuc tính <code>card_view:cardElevation</code>.
{@link android.support.v7.widget.CardView} s dng độ cao thc và đổ bóng động trên Android 5.0
(API mc 21) và cao hơn, và quay li trin khai đổ bóng theo lp trình trên các phiên bn cũ hơn.
Để biết thêm thông tin, hãy xem phn <a href="{@docRoot}training/material/compatibility.html">Duy trì
Tính tương thích</a>.</p>
<p>S dng nhng thuc tính sau để tùy chnh din mo ca widget
{@link android.support.v7.widget.CardView}:</p>
<ul>
<li>Để đặt bán kính góc trong b trí ca bn, hãy s dng thuc tính <code>card_view:cardCornerRadius</code>
.</li>
<li>Để đặt bán kính góc trong mã ca bn, hãy s dng phương thc <code>CardView.setRadius</code>.</li>
<li>Để đặt màu nn ca thẻ, hãy s dng thuc tính <code>card_view:cardBackgroundColor</code>
.</li>
</ul>
<p>Ví d v mã sau đây cho bn thy cách thêm widget {@link android.support.v7.widget.CardView}
trong b trí ca mình:</p>
<pre>
&lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:card_view="http://schemas.android.com/apk/res-auto"
... >
&lt;!-- A CardView that contains a TextView -->
&lt;android.support.v7.widget.CardView
xmlns:card_view="http://schemas.android.com/apk/res-auto"
android:id="@+id/card_view"
android:layout_gravity="center"
android:layout_width="200dp"
android:layout_height="200dp"
card_view:cardCornerRadius="4dp">
&lt;TextView
android:id="@+id/info_text"
android:layout_width="match_parent"
android:layout_height="match_parent" />
&lt;/android.support.v7.widget.CardView>
&lt;/LinearLayout>
</pre>
<p>Để biết thêm thông tin, hãy xem tài liu tham kho API cho {@link android.support.v7.widget.CardView}.</p>
<h2 id="Dependencies">Thêm Ph thuc</h2>
<p>Widget {@link android.support.v7.widget.RecyclerView} và {@link android.support.v7.widget.CardView}
là b phn ca <a href="{@docRoot}tools/support-library/features.html#v7">Thư vin H tr
v7</a>. Để s dng nhng widget này trong d án ca mình, hãy thêm nhng
<a href="{@docRoot}sdk/installing/studio-build.html#dependencies">Ph thuc Gradle</a> này vào mô-đun
ng dng ca bn:</p>
<pre>
dependencies {
...
compile 'com.android.support:cardview-v7:21.0.+'
compile 'com.android.support:recyclerview-v7:21.0.+'
}
</pre>