package com.world.hello.recycleview;
/**
* 模拟对象数据
* Created by chengguo on 2016/5/30.
*/
public class SampleModel {
private String message;
public SampleModel(String message) {
this.message = message;
}
public void setMessage(String s) {
message = s;
}
public String getMessage() {
return message;
}
}
package com.world.hello.recycleview;
import java.util.ArrayList;
/**
* 模拟数据集合
* Created by chengguo on 2016/5/30.
*/
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;
}
}
package com.world.hello.recycleview;
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;
/**
* 定制分割线
* Created by chengguo on 2016/5/30.
*/
public class SampleDivider extends RecyclerView.ItemDecoration {
//默认分割条Drawable资源的Id
private static final int[] ATTRS = {android.R.attr.listDivider};
//分割条的Drawable对象
private Drawable mDicider;
public SampleDivider(Context context) {
TypedArray ta = context.obtainStyledAttributes(ATTRS);
//获取分割条的drawable对象
mDicider = ta.getDrawable(0);
//回收ta所占用的空间
ta.recycle();
}
/**
* 在改方法中绘制了所有列表项之间的分割条
*
* @param c
* @param parent
*/
@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 + mDicider.getIntrinsicHeight();
//设置分割条绘制的位置
mDicider.setBounds(left,top,right,bottom);
//开始绘制当前列表项下方的分割条
mDicider.draw(c);
}
}
}
package com.world.hello.recycleview;
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;
/**
* recycleView的adapter
* Created by chengguo on 2016/5/30.
*/
public class SampleRecycleAdapter extends RecyclerView.Adapter<SampleRecycleAdapter.ViewHolder>{
//保存列表项数据
private final ArrayList<SampleModel> sampleData = DemoApp.getSampleData(30);
//创建列表项中显示的控件对象(需要使用Adapter指定泛型)
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//获取列表项控件LinearLayer对象
View rowView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item,parent,false);
return new ViewHolder(rowView);
}
//在该方法中设置列表项中显示的值
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
SampleModel rowData = sampleData.get(position);
holder.textViewSample.setText(rowData.getMessage());
holder.itemView.setTag(rowData);
}
//设置列表项总和
@Override
public int getItemCount() {
return sampleData.size();
}
//删除指定列表项的数据
public void removeData(int position){
sampleData.remove(position);
//通知recycleView某个列表项被删除了
notifyItemRemoved(position);
}
//在指定的位置添加一个新的列表项
public void addItem(int position){
//使用随机数字
sampleData.add(position,new SampleModel("新增列表项"+ new Random().nextInt(100)));
notifyItemInserted(position);
}
/**
* ViewHolder用于存储列表项中显示的控件,(这里只有一个TextView做示例)
*/
public static class ViewHolder extends RecyclerView.ViewHolder{
private TextView textViewSample;
public ViewHolder(View itemView) {
super(itemView);
textViewSample = (TextView) itemView.findViewById(R.id.text_view);
}
}
}
compile ‘com.android.support:design:23.4.0‘
package com.world.hello.recycleview;
import android.app.Activity;
import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.animation.AnimationUtils;
import android.widget.Button;
public class MainActivity extends Activity {
//顶部删除按钮
private Button mDeleteBar;
//recyclerView
private RecyclerView mRecyclerView;
//添加item按钮,这里也是使用Design库里面的一个新控件,就当做一个按钮使用。只是样式很好看
private FloatingActionButton mAddBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mDeleteBar = (Button) findViewById(R.id.delete_btn);
mAddBtn = (FloatingActionButton) findViewById(R.id.add_item);
//获取到recyclerView
mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
//创建LinearLayoutManager
final LinearLayoutManager layoutManager = new LinearLayoutManager(this);
//为RecyclerView指定布局管理器对象
mRecyclerView.setLayoutManager(layoutManager);
//创建列表项分割线对象
final RecyclerView.ItemDecoration itemDecoration = new SampleDivider(this);
//RecyclerView控件指定分割线对象
mRecyclerView.addItemDecoration(itemDecoration);
//创建SampleRecyclerAdapter
final SampleRecycleAdapter sampleRecycleAdapter = new SampleRecycleAdapter();
//为RecyclerView控件指定Adapter
mRecyclerView.setAdapter(sampleRecycleAdapter);
//设置Item增加、移除动画
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
//为右下角按钮添加点击事件
mAddBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//获取第一个可视的列表项的位置,再加上2个位置,为了演示方便
int positionToAdd = layoutManager.findFirstCompletelyVisibleItemPosition() + 2;
//在该位置的后面插入新的列表项
sampleRecycleAdapter.addItem(positionToAdd);
}
});
//为顶部的删除面板添加点击事件
mDeleteBar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//获取第一个可视的列表项的位置,再加上2个位置,为了演示方便
int positionToRemove = layoutManager.findFirstCompletelyVisibleItemPosition() + 2;
//删除第一个可视的列表项
sampleRecycleAdapter.removeData(positionToRemove);
//删除完成后隐藏删除面板
hideDeleteBar();
}
});
//为RecyclerView控件设置滚动事件
mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() {
//滚动状态变化事件的方法
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
}
//滚动事件方法(判断上下或者左右滚动)
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
//如果是垂直显示的列表, dy>0 表示向上滚动,否则表示向下滚动
//如果是水平显示的列表,dx > 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_show));
mDeleteBar.setVisibility(View.VISIBLE);
}
/**
* 隐藏删除栏,使用动画效果
*/
private void hideDeleteBar() {
mDeleteBar.startAnimation(AnimationUtils.loadAnimation(this, R.anim.translate_hide));
mDeleteBar.setVisibility(View.GONE);
}
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app ="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.world.hello.recycleview.MainActivity">
<Button
android:id="@+id/delete_btn"
android:layout_width="match_parent"
android:layout_height="40dp"
android:text="删除一项"
android:background="#4400ffee"
android:textSize="14dp"/>
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<android.support.design.widget.FloatingActionButton
android:id="@+id/add_item"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:borderWidth="0dp"
app:rippleColor="#eeff0000"
android:src="@android:drawable/ic_input_add"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_marginRight="33dp"
android:layout_marginEnd="33dp"
android:layout_marginBottom="38dp" />
</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="40dp"
android:gravity="center_vertical"
android:orientation="vertical">
<TextView
android:id="@+id/text_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:textColor="@android:color/black"
android:textSize="16sp" />
</LinearLayout>RecyclerView的使用(Android开发必备,替换掉ListView)
原文:http://blog.csdn.net/oqihaogongyuan/article/details/51548981