android v7兼容包RecyclerView的使用(一)

nde7 9年前發布 | 22K 次閱讀 Android開發 移動開發 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://download.csdn.net/detail/sbsujjbcy/8489667

來自:http://blog.csdn.net/sbsujjbcy/article/details/44182651

 本文由用戶 nde7 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!