您的位置:首页 > 其它

笔记19 RecyclerView详解及使用心得

2016-09-09 14:49 351 查看

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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: