RecyclerView的基本用法

以下内容来自《第一行代码Android》的学习笔记

由于RecyclerView是后来增加的控件,因此需要在build.gradle中引用其对象。

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:25.3.0'
    compile 'com.android.support:recyclerview-v7:25.3.0'
    testCompile 'junit:junit:4.12'
注意 com.android.support:recyclerview-v7:25.3.0一定要与上面的对应.低于 该版本会提示不是最新版本而报错,高于则会报合并错误。

然后定义一个自定义的Item control group 是布局的xml文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <ImageView
        android:id="@+id/fruit_img"
        android:layout_width="100dp"
        android:layout_height="100dp"/>

    <TextView
        android:id="@+id/fruit_txt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />
</LinearLayout>
接下来需要自定义一个填充器。并且注意在填充器中声明了一个静态类。这个 ViewHolder处理自定义的数据。

package Adapter;

import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.*;
import android.widget.*;

import com.example.uiwidgettest.R;

import java.util.*;

import model.Fruit;

/**
 * Created by dypeng on 2017/4/16.
 */

public class FruitAdapter extends RecyclerView.Adapter<FruitAdapter.ViewHolder> {
    List<Fruit> fruitData ;

    /**
     * 构造函数如何使用...............................
     * @param data
     */
    public FruitAdapter(List<Fruit>  data){
        fruitData=data;
    }

    /**
     * 第二步:在生成超类ViewHolder的时候,引用指定的布局,并生成自定义的ViewHolder
     * @param parent
     * @param viewType
     * @return
     */
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.fruit_item, parent, false);
        ViewHolder vh = new ViewHolder(view);
        return vh;
    }

    /**
     * 第三步:当绑定ViewHolder数据的时候,设置自定义ViewHolder的属性值.
     * @param holder
     * @param position
     */
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        Fruit fruit = fruitData.get(position);
        holder.Img.setImageResource(fruit.getImgid());
        holder.fruitName.setText(fruit.getFruitName());
    }

    @Override
    public int getItemCount() {
        return fruitData.size();
    }
    /**
     * 第一步:重新定义一个静态的ViewHolder类,目的是将自定义的控件包括进去,为绑定其数据作准备
     * */
    static class ViewHolder extends RecyclerView.ViewHolder{
        private ImageView Img;
        private TextView fruitName;
        public ViewHolder(View itemView) {
            super(itemView);
            Img=(ImageView)itemView.findViewById(R.id.fruit_img);
            fruitName=(TextView)itemView.findViewById(R.id.fruit_txt);
        }
    }

}

再定义一个活动的布局。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_list"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">
<android.support.v7.widget.RecyclerView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/recyclerView"/>
</LinearLayout>


然后在活动中就可以引用了。

package com.example.uiwidgettest;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;

import java.util.*;

public class ListActivity extends BaseActivity {
    List<model.Fruit> FruitList=new  ArrayList<model.Fruit>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list);
        InitialFruit();
        Adapter.FruitAdapter adapter=new Adapter.FruitAdapter(FruitList);
        RecyclerView rview=(RecyclerView)findViewById(R.id.recyclerView);
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        //layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);横向布局去掉该注释。并且需要在布局文件中作相应的设置。需要把item_layout(细项中的布局)android:orientation="horizontal"换成 android:orientation="vertical"
        rview.setLayoutManager(layoutManager);
        rview.setAdapter(adapter);

    }
    private void InitialFruit(){
        for (int i=0;i<30;i++){
            model.Fruit f1=new  model.Fruit(R.drawable.apple,"苹果");
            model.Fruit f2=new  model.Fruit(R.drawable.orange,"橙");
            model.Fruit f3=new  model.Fruit(R.drawable.pear,"梨");
            FruitList.add(f1);
            FruitList.add(f2);
            FruitList.add(f3);
        }
    }
}

如果需要定义单击事件,是直接在Item的控件中订单事件侦听的。如以下定义一个图片的单击事件。

public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.fruit_item, parent, false);
        final ViewHolder vh = new ViewHolder(view);
        vh.Img.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int position=vh.getAdapterPosition();
                Fruit f=fruitData.get(position);
                Toast.makeText(v.getContext(),f.getFruitName(),Toast.LENGTH_LONG).show();
            }
        });
        return vh;
    }








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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值