android v7兼容包RecyclerView的使用(一)
什么是RecyclerView?個人理解,它是一個在數據量大的時候,為了顯示在界面上提供的靈活高效處理的控件。可以替代listview,gallery,gridview等控件。
如何使用?本篇文章只是熱熱身,不會過多介紹細節。
首先需要導入\sdk\extras\android\support\v7\recyclerview\libs\android- support-v7-recyclerview.jar包,如果sdk目錄下沒有該文件,則adt版本可能太低,建議升級或者從網上下載該庫。
RecyclerView的使用準備多謝幾篇,所以這篇只是入門。
國際慣例,先看效果圖,此程序實現微信的會話記錄界面。
分析一下,該界面的每一項都是由四個組件構成,即圖標,標題,描述,時間。所以,開始編寫實體類。
package cn.edu.zafu.recyclerviewdemo;/**
- 實體類
- @author lizhangqu *
2015-3-10 */ public class Item { //圖標,簡單起見存在本地drawable目錄 private int img; //標題 private String title; //描述 private String description; //時間 private String time;
//getter 和 setter public int getImg() {
return img;
}
public void setImg(int img) {
this.img = img;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
@Override public String toString() {
return "Item [img=" + img + ", title=" + title + ", description=" + description + ", time=" + time + "]";
}
}</pre>
編寫完實體類后,開始對每一項的布局進行編寫,使用相對布局
<RelativeLayout xmlns:android="<ImageView android:id="@+id/img" android:layout_width="48dp" android:layout_height="48dp" android:layout_alignParentLeft="true" android:layout_centerVertical="true" android:background="@drawable/icon" /> <TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="10dp" android:layout_marginTop="5dp" android:layout_toRightOf="@id/img" android:text="微信支付" android:textColor="#000" android:textSize="16sp" /> <TextView android:id="@+id/time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_marginTop="5dp" android:text="晚上20:09" android:textColor="#777" android:textSize="12sp" /> <TextView android:id="@+id/description" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@id/title" android:layout_below="@id/title" android:layout_marginTop="5dp" android:text="微信支付:支付成功通知" />
</RelativeLayout></pre>
編寫適配器,并編寫接口處理點擊事件
package cn.edu.zafu.recyclerviewdemo;import java.util.List;
import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import cn.edu.zafu.recyclerviewdemo.RecyclerAdapter.ItemViewHolder;
public class RecyclerAdapter extends RecyclerView.Adapter<ItemViewHolder> { private List<Item> items; //點擊監聽事件 interface OnRecyclerViewItemClickListener{ void onClick(View view,int position); }; private OnRecyclerViewItemClickListener listener; //設置監聽器 public void setListener(OnRecyclerViewItemClickListener listener) { this.listener = listener; } //構造函數,將數據賦值給成員變量 public RecyclerAdapter(List<Item> items) { this.items = items; } //獲得數據大小 @Override public int getItemCount() { return items.size(); }
@Override public ItemViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { //將布局進行綁定 View view = LayoutInflater.from(viewGroup.getContext()).inflate( R.layout.item, viewGroup, false); return new ItemViewHolder(view); } //綁定數據 @Override public void onBindViewHolder(final ItemViewHolder viewHolder,final int position) { Item item = items.get(position); viewHolder.img.setImageResource(item.getImg()); viewHolder.title.setText(item.getTitle()); viewHolder.description.setText(item.getDescription()); viewHolder.time.setText(item.getTime()); viewHolder.itemView.setOnClickListener(new OnClickListener() { //如果監聽器非空,則回調 @Override public void onClick(View v) { if (listener!=null) { listener.onClick(viewHolder.itemView, position); } } }); } //ViewHolder,用于緩存,提高效率 public final static class ItemViewHolder extends RecyclerView.ViewHolder { //每一項的四個控件 ImageView img; TextView title; TextView description; TextView time; public ItemViewHolder(View itemView) { super(itemView); img = (ImageView) itemView.findViewById(R.id.img); title = (TextView) itemView.findViewById(R.id.title); description = (TextView) itemView.findViewById(R.id.description); time = (TextView) itemView.findViewById(R.id.time); } }
}</pre>
在Activity中使用,為recyclerview設置適配器,數據改變時的動畫,
package cn.edu.zafu.recyclerviewdemo;import java.util.ArrayList;
import android.app.Activity; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.os.Bundle; import android.support.v7.widget.DefaultItemAnimator; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.View; import android.widget.Toast; import cn.edu.zafu.recyclerviewdemo.RecyclerAdapter.OnRecyclerViewItemClickListener;
public class MainActivity extends Activity { private RecyclerView recyclerView; private ArrayList<Item> items = new ArrayList<Item>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);initDatas(); setContentView(R.layout.activity_main); initDatas();//初始化數據 initViews();//初始化recyclerview } private void initViews() {
recyclerView = (RecyclerView) findViewById(R.id.recyclerView); //新建適配器 RecyclerAdapter adapter = new RecyclerAdapter(items); //設置監聽器 adapter.setListener(new OnRecyclerViewItemClickListener() { @Override public void onClick(View view, int position) { Toast.makeText(getApplicationContext(), items.get(position).getTitle(), Toast.LENGTH_LONG).show(); } }); //設置適配器 recyclerView.setAdapter(adapter); //默認動畫效果 recyclerView.setItemAnimator(new DefaultItemAnimator()); //設置布局管理器,第三個參數為是否逆向布局 recyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)); //設置每一項的裝飾,這里給它加入分隔線 recyclerView.addItemDecoration(new RecyclerView.ItemDecoration() { Paint paint = new Paint(); @Override public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) { super.onDraw(c, parent, state); } @Override public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) { super.onDrawOver(c, parent, state); paint.setColor(Color.LTGRAY); for (int i = 0, size = parent.getChildCount(); i < size; i++) { View child = parent.getChildAt(i); c.drawLine(child.getLeft(), child.getBottom(), child.getRight(), child.getBottom(), paint); } } }); //可以提高效率 recyclerView.setHasFixedSize(true); } private void initDatas() { Item item = new Item(); item.setImg(R.drawable.icon); item.setTitle("微信支付"); item.setDescription("微信支付:支付成功通知"); item.setTime("晚上20:35"); items.add(item); item = new Item(); item.setImg(R.drawable.icon); item.setTitle("微信支付"); item.setDescription("微信支付:支付成功通知"); item.setTime("晚上20:35"); items.add(item); item = new Item(); item.setImg(R.drawable.icon); item.setTitle("微信支付"); item.setDescription("微信支付:支付成功通知"); item.setTime("晚上20:35"); items.add(item); item = new Item(); item.setImg(R.drawable.icon); item.setTitle("微信支付"); item.setDescription("微信支付:支付成功通知"); item.setTime("晚上20:35"); items.add(item); item = new Item(); item.setImg(R.drawable.icon); item.setTitle("微信支付"); item.setDescription("微信支付:支付成功通知"); item.setTime("晚上20:35"); items.add(item); item = new Item(); item.setImg(R.drawable.icon); item.setTitle("微信支付"); item.setDescription("微信支付:支付成功通知"); item.setTime("晚上20:35"); items.add(item); item = new Item(); item.setImg(R.drawable.icon); item.setTitle("微信支付"); item.setDescription("微信支付:支付成功通知"); item.setTime("晚上20:35"); items.add(item); }
}</pre>
ItemDecoration也可以使用現成的,但是我沒有在android源碼里找打它,反而是在github上找到的它,這里貼出源碼,其作用就是增加分隔線,支持水平和豎直狀態,而我的代碼只是簡單處理了豎直狀態下的分隔線
/*
- Copyright (C) 2014 The Android Open Source Project *
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at *
- http://www.apache.org/licenses/LICENSE-2.0 *
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
limitations under the License. */ public class DividerItemDecoration extends RecyclerView.ItemDecoration {
private static final int[] ATTRS = new int[]{
android.R.attr.listDivider
};
public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;
public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL;
private Drawable mDivider;
private int mOrientation;
public DividerItemDecoration(Context context, int orientation) {
final TypedArray a = context.obtainStyledAttributes(ATTRS); mDivider = a.getDrawable(0); a.recycle(); setOrientation(orientation);
}
public void setOrientation(int orientation) {
if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) { throw new IllegalArgumentException("invalid orientation"); } mOrientation = orientation;
}
@Override public void onDraw(Canvas c, RecyclerView parent) {
if (mOrientation == VERTICAL_LIST) { drawVertical(c, parent); } else { drawHorizontal(c, parent); }
}
public void drawVertical(Canvas c, RecyclerView parent) {
final int left = parent.getPaddingLeft(); final int right = parent.getWidth() - parent.getPaddingRight(); final int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child .getLayoutParams(); final int top = child.getBottom() + params.bottomMargin; final int bottom = top + mDivider.getIntrinsicHeight(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); }
}
public void drawHorizontal(Canvas c, RecyclerView parent) {
final int top = parent.getPaddingTop(); final int bottom = parent.getHeight() - parent.getPaddingBottom(); final int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child .getLayoutParams(); final int left = child.getRight() + params.rightMargin; final int right = left + mDivider.getIntrinsicHeight(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); }
}
@Override public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) {
if (mOrientation == VERTICAL_LIST) { outRect.set(0, 0, 0, mDivider.getIntrinsicHeight()); } else { outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0); }
} }</pre>
布局文件<RelativeLayout xmlns:android="<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent" />
</RelativeLayout></pre>
整個使用過程還是相當簡單的,這只是這個控件的使用的開始,而它的作用遠遠不止這些。更多的內容在之后的博文中詳細寫。
來自:http://blog.csdn.net/sbsujjbcy/article/details/44182651