以下内容来自《第一行代码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;
}