周末看了Recylerview的使用,RecyclerView在android标准的sdk中并没有收录,如果使用的话需要导入. 这个包,这个view当中包含了一个ViewHolder相当于listview的升级版本,它所解决的问题就是itemview的复用,它并不关心怎样去显示。这其实是完全脱耦合的一种架构思想,布局的显示方式可以通过 **(LayoutManager)**来设置,备选的方案有很多,可以设置横向listview、纵向listview、以及横纵向的gridview方式,甚至支持瀑布流的方式显示。但是这个控件本身并没有分割线,需要开发者自己去手动添加 **(dividerItemDecoration)**这个即是添加分割线。**( new DefaultItemAnimator())**这个是添加默认动画的。可以看到这个控件除了提供一个viewHolder之外什么都没有,需要什么你就自己去添加什么。下面就贴代码了:
activity_simple_recycler.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="/apk/res/android"
xmlns:tools="/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="">
<.
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</RelativeLayout>
layout_item.xml
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="2dp">
<TextView
android:id="@+id/item_tv"
android:gravity="center"
android:background="@drawable/item_bg"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textSize0sp"
/>
</FrameLayout>
这里写代码片
import ;
import .;
import ;
import .;
import .;
import .;
import .;
import ;
import ;
import ;
import ;
import ;
import ;
public class SimpleRecyclerActivity extends ActionBarActivity {
RecyclerView recyclerView;
LinearLayoutManager horizontalManager;
LinearLayoutManager vercitalManager;
GridLayoutManager verticalGridManager;
GridLayoutManager horiziontalGridManager;
DividerItemDecoration dividerItemDecoration;
SimpleItemAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(.activity_simple_recycler);
init();
}
private void init(){
recyclerView = (RecyclerView) findViewById();
horizontalManager = new LinearLayoutManager(SimpleRecyclerActivity.this,,false);
vercitalManager = new LinearLayoutManager(SimpleRecyclerActivity.this,,false);
verticalGridManager = new GridLayoutManager(SimpleRecyclerActivity.this,3,,false);
horiziontalGridManager = new GridLayoutManager(SimpleRecyclerActivity.this,5,,false);
List<String> datas = new ArrayList<String>();
for (int i = 0; i < 200; i++){
(i+"");
}
adapter = new SimpleItemAdapter(SimpleRecyclerActivity.this,datas);
(new () {
@Override
public void onItemClick(View view, int position) {
(SimpleRecyclerActivity.this,"onclick: "+position,Toast.LENGTH_SHORT).show();
}
@Override
public void onItemLongClick(View view, int position) {
(SimpleRecyclerActivity.this,"onlongclick: "+position,Toast.LENGTH_SHORT).show();
}
});
(adapter);
( new DefaultItemAnimator());
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(.options_menu,menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
return setSelectItemLayout(item);
}
private boolean setSelectItemLayout(MenuItem item){
switch (()){
case .action_add:
("one");
return true;
case .action_delete:
();
return true;
case .action_horizontal:
(horizontalManager);
return true;
case .action_verictal:
(vercitalManager);
return true;
case .action_grid_hor:
(horiziontalGridManager);
return true;
case .action_grid_ver:
(verticalGridManager);
return true;
case .action_stroggle:
Intent intent = new Intent(this,);
startActivity(intent);
return true;
default:
return false;
}
}
}
SimpleItemAdapter
package ;
import ;
import .;
import ;
import ;
import ;
import ;
import ;
/**
* Created by mhyuam on 2016/7/16.
*/
public class SimpleItemAdapter extends <> {
private List<String> datas;
private LayoutInflater inflater;
private Context context;
private OnItemClickListener itemClickListener;
public SimpleItemAdapter(Context context, List list) {
datas = list;
this.context = context;
inflater = LayoutInflater.from(context);
}
public void setOnItemClickListener(OnItemClickListener itemClickListener){
this.itemClickListener = itemClickListener;
}
@Override
public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = (.layout_item,parent,false);
MyHolder holder = new MyHolder(view);
return holder;
}
@Override
public void onBindViewHolder(final MyHolder holder, int position) {
(datas.get(position).toString());
if (itemClickListener != null){
(new () {
@Override
public void onClick(View v) {
int pos = ();
(,pos);
}
});
(new () {
@Override
public boolean onLongClick(View v) {
int pos = ();
(,pos);
return false;
}
});
}
}
public void addItem(String string){
(1,string);
notifyItemInserted(1);
notifyItemRemoved(1);
}
@Override
public int get }
public void deleteItem(){
(1);
ItemCount() {
return ();
}
public interface OnItemClickListener {
public void onItemClick(View view,int position);
public void onItemLongClick(View view,int position);
}
public static class MyHolder extends {
TextView textView;
public MyHolder(ViewetemView) {
super(itemView);
textView = xtV ew) (.item_tv);
}
}
}
DividerItemDe中复该属性,以达到定制分割线的目的,定制时同时注意放置style的values-xx,如果没有和该版本对应得values,默认是从上往下取值
package ;
/*
* Copyright (C) 2014 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* /licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import ;
import ;
import ;
import ;
import ;
import .;
import .;
import ;
import ;
/**
* This class is from the v7 samples of the Android SDK. It's not by me!
* <p/>
* See the license above for details.
*/
public class DividerItemDecoration extends RecyclerView.ItemDecoration
{
private static final int[] ATTRS = new int[] { };
public static final int HORIZONTAL_LIST = ;
public static final int VERTICAL_LIST = ;
private Drawable mDivider;
private int mOrientation;
public DividerItemDecoration(Context context, int orientation)
{
final TypedArray a = (ATTRS);
mDivider = (0);
();
setOrientation(orientation);
}
public void setOrientation(int orientation)
{
if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST)
{
throw new IllegalArgumentException("invalid orientation");
}
mOrientation = orientation;
}
@Override
public void onDraw(Canvas c, RecyclerView parent)
{
//("recyclerview - itemdecoration", "onDraw()");
if (mOrientation == VERTICAL_LIST) {
drawVertical(c, parent);
} else {
drawHorizontal(c, parent);
}
}
public void drawVertical(Canvas c, RecyclerView parent)
{
final int left = ();
final int right = () - ();
final int childCount = ();
for (int i = 0; i < childCount; i++)
{
final View child = (i);
RecyclerView v = new RecyclerView(
());
final params = () child
.getLayoutParams();
final int top = () + ;
final int bottom = top + ();
(left, top, right, bottom);
(c);
}
}
public void drawHorizontal(Canvas c, RecyclerView parent)
{
final int top = ();
final int bottom = () - ();
final int childCount = ();
for (int i = 0; i < childCount; i++)
{
final View child = (i);
final params = () child
.getLayoutParams();
final int left = () + ;
final int right = left + ();
mDivi`
(leftSright, bottom);
(c);
}
}
@Override
public void getItemOffsets(Rect outRect, int itemPosition,
RecyclerView parent)
{
`
if (mOrieT)
{
(0, 0, 0, ());
} else
{
(0, 0, (), 0);
}
}
}
下面是瀑布流的实现
package ;
import .;
import ;
import .;
import .;
import .;
import ;
import ;
import ;
import ;
public class WaterfallActivity extends ActionBarActivity {
RecyclerView recyclerView;
DividerItemDecoration dividerItemDecoration;//分割线
StaggeredGridLayoutManager staggeredGridLayoutManager;
WaterfallAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(.activity_simple_recycler);
init();
}
private void init(){
recyclerView = (RecyclerView) findViewById();
List<String> datas = new ArrayList<String>();
for (int i = 0; i < 200; i++){
(i+"");
}
adapter = new WaterfallAdapter(WaterfallActivity.this,datas);
(new () {
@Override
public void onItemClick(View view, int position) {
(WaterfallActivity.this,"onclick: "+position,Toast.LENGTH_SHORT).show();
}
@Override
public void onItemLongClick(View view, int position) {
(WaterfallActivity.this,"onlongclick: "+position,Toast.LENGTH_SHORT).show();
}
});
dividerItemDecoration = new DividerItemDecoration(WaterfallActivity.this,);
staggeredGridLayoutManager = new StaggeredGridLayoutManager(3,);
(adapter);
(staggeredGridLayoutManager);
/**
* 设置分割线,分割线的样式有决定,
* 可以在style中复写该属性,以达到定制分割线的目的
* 定制时同时注意放置style的values-xx,如果没有和该版本对应得values,默认是从上往下取值
*/
(dividerItemDecoration);
/**
* 设置item变动时的动画
*/
( new DefaultItemAnimator());
}
}
package ;
import ;
import ;
import .;
import ;
import ;
import ;
import ;
import ;
import ;
/**
* Created by mhyuam on 2016/7/16.
*/
public class WaterfallAdapter extends <> {
private List<String> datas;
private LayoutInflater inflater;
private Context context;
private OnItemClickListener itemClickListener;
private List<Integer> height;
public WaterfallAdapter(Context context, List list) {
datas = list;
this.context = context;
inflater = LayoutInflater.from(context);
height = new ArrayList<Integer>();
for (int i = 0; i < ();i++){
((int)( 200 + ()*200));
}
}
public void setOnItemClickListener(OnItemClickListener itemClickListener){
this.itemClickListener = itemClickListener;
}
@Override
public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = (.layout_item,parent,false);
MyHolder holder = new MyHolder(view);
return holder;
}
@Override
public void onBindViewHolder(final MyHolder holder, int position) {
(datas.get(position).toString());
lp = ();
= height.get(position);
(lp);
if (itemClickListener != null){
(new () {
@Override
public void onClick(View v) {
/**
* pos取值时需要注意,由于在add和delete item时会引起位置信息的变动
* 这里一定要动态去获取当前item在整个布局中的位置
*/
int pos = ();
(,pos);
}
});
(new () {
@Override
public boolean onLongClick(View v) {
int pos = ();
(,pos);
return false;
}
});
}
}
@Override
public int getItemCount() {
return ();
}
public interface OnItemClickListener {
public void onItemClick(View view,int position);
public void onItemLongClick(View view,int position);
}
public static class MyHolder extends {
TextView textView;
public MyHolder(View itemView) {
super(itemView);
textView = (TextView) (.item_tv);
}
}
}