软酷Android高级控件,Android 高级控件-RecyclerView

RecylerView是Android5.0推出的新控件,相较于ListView和GridView,RecylerView有以下几个特点:

1.不关心Item是否显示在正确的位置上,如何显示。利用LayoutManager来控制RecylerView的显示风格

2.不关心Item之间如何分割。 利用ItemDecoration来设置分割线的效果

3.不关心Item增加与删除的动画效果。利用ItemAnimator来控制动画效果

4.仅仅关注如何回收和复用View。

在RecyLerView中,强制我们使用ViewHolder的模式,这一点要记得。

1.建立布局文件

(1). 建立每个Item的布局

android:layout_width="match_parent"

android:background="#44ff"

android:layout_margin="3dp"

android:layout_height="match_parent">

android:id="@+id/id_textView"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:gravity="center"

/>

(2). 建立主布局

xmlns:tools="http://schemas.android.com/tools"

android:id="@+id/activity_main"

android:layout_width="match_parent"

android:layout_height="match_parent"

tools:context="com.example.android_recylerview.MainActivity">

android:id="@+id/id_recylerView"

android:layout_width="match_parent"

android:layout_height="match_parent"/>

2.实现RecylerView的Adapter

package com.example.android_recylerview;

import android.content.Context;

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.List;

/**

* Created by 前世诀别的一纸书 on 2017/2/23.

*/

public class MyAdapter extends RecyclerView.Adapter {

private LayoutInflater mInflater = null;

private List mDatas = null;

public MyAdapter(Context context, List datas)

{

this.mDatas = datas;

this.mInflater = LayoutInflater.from(context);

}

//创建ViewHolder

@Override

public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

View view = mInflater.inflate(R.layout.item_layout, parent, false);

MyViewHolder viewHolder = new MyViewHolder(view);

return viewHolder;

}

//绑定ViewHolder

@Override

public void onBindViewHolder(MyViewHolder holder, int position) {

holder.mTextView.setText(mDatas.get(position));

}

@Override

public int getItemCount() {

return mDatas.size();

}

class MyViewHolder extends RecyclerView.ViewHolder

{

public TextView mTextView = null;

public MyViewHolder(View itemView) {

super(itemView);

mTextView = (TextView) itemView.findViewById(R.id.id_textView);

}

}

}

4.在MainActivity中使用RecylerView

//设置布局管理

LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL, false); // LinearLayout的布局

GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 4); // GridView的布局

StaggeredGridLayoutManager gridLayoutManager1 = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.HORIZONTAL); // 水平的GridView的布局

mRecylerView.setLayoutManager(gridLayoutManager1);

//设置分割线

//mRecylerView.addItemDecoration(new DividerItemDecoration(this, DividerItemDecoration.VERTICAL_LIST));

5.将GridView变为瀑布流

以下的代码是在eclipse上实现的,我没在Android studio 上实现成功。。。。

android:layout_width="match_parent"

android:layout_height="72dp"

android:background="#44ff"

android:layout_margin="3dp"

android:orientation="vertical" >

android:id="@+id/id_textView"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:gravity="center"

/>

同时Myadapter上里面定义一个List类型的数组,用来存储每个Item的高度,而初始化List数组是利用随机数来初始化的.

for(int i = 0; i < mDatas.size(); i++)

{

mHeights.add((int) (100 + Math.random() * 400));

}

初始化成功后,在onBindVIewHolder中使用

//绑定ViewHolder

@Override

public void onBindViewHolder(MyViewHolder holder, int position) {

ViewGroup.LayoutParams layoutParams = holder.mTextView.getLayoutParams();

layoutParams.height = mHeights.get(position);

holder.mTextView.setLayoutParams(layoutParams);

holder.mTextView.setText(mDatas.get(position));

}

6.增加和删除Item的功能

在menu文件下,增加几个Item,将这几个Item加在ActionBar上面。

android:id="@+id/action_add"

android:orderInCategory="100"

android:showAsAction="ifRoom"

android:icon="@drawable/ic_menu_add"

android:title="Add"/>

android:id="@+id/action_delete"

android:orderInCategory="100"

android:showAsAction="ifRoom"

android:icon="@drawable/ic_menu_delete"

android:title="Delete"/>

7.为RecylerView添加动画

这个动画是系统给我们的,是系统实现的。

mRecylerView.setItemAnimator(new DefaultItemAnimator());

8.为Item增加点击事件

由于RecylerView没有为内部的Item实现点击事件,因此我们需要自己来完成点击事件的监听

思路:在Adapter内部定义一个接口,供外部来使用,同时在Adapter内部为每一个Item实现点击事件,事件调用接口里面的方法。

public interface OnItemClickListener

{

void OnItemClick(View view, int pos);

void OnItemLongClick(View view, int pos);

}

private OnItemClickListener mItemOnClickListener = null;

public void setOnItemClickListener(OnItemClickListener itemOnClickener)

{

this.mItemOnClickListener = itemOnClickener;

}

在onBindViewHolder方法里面定义每一个接口的监听事件

@Override

public void onBindViewHolder(final MyViewHolder arg0, final int arg1) {

arg0.mTextView.setText(mDatas.get(arg1));

if(mItemOnClickListener != null)

{

arg0.itemView.setOnClickListener(new OnClickListener(){

@Override

public void onClick(View v) {

int oldPosition = arg0.getPosition();

mItemOnClickListener.OnItemClick(arg0.itemView, oldPosition);

}

});

arg0.itemView.setOnLongClickListener(new OnLongClickListener() {

@Override

public boolean onLongClick(View v) {

int oldPosition = arg0.getPosition();

mItemOnClickListener.OnItemLongClick(arg0.itemView, arg1);

return false;

}

});

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值