安卓5.0新控件-----RecyclerView

RecyclerView
安卓5.0之后的控件

可以做出listview和gridview的效果,但自定义方法会不如listview灵活

这个控件没有监听,和分割线,都需要自定义,代码内有注释说明

主界面代码

package my.qq.com.day0714android5;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;

import java.util.ArrayList;
import java.util.List;

public class RecyclerViewActivity extends AppCompatActivity {
    private RecyclerView recyclerView;
    List<RecyclerViewitem> data=new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_recycler_view);
        recyclerView= (RecyclerView) findViewById(R.id.recyclerview);
        //设置控件类型  下面这三行呈现的是listview的效果
        LinearLayoutManager linearLayoutManager=new LinearLayoutManager(this);
        linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        recyclerView.setLayoutManager(linearLayoutManager);

        //给每个item添加分割线
        recyclerView.addItemDecoration(new ItemDivider());
        //设置控件类型  下面这两行呈现的是Gridview的效果  3是列数
//        GridLayoutManager gridLayoutManager=new GridLayoutManager(this,3);
//        recyclerView.setLayoutManager(gridLayoutManager);

        initdata();
        RecyclerViewAdapter recyclerViewAdapter=new RecyclerViewAdapter(this,data);
        recyclerView.setAdapter(recyclerViewAdapter);
        //给listview添加监听
        recyclerViewAdapter.setItemClickListener(new RecyclerViewAdapter.OnRecyclerViewItemClickListener() {
            @Override
            public void OnItemClickListener(View view, int position) {
                Log.i("aaa","点击的item是"+position);
            }
        });

    }

    private void initdata() {
        for (int i=1;i<20;i++){
            data.add(new RecyclerViewitem(R.mipmap.ic_launcher,"标题"+i));
        }
    }
}

适配器:

package my.qq.com.day0714android5;

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.ImageView;
import android.widget.TextView;

import java.util.List;

/**
 * Created by czw on 2016/7/14  11:42.
 */
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.RecyclerViewHolder> implements View.OnClickListener{
    private Context context;
    private List<RecyclerViewitem> list;

    public RecyclerViewAdapter(Context context, List<RecyclerViewitem> list) {
        this.context = context;
        this.list = list;
    }

    /**
     * 下面是给RecyclerView定义监听******************************************************
     *
     */
    //1.
    private OnRecyclerViewItemClickListener listener;//接口实例
    public void setItemClickListener(OnRecyclerViewItemClickListener listener){
        this.listener=listener;
    }

    //定义一个接口  ,因为swiperefresh包下的那个类也用了这个接口,所以要用public修饰
    public interface OnRecyclerViewItemClickListener{
        void OnItemClickListener(View view,int position);
    }

    @Override
    public void onClick(View view) {
        if (listener!=null){
            //(int)view.getTag()这个就是点击item的位置
            listener.OnItemClickListener(view,(int)view.getTag());
        }
    }

    //**********************************************************************

    @Override
    public RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view=LayoutInflater.from(context).inflate(R.layout.recycler_item,null);
        //****************************设置监听   2.
        view.setOnClickListener(this);
        RecyclerViewHolder recyclerViewHolder=new RecyclerViewHolder(view);
        return recyclerViewHolder;
    }

    @Override
    public void onBindViewHolder(RecyclerViewHolder holder, int position) {
        RecyclerViewitem recyclerViewitem=list.get(position);
        holder.iv.setImageResource(recyclerViewitem.getResid());
        holder.tv.setText(recyclerViewitem.getTitle());
        //3.设置tag,把位置传过去
        holder.itemView.setTag(position);
    }

    @Override
    public int getItemCount() {
        return list.size();
    }

    class RecyclerViewHolder extends RecyclerView.ViewHolder{
        private ImageView iv;
        private TextView tv;

        public RecyclerViewHolder(View itemView) {
            super(itemView);
            iv= (ImageView) itemView.findViewById(R.id.recycler_item_img);
            tv= (TextView) itemView.findViewById(R.id.recycler_item_tv);
        }
    }
}

item类代码:

package my.qq.com.day0714android5;

/**
 * Created by czw on 2016/7/14  11:38.
 */
public class RecyclerViewitem  {
    private int resid;
    private String title;

    public RecyclerViewitem(int resid, String title) {
        this.resid = resid;
        this.title = title;
    }

    public int getResid() {
        return resid;
    }

    public void setResid(int resid) {
        this.resid = resid;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }
}

给每个item之间添加分割线的类:

package my.qq.com.day0714android5;

import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.support.v7.widget.RecyclerView;
import android.view.View;

/**
 * Created by czw on 2016/7/14  14:39.
 * 这个类是给每个item之间画一条分割线
 */
public class ItemDivider extends RecyclerView.ItemDecoration {
    Paint paint;//画笔

    //在绘制每个item之前执行的方法
    @Override
    public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
        //super.onDraw(c, parent, state);
        //如果布局里有Padding的话可以用这个
//        int left=parent.getPaddingLeft();
//        int right=parent.getWidth()-parent.getPaddingRight();

        //开始画的X轴和Y轴起点
        int left=0;
        int right=parent.getWidth();
        //item个数
        int itemcount=parent.getChildCount();
        if (paint==null){
        paint=new Paint();
            paint.setColor(Color.RED);
        }
        if (itemcount>0){
            for (int i=0;i<itemcount;i++){
                //得到每个item
                View itemview=parent.getChildAt(i);
                //Y轴开始和结束位置都是item的高度,itemview.getBottom()
                c.drawLine(left,itemview.getBottom(),right,itemview.getBottom(),paint);
            }
        }
    }

    //在绘制每个item之后执行的方法
    @Override
    public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
        super.onDrawOver(c, parent, state);
    }

    //设置偏移量
    @Override
    public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
        //super.getItemOffsets(outRect, view, parent, state);
        outRect.contains(0,0,0,0);
    }
}

下面是布局文件代码

主界面布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="my.qq.com.day0714android5.RecyclerViewActivity">
    <android.support.v7.widget.RecyclerView
        android:id="@+id/recyclerview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></android.support.v7.widget.RecyclerView>

</RelativeLayout>

item布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ImageView
        android:id="@+id/recycler_item_img"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@mipmap/ic_launcher"/>
    <TextView
        android:id="@+id/recycler_item_tv"
        android:layout_toRightOf="@id/recycler_item_img"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#00ff00"
        android:layout_alignBottom="@id/recycler_item_img"
        android:layout_alignTop="@id/recycler_item_img"
        android:text="000"/>
    <!-- android:layout_alignBottom="@id/recycler_item_img"
        android:layout_alignTop="@id/recycler_item_img"
        加这两项是为了让textview充满item,这样就不会出现只有点文字和图片时才会触发监听的情况-->

</RelativeLayout>

分割线被每个item的背景色给挡住了,加背景色是为了看一下文字和图片有没有充满整个item


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值