笔记19 RecyclerView详解及使用心得

1、使用RecyclerView

eclipse

(1)在eclipse 的android sdk manager 中下载Android Support Library 
(2)把appcompat工程中的anroid-support-v7.appcompat.jar拷贝dao工程的libs文件中,并引用

(3)在sdk的extras文件加找到android-support-v7-recyclerview.jar,并把此文件拷贝到工程的libs文件,再在工程属性里addJars


androidstudio 引用更加的简单。

build.gradle 文件

compile 'com.android.support:appcompat-v7:24.2.0'
compile 'com.android.support:support-v4:24.2.0'
compile 'com.android.support:recyclerview-v7:24.2.0'


首先定义model和获取假数据的方法。

实体类

package com.example.recycler;

/**
 * Created by wtf on 06/10/14.
 */
public class SampleModel {

    private String sampleText;

    public SampleModel(String sampleText) {
        this.sampleText = sampleText;
    }

    public void setSampleText(String sampleText) {
        this.sampleText = sampleText;
    }

    public String getSampleText() {
        return sampleText;
    }
}
实体类获取要显示的数据
package com.example.recycler;

import java.util.ArrayList;


public class DemoApp {
	//  获取要显示的数据(初始化数据)
    public static ArrayList<SampleModel> getSampleData(int size)
    {
    	    ArrayList<SampleModel> sampleData = new ArrayList<SampleModel>(size);
    	    for(int i = 0; i < size; i++)
    	    {
    	    	    //  每一项数据后面都有相应的序号
    	      	sampleData.add(new SampleModel("新的列表项<" + i + ">"));
    	    }

		return sampleData;
    }
}

定义简单的分割线。SampleDivider

package com.example.recycler;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.support.v7.widget.RecyclerView;
import android.view.View;

public class SampleDivider extends RecyclerView.ItemDecoration
{
	// 系统默认分隔条Drawable资源的ID
	private static final int[] ATTRS =
	{ android.R.attr.listDivider };
	// 分隔条Drawable对象
	private Drawable mDivider;

	//通过类的构造方法来初始化
	public SampleDivider(Context context)
	{
		TypedArray a = context.obtainStyledAttributes(ATTRS);
		// 获取系统提供的分隔条Drawable对象
		mDivider = a.getDrawable(0);
		// 回收TypedArray所占用的空间
		a.recycle();
	}

	/**
	 * 继承自RecyclerView.ItemDecoration 实现这个方法即可
	 *
	 * 在该方法中绘制了所有列表项之间的分隔条
     */
	@Override
	public void onDrawOver(Canvas c, RecyclerView parent)
	{
		// 获取列表项距离左边缘的距离
		int left = parent.getPaddingLeft();

		// 获取列表项距离右边缘的距离
		int right = parent.getWidth() - parent.getPaddingRight();

		// 获取列表项的总数
		int childCount = parent.getChildCount();

		// 开始绘制所有列表项之间的分隔线
		for (int i = 0; i < childCount; i++)
		{
			// 获得当前的列表项
			View child = parent.getChildAt(i);

			// 获取当前列表项的布局参数信息
			RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
					.getLayoutParams();
			
			//  计算分隔条左上角的纵坐标
			int top = child.getBottom() + params.bottomMargin;
			
			//  计算分隔条右下角的纵坐标
			int bottom = top + mDivider.getIntrinsicHeight();
			
			//  设置分隔条绘制的位置
			mDivider.setBounds(left, top, right, bottom);
			
			//  开始绘制当前列表项下方的分隔条
			mDivider.draw(c);

		}

	}

}
SampleRecyclerAdapter 简单的适配器

<span style="font-size: 14px;">package com.example.recycler;

import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.Random;

public class SampleRecyclerAdapter extends
        RecyclerView.Adapter<SampleRecyclerAdapter.ViewHolder> {

    protected final ArrayList<SampleModel> sampleData = DemoApp.getSampleData(20);


    @Override
    public SampleRecyclerAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View item = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_basic_item,
                parent, false);
        return new ViewHolder(item);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        final SampleModel rowData = sampleData.get(position);
        holder.textViewSample.setText(rowData.getSampleText());
        holder.itemView.setTag(rowData);
    }

    @Override
    public int getItemCount() {
        return sampleData.size();
    }

    //  删除指定的Item
    public void removeData(int position)
    {
        sampleData.remove(position);
        //  通知RecyclerView控件某个Item已经被删除
        notifyItemRemoved(position);

    }
    //  在指定位置添加一个新的Item
    public void addItem(int positionToAdd)
    {
        sampleData.add(positionToAdd,new SampleModel("新的列表项" + new Random().nextInt(10000)));
        //  通知RecyclerView控件插入了某个Item
        notifyItemInserted(positionToAdd);
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {

        private final TextView textViewSample;

        public ViewHolder(View itemView) {
            super(itemView);
            textViewSample = (TextView) itemView.findViewById(R.id.textViewSample);
        }
    }
}</span><span style="font-size:24px;">
</span>

MainActivity

package com.example.recycler;

import android.app.Activity;
import android.graphics.Outline;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewOutlineProvider;
import android.view.animation.AnimationUtils;
import android.widget.FrameLayout;

public class MainActivity extends Activity
{

	private FrameLayout mDeleteBar;

	@Override
	protected void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		// mDeleteBar
		mDeleteBar = (FrameLayout) findViewById(R.id.deleteBar);
		// 创建右下角圆形按钮
		// 创建RecyclerView控件
		// 创建上方的Delete面板

		ViewOutlineProvider viewOutlineProvider = null;
		if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
			viewOutlineProvider = new ViewOutlineProvider()
            {

                @Override
                public void getOutline(View view, Outline outline)
                {
                    // 获取按钮的尺寸
                    int fabSize = getResources().getDimensionPixelSize(
                            R.dimen.fab_size);
                    // 设置轮廓的尺寸
					if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
						outline.setOval(-4, -4, fabSize + 2, fabSize + 2);
					}

				}
            };
		}
		// 获得右下角圆形按钮对象
		View fabView = findViewById(R.id.fab_add);

		if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
			fabView.setOutlineProvider(viewOutlineProvider);
		}

		// 获取RecyclerView对象
		final RecyclerView recyclerView = (RecyclerView)findViewById(R.id.recycler_view);
		
		//  创建线性布局管理器(默认是垂直方向)
		final LinearLayoutManager layoutManager = new LinearLayoutManager(this);
		
		//  为RecyclerView指定布局管理对象
		recyclerView.setLayoutManager(layoutManager);
		
		//  创建列表项分隔线对象
		final RecyclerView.ItemDecoration itemDecoration = new SampleDivider(this);
		
		//  为RecyclerView控件指定分隔线对象
		recyclerView.addItemDecoration(itemDecoration);
		String s = "a";

		final SampleRecyclerAdapter sampleRecyclerAdapter = new SampleRecyclerAdapter();
		recyclerView.setAdapter(sampleRecyclerAdapter);
		
		//  处理添加按钮的单击事件
		fabView.setOnClickListener(new View.OnClickListener()
		{
			
			@Override
			public void onClick(View v)
			{
				//  获取第一个可视的Item的位置
				int positionToAdd = layoutManager.findFirstCompletelyVisibleItemPosition();
				//  在该位置插入新的Item
				sampleRecyclerAdapter.addItem(positionToAdd);
				
			}
		});
       //  处理删除事件
		mDeleteBar.setOnClickListener(new View.OnClickListener()
		{
			
			@Override
			public void onClick(View v)
			{
				int positionToRemove = layoutManager.findFirstCompletelyVisibleItemPosition();
				
				// 删除第一个可视的ite
				sampleRecyclerAdapter.removeData(positionToRemove);
				
			}
		});
		
		//  为RecyclerView控件设置滚动事件
		recyclerView.setOnScrollListener(new RecyclerView.OnScrollListener()
		{

			@Override
			public void onScrolled(RecyclerView recyclerView, int dx, int dy)
			{
				
				super.onScrolled(recyclerView, dx, dy);
				//  dx:大于0,向右滚动    小于0,向左滚动
				//  dy:大于0,向上滚动    小于0,向下滚动
				
				if(dy > 0)
				{
					//  列表向上滚动,隐藏删除面板
					if(mDeleteBar.getVisibility() == View.VISIBLE)
					{
						hideDeleteBar();
					}
				}
				else
				{
					// 列表向下滚动,显示删除面板
					if(mDeleteBar.getVisibility() == View.GONE)
					{
						showDeleteBar();
					}
				}
				
			}
		});
	}

	private void showDeleteBar()
	{

		mDeleteBar.startAnimation(AnimationUtils.loadAnimation(this,
				R.anim.translate_up_on));

		mDeleteBar.setVisibility(View.VISIBLE);
	}

	private void hideDeleteBar()
	{

		mDeleteBar.startAnimation(AnimationUtils.loadAnimation(this,
				R.anim.translate_up_off));

		mDeleteBar.setVisibility(View.GONE);
	}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值