Main类
package com.scout.myapplication
;
import android.support.v7.app.AppCompatActivity
;
import android.os.Bundle
;
import android.support.v7.widget.LinearLayoutManager
;
import android.support.v7.widget.RecyclerView
;
import android.view.View
;
import android.widget.Toast
;
import java.util.ArrayList
;
public class MainActivity
extends AppCompatActivity {
RecyclerView
recyclerView;
private RAdapter
mAdapter;
private RecyclerView.LayoutManager
mLayoutManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState)
;
setContentView(R.layout.
activity_main)
;
initData()
;
initView()
;
}
private void initData() {
mLayoutManager =
new LinearLayoutManager(
this, LinearLayoutManager.
VERTICAL, false)
;
mAdapter =
new RAdapter(getData())
;
mAdapter.setOnItemClickListener(
new RAdapter.OnItemClickListener() {
@Override
public void onItemClick(View view
, int position) {
Toast.
makeText(MainActivity.
this,"短按" + position +
" item", Toast.
LENGTH_SHORT).show()
;
}
@Override
public void onItemLongClick(View view
, int position) {
Toast.
makeText(MainActivity.
this,"长按 " + position +
" item", Toast.
LENGTH_SHORT).show()
;
}
})
;
}
private void initView() {
recyclerView = (RecyclerView) findViewById(R.id.
recyclertest)
;
recyclerView.addItemDecoration(
new MyDividerItemDecoration(
this, LinearLayoutManager.
VERTICAL))
;
// 设置布局管理器
recyclerView.setLayoutManager(
mLayoutManager)
;
// 设置adapter
recyclerView.setAdapter(
mAdapter)
;
}
private ArrayList<String>
getData() {
ArrayList<String> data =
new ArrayList<>()
;
String temp =
" item";
for(
int i =
0; i <
20; i++) {
data.add(i + temp)
;
}
return data
;
}
}
分割线:
package com.scout.myapplication
;
import android.content.Context
;
import android.content.res.TypedArray
;
import android.graphics.Canvas
;
import android.graphics.Rect
;
import android.graphics.drawable.Drawable
;
import android.support.v4.view.ViewCompat
;
import android.support.v7.widget.LinearLayoutManager
;
import android.support.v7.widget.RecyclerView
;
import android.view.View
;
/**
* Created by liuguodong on 2017/8/30.
*/
public class MyDividerItemDecoration
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 MyDividerItemDecoration(Context context
, int orientation) {
// 获取默认主题的属性
final TypedArray a = context.obtainStyledAttributes(
ATTRS)
;
mDivider = a.getDrawable(
0)
;
a.recycle()
;
setOrientation(orientation)
;
}
@Override
public void onDraw(Canvas c
, RecyclerView parent
, RecyclerView.State state) {
// 绘制间隔
if (
mOrientation ==
VERTICAL_LIST) {
drawVertical(c
, parent)
;
}
else {
drawHorizontal(c
, parent)
;
}
}
@Override
public void getItemOffsets(Rect outRect
, View view
, RecyclerView parent
, RecyclerView.State state) {
if (
mOrientation ==
VERTICAL_LIST) {
outRect.set(
0, 0, 0, mDivider.getIntrinsicHeight())
;
}
else {
outRect.set(
0, 0, mDivider.getIntrinsicWidth()
, 0)
;
}
}
private void setOrientation(
int orientation) {
if (orientation !=
HORIZONTAL_LIST && orientation !=
VERTICAL_LIST) {
throw new IllegalArgumentException(
"invalid orientation")
;
}
mOrientation = orientation
;
}
/**
* 绘制间隔
*/
private 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 +
Math.
round(ViewCompat.
getTranslationY(child))
;
final int bottom = top +
mDivider.getIntrinsicHeight()
;
mDivider.setBounds(left
, top
, right
, bottom)
;
mDivider.draw(c)
;
}
}
/**
* 绘制间隔
*/
private 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 +
Math.
round(ViewCompat.
getTranslationX(child))
;
final int right = left +
mDivider.getIntrinsicHeight()
;
mDivider.setBounds(left
, top
, right
, bottom)
;
mDivider.draw(c)
;
}
}
}
适配器:
package com.scout.myapplication
;
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
;
/**
* Created by liuguodong on 2017/8/30.
*/
public class RAdapter
extends RecyclerView.Adapter<RAdapter.ViewHolder>{
/**
* 展示数据
*/
private ArrayList<String>
mData;
/**
* 事件回调监听
*/
public OnItemClickListener
onItemClickListener;
public RAdapter(ArrayList<String> data) {
this.
mData = data
;
}
public void updateData(ArrayList<String> data) {
this.
mData = data
;
notifyDataSetChanged()
;
}
/**
* 添加新的Item
*/
public void addNewItem() {
if(
mData ==
null) {
mData =
new ArrayList<>()
;
}
mData.add(
0, "new Item")
;
notifyItemInserted(
0)
;
}
/**
* 删除Item
*/
public void deleteItem() {
if(
mData ==
null ||
mData.isEmpty()) {
return;
}
mData.remove(
0)
;
notifyItemRemoved(
0)
;
}
/**
* 设置回调监听
*
* @param listener
*/
public void setOnItemClickListener(OnItemClickListener listener) {
this.
onItemClickListener = listener
;
}
@Override
public ViewHolder
onCreateViewHolder(ViewGroup parent
, int viewType) {
// 实例化展示的view
View v = LayoutInflater.
from(parent.getContext()).inflate(R.layout.
view_rv_item, parent
, false)
;
// 实例化viewholder
ViewHolder viewHolder =
new ViewHolder(v)
;
return viewHolder
;
}
@Override
public void onBindViewHolder(
final ViewHolder holder
, int position) {
// 绑定数据
holder.
mTv.setText(
mData.get(position))
;
holder.
itemView.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(
final View v) {
if(
onItemClickListener !=
null) {
int pos =
holder.getLayoutPosition()
;
onItemClickListener.onItemClick(
holder.
itemView, pos)
;
}
}
})
;
holder.
itemView.setOnLongClickListener(
new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if(
onItemClickListener !=
null) {
int pos =
holder.getLayoutPosition()
;
onItemClickListener.onItemLongClick(
holder.
itemView, pos)
;
}
//表示此事件已经消费,不会触发单击事件
return true;
}
})
;
}
@Override
public int getItemCount() {
return mData.size()
;
}
public static class ViewHolder
extends RecyclerView.ViewHolder {
TextView
mTv;
public ViewHolder(View itemView) {
super(itemView)
;
mTv = (TextView) itemView.findViewById(R.id.
item_tv)
;
}
}
public interface OnItemClickListener {
void onItemClick(View view
, int position)
;
void onItemLongClick(View view
, int position)
;
}
}
适配器对应的布局 view_rv_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="50dp">
<TextView
android:id="@+id/item_tv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
/>
</LinearLayout>
Main类对应的布局 activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.scout.myapplication.MainActivity">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclertest"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
</FrameLayout>
注意:main类布局不要用最新的约束布局
有问题欢迎及时交流
源码下载地址:http://download.csdn.net/download/liu3364575/9957931