android5.0中RecycleView的用法
最近學習了android5.0中新增的一個組件RecycleView,是用來代替當前的listview開發的,是因為在RecycleView中已經有了viewholder緩存,并且不同的item之間可以設置不同的布局。能非常有效地維護了意見數量有限,滾動大的數據集。使用 RecyclerView當你擁有的數據的集合,它的元素在運行時改變基于用戶行為和網絡事件的小部件
首先看看RecyclerView的一個小例子:
需要引入:android-support-v7-appcompat.jar
android-v7-RecyclerView.jar來支持低版本的android系統
新建一個my_layout.xml布局文件:里邊放置一個RecyclerView
<android.support.v7.widget.RecyclerView
android:id="@+id/rvlist"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="vertical"
/>
在之前的listview開發中,我們需要自定義viewholder來緩存listView中的數據,而在RecyclerView中,已經封裝好了viewholder在adapter中,接下來自定義我們的adapter
public class MyAdapter2 extends RecyclerView.Adapter<MyAdapter2.ViewHolder>
{
// 數據集
private String[] mDataset;
public MyAdapter2(String[] dataset)
{
super();
mDataset = dataset;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i)
{
// 創建一個View,簡單起見直接使用系統提供的布局,就是一個TextView
View view = View.inflate(viewGroup.getContext(),R.layout.viewholder_item, null);
// 創建一個ViewHolder
ViewHolder holder = new ViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, int i)
{
// 綁定數據到ViewHolder上
viewHolder.mTextView.setText(mDataset[i]);
}
@Override
public int getItemCount()
{
return mDataset.length;
}
public static class ViewHolder extends RecyclerView.ViewHolder
{
public TextView mTextView;
public ViewHolder(View itemView)
{
super(itemView);
// mTextView = (TextView) itemView;
mTextView = (TextView) itemView.findViewById(R.id.view_text_id);
}
}
}在activity這樣調用,并設置adapter
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.rvlist);
// 創建一個線性布局管理器
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
// 設置布局管理器
recyclerView.setLayoutManager(layoutManager);
// 創建數據集
String[] dataset = new String[100];
for (int i = 0; i < dataset.length; i++){
dataset[i] = "item" + i;
}
// 創建Adapter,并指定數據集
MyAdapter2 adapter = new MyAdapter2(dataset);
// 設置Adapter
recyclerView.setAdapter(adapter);
}運行效果:

在這個例子中只是用到了最基本的布局,下面結合android中新增的CardView和RecycleView實現一個復雜的布局:
先看效果圖:


CardView繼承自FrameLayout,允許你在card視圖中顯示信息. CardView也可以設置陰影和圓角。(其實現在很多應用都自定義了Card視圖,Google這回將card視圖作為基本控件,可以拿來直接使用了)
Layout中為CardView設置圓角使用card_view:cardCornerRadius屬性
代碼中為CardView設置圓角使用CardView.setRadius方法
為CardView設置背景顏色使用card_view:cardBackgroundColor屬性
1.在item布局中引入cardview組件
<android.support.v7.widget.CardView
android:id="@+id/cardview_id"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:cardCornerRadius="5dp"
app:cardElevation="0dp" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="5dp" >
<ImageView
android:id="@+id/image_id"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_alignParentLeft="true"
/>
<TextView
android:id="@+id/text_id"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:textColor="#f89ef5"
android:textSize="20dp"
android:layout_centerInParent="true" />
</RelativeLayout>
</android.support.v7.widget.CardView>需要注意的是要在最底層的layout中引入cardview的命名空間:
xmlns:app=http://schemas.android.com/apk/res-auto
要實現不同的item有不同的布局,需要有一個type字段來作為區分,這里,我新建一個UserInfo類,如下:
public class UserInfo {
public static final int hasImage = 1;
public static final int noImage = 2;
private String mUserName;
private int userImage;
int type;
public String getmUserName() {
return mUserName;
}
public void setmUserName(String mUserName) {
this.mUserName = mUserName;
}
public int getUserImage() {
return userImage;
}
public void setUserImage(int userImage) {
this.userImage = userImage;
}
public int getType() {
return type;
}
public void setType(int type) {
this.type = type;
}
public UserInfo(String mUserName, int type) {
this.mUserName = mUserName;
this.type = type;
}
public UserInfo(String mUserName, int userImage, int type) {
this.mUserName = mUserName;
this.userImage = userImage;
this.type = type;
}
}
hasImage和noImage分別表示該item需不需要加載圖片,來加載不同的布局。 接下來看看Adapter的代碼:
public class MyAdapter extends RecyclerView.Adapter<ViewHolder>{
private List<UserInfo>mList = null;
private Context context = null;
public MyAdapter(List<UserInfo> mList, Context context) {
super();
this.mList = mList;
this.context = context;
// for (int i = 0; i < mList.size(); i++) {
// Log.d("liuhang","==="+mList.get(i).getmUserName()+"==="+mList.get(i).getUserImage());
// }
}
public void addToList(UserInfo info,int position) {
mList.add(0, info);
notifyItemInserted(position);
notifyDataSetChanged();
}
public class TextOnClick implements OnClickListener {
private int position = 0;
public TextOnClick(int position) {
this.position = position;
}
@Override
public void onClick(View v) {
Toast.makeText(context,"text the name:"+mList.get(position).getmUserName(),1000).show();
}
}
public class ImageOnclick implements OnClickListener {
private int position = 0;
public ImageOnclick(int position) {
this.position = position;
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(context,"image the imageId:"+mList.get(position).getUserImage(),1000).show();
}
}
public class ItemOnClick implements OnItemClickListener {
@Override
public void onItemClick(AdapterViewCompat<?> arg0, View arg1, int arg2,
long arg3) {
// TODO Auto-generated method stub
Toast.makeText(context,"you choose the item",1000).show();
}
}
@Override
public int getItemCount() {
return mList.size();
}
public class TextViewHolder extends RecyclerView.ViewHolder {
public TextView textView = null;
public TextViewHolder(View view) {
super(view);
this.textView = (TextView) view.findViewById(R.id.text_id);
}
}
public class ImageTextViewHolder extends RecyclerView.ViewHolder {
public ImageView imageView = null;
public TextView textView = null;
public ImageTextViewHolder(View view) {
super(view);
this.imageView = (ImageView) view.findViewById(R.id.image_id);
this.textView = (TextView) view.findViewById(R.id.text_id);
}
}
@Override
public int getItemViewType(int position) {
// TODO Auto-generated method stub
return mList.get(position).getType();
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
switch (getItemViewType(position)) {
case UserInfo.hasImage:
ImageTextViewHolder imageTextViewHolder = (ImageTextViewHolder) holder;
imageTextViewHolder.imageView.setImageResource(mList.get(position).getUserImage());
imageTextViewHolder.textView.setText(mList.get(position).getmUserName());
imageTextViewHolder.textView.setOnClickListener(new TextOnClick(position));
imageTextViewHolder.imageView.setOnClickListener(new ImageOnclick(position));
break;
case UserInfo.noImage:
TextViewHolder textViewHolder = (TextViewHolder) holder;
textViewHolder.textView.setText(mList.get(position).getmUserName());
textViewHolder.textView.setOnClickListener(new TextOnClick(position));
}
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int type) {
ViewHolder holder = null;
View view = null;
switch (type) {
case UserInfo.hasImage:
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_text_image_item,null);
holder = new ImageTextViewHolder(view);
break;
case UserInfo.noImage:
view = LayoutInflater.from(parent.getContext()).inflate(R.layout.card_text_item,null);
holder = new TextViewHolder(view);
break;
}
<a target=_blank >源碼下載</a>
return holder;
}
}在activity中這樣調用:
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_id);
recyclerView.setHasFixedSize(true);
LinearLayoutManager linaLayout = new LinearLayoutManager(this);
linaLayout.setOrientation(1);
recyclerView.setLayoutManager(linaLayout);
recyclerView.getRecycledViewPool().setMaxRecycledViews(0, 10);
int[]userImage = {R.drawable.icon08,R.drawable.icon00,R.drawable.icon01,
R.drawable.icon02,R.drawable.icon03,R.drawable.icon04,
R.drawable.icon05,R.drawable.icon06,R.drawable.icon07};
List<UserInfo>userList = new ArrayList<UserInfo>();
int position = 0;
for (int i = 0; i < 35; i++) {
position = (int) (Math.random() * 8);
UserInfo userInfo1 = new UserInfo("zhangsan"+i,2);
UserInfo userInfo2 = new UserInfo("lisi"+i,userImage[position],1);
userList.add(userInfo1);
userList.add(userInfo2);
}
final MyAdapter adapter= new MyAdapter(userList, this);
recyclerView.setAdapter(adapter);
recyclerView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(MyActivity.this,"you choose the item",1000).show();
}
});
Button button = (Button) findViewById(R.id.add);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
adapter.addToList(new UserInfo("new add"+ newAdd++, 2),0);
}
});<a target=_blank >源碼下載</a>
來自: http://blog.csdn.net//mockingbirds/article/details/42245991