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;
    }








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章