笔记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); } }
相关文章推荐
- Android RecyclerView 使用详解
- Android RecyclerView使用详解一
- RecyclerView使用详解(三)
- RecyclerView使用详解(二)
- Android 高级UI设计笔记20:RecyclerView 的详解之RecyclerView添加Item点击事件
- RecyclerView使用笔记
- RecyclerView使用详解(一)
- RecyclerView使用详解(三)
- RecyclerView使用详解(三)
- Android RecyclerView使用详解
- Android RecyclerView使用详解二
- 【安卓笔记】CardView+RecyclerView使用示例
- RecyclerView的使用详解
- RecyclerView使用详解(二)
- Android RecyclerView使用详解(一)
- RecyclerView使用详解(一)
- UltimateRecyclerView的使用方法详解
- RecyclerView使用详解(一)
- recyclerview使用详解
- Android RecyclerView使用详解及实现多选