9、RecyclerView
由于RecyclerView属于新增控件,所以
在app/build.gradle中添加如下代码:
dependencies {
compile fileTree(dir:
'libs'
, include: [
'*.jar'
])
testCompile
'junit:junit:4.12'
compile
'com.android.support:appcompat-v7:24.2.1'
compile
'com.android.support:recyclerview-v7:24.2.1'
}
MainActivity.xml
<?
xml version=
"1.0"
encoding=
"utf-8"
?>
<
LinearLayout
xmlns:
android
=
"http://schemas.android.com/apk/res/android"
android
:layout_width=
"match_parent"
android
:layout_height=
"match_parent"
>
<
android.support.v7.widget.RecyclerView
android
:id=
"@+id/recycler_view"
android
:layout_width=
"match_parent"
android
:layout_height=
"match_parent"
/>
</
LinearLayout
>
FruitItem.xml
<?
xml version=
"1.0"
encoding=
"utf-8"
?>
<
LinearLayout
xmlns:
android
=
"http://schemas.android.com/apk/res/android"
android
:orientation=
"vertical"
android
:layout_width=
"100dp"
android
:layout_height=
"wrap_content"
android
:layout_margin=
"5dp"
>
<
ImageView
android
:id=
"@+id/fruit_image"
android
:layout_width=
"wrap_content"
android
:layout_height=
"wrap_content"
android
:layout_gravity=
"center_horizontal"
/>
<
TextView
android
:id=
"@+id/fruit_name"
android
:layout_width=
"wrap_content"
android
:layout_height=
"wrap_content"
android
:layout_gravity=
"left"
android
:layout_marginTop=
"10dp"
/>
</
LinearLayout
>
MainActivity.java
package
com.example.recyclerviewtest;
import
android.support.v7.app.AppCompatActivity;
import
android.os.Bundle;
import
android.support.v7.widget.LinearLayoutManager;
import
android.support.v7.widget.RecyclerView;
import
android.support.v7.widget.StaggeredGridLayoutManager;
import
java.util.ArrayList;
import
java.util.List;
import
java.util.Random;
public class
MainActivity
extends
AppCompatActivity {
private
List<Fruit>
fruitList
=
new
ArrayList<Fruit>();
@Override
protected void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.
activity_main
);
initFruits();
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.
recycler_view
);
//这里的3 表示 3行或者3列布局, StaggeredGridLayoutManager 参数表示滚动方向
StaggeredGridLayoutManager layoutManager =
new
StaggeredGridLayoutManager(
3
, StaggeredGridLayoutManager.
VERTICAL
);
recyclerView.setLayoutManager(layoutManager);
FruitAdapter adapter =
new
FruitAdapter(
fruitList
);
recyclerView.setAdapter(adapter);
}
private void
initFruits() {
for
(
int
i =
0
; i <
2
; i++) {
Fruit apple =
new
Fruit(getRandomLengthName(
"Apple"
), R.drawable.
apple_pic
);
fruitList
.add(apple);
Fruit banana =
new
Fruit(getRandomLengthName(
"Banana"
), R.drawable.
banana_pic
);
fruitList
.add(banana);
Fruit orange =
new
Fruit(getRandomLengthName(
"Orange"
), R.drawable.
orange_pic
);
fruitList
.add(orange);
Fruit watermelon =
new
Fruit(getRandomLengthName(
"Watermelon"
), R.drawable.
watermelon_pic
);
fruitList
.add(watermelon);
Fruit pear =
new
Fruit(getRandomLengthName(
"Pear"
), R.drawable.
pear_pic
);
fruitList
.add(pear);
Fruit grape =
new
Fruit(getRandomLengthName(
"Grape"
), R.drawable.
grape_pic
);
fruitList
.add(grape);
Fruit pineapple =
new
Fruit(getRandomLengthName(
"Pineapple"
), R.drawable.
pineapple_pic
);
fruitList
.add(pineapple);
Fruit strawberry =
new
Fruit(getRandomLengthName(
"Strawberry"
), R.drawable.
strawberry_pic
);
fruitList
.add(strawberry);
Fruit cherry =
new
Fruit(getRandomLengthName(
"Cherry"
), R.drawable.
cherry_pic
);
fruitList
.add(cherry);
Fruit mango =
new
Fruit(getRandomLengthName(
"Mango"
), R.drawable.
mango_pic
);
fruitList
.add(mango);
}
}
private
String getRandomLengthName(String name) {
Random random =
new
Random();
int
length = random.nextInt(
5
) +
1
;
StringBuilder builder =
new
StringBuilder();
for
(
int
i =
0
; i < length; i++) {
builder.append(name);
}
return
builder.toString();
}
}
FruitAdapter.java
package
com.example.recyclerviewtest;
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
android.widget.Toast;
import
java.util.List;
public class
FruitAdapter
extends
RecyclerView.Adapter<FruitAdapter.ViewHolder>{
private
List<Fruit>
mFruitList
;
static class
ViewHolder
extends
RecyclerView.ViewHolder {
View
fruitView
;
ImageView
fruitImage
;
TextView
fruitName
;
public
ViewHolder(View view) {
super
(view);
fruitView
= view;
fruitImage
= (ImageView) view.findViewById(R.id.
fruit_image
);
fruitName
= (TextView) view.findViewById(R.id.
fruit_name
);
}
}
//用于加载数据源到本地
public
FruitAdapter(List<Fruit> fruitList) {
mFruitList
= fruitList;
}
@Override
//用于创建ViewHolder实例,我的理解是所谓holder。 其实就是一个个小布局
public
ViewHolder onCreateViewHolder(ViewGroup parent,
int
viewType) {
View view = LayoutInflater.
from
(parent.getContext()).inflate(R.layout.
fruit_item
, parent,
false
);
final
ViewHolder holder =
new
ViewHolder(view);
holder.
fruitView
.setOnClickListener(
new
View.OnClickListener() {
@Override
public void
onClick(View v) {
int
position =
holder
.getAdapterPosition();
Fruit fruit =
mFruitList
.get(position);
Toast.
makeText
(v.getContext(),
"you clicked view "
+ fruit.getName(), Toast.
LENGTH_SHORT
).show();
}
});
holder.
fruitImage
.setOnClickListener(
new
View.OnClickListener() {
@Override
public void
onClick(View v) {
int
position =
holder
.getAdapterPosition();
Fruit fruit =
mFruitList
.get(position);
Toast.
makeText
(v.getContext(),
"you clicked image "
+ fruit.getName(), Toast.
LENGTH_SHORT
).show();
}
});
return
holder;
}
@Override
//这个方法是对RecyclerView 的每一个小的子项进行赋值的。
//会在每个子项滚动到屏幕中的时候执行
public void
onBindViewHolder(ViewHolder holder,
int
position) {
Fruit fruit =
mFruitList
.get(position);
holder.
fruitImage
.setImageResource(fruit.getImageId());
holder.
fruitName
.setText(fruit.getName());
}
@Override
//用于告诉RecyclerView 一共有多少个子项。很简单
public int
getItemCount() {
return
mFruitList
.size();
}
}
Fruit.java
package
com.example.recyclerviewtest;
public class
Fruit {
private
String
name
;
private int
imageId
;
public
Fruit(String name,
int
imageId) {
this
.
name
= name;
this
.
imageId
= imageId;
}
public
String getName() {
return
name
;
}
public int
getImageId() {
return
imageId
;
}
}