RecyclerView的简单使用
RecyclerView是谷歌在高版本提出的一个替代listView和GridView的控件。高度解耦自带了ViewHolder
先看一下效果图 包括RV的水平效果、垂直效果、和网格效果。
以上的效果只需在代码中修改setLayoutManager就可以实现。真是的非常的强大, 集万众宠爱为一身。
下面是RecyclerView的简单使用
activity_mian.xml
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="@string/app_name">
</android.support.v7.widget.RecyclerView>
</LinearLayout>
适配器Myadapter,适配器继承RecyclerView的Adapter,然后根据实际情况需要 顶一个ViewHolder继承RecyclerView下ViewHolder
public class MyAdapter extends RecyclerView.Adapter <MyAdapter.MyViewHolder>{
private List<String> list;
public MyAdapter(List<String> list) {
// TODO Auto-generated constructor stub
this.list = list;
}
class MyViewHolder extends RecyclerView.ViewHolder{
TextView textView;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
textView=(TextView)itemView.findViewById(android.R.id.text1);
}
}
/**
* @param viewGroup
* @param i
* @return
*/
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
// 创建ViewHolder
MyViewHolder holder = new MyViewHolder(View.inflate(viewGroup.getContext(), android.R.layout.simple_list_item_1, null));
return holder;
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder myViewHolder, int i) {
//绑定数据
myViewHolder.textView.setText(list.get(i));
}
@Override
public int getItemCount() {
return list.size();
}
}
主页面调用 MainActivity.
public class MainActivity extends AppCompatActivity {
private RecyclerView rvView;
private List<String> list;
private MyAdapter myAdapter;
/**
* @param savedInstanceState
*/
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
list=new ArrayList<>();
//模拟数据
for (int i=0;i<100;i++){
list.add("条目"+i);
}
rvView = (RecyclerView) findViewById(R.id.rv_view);
//LayoutManager布局摆放管理器(线性摆放、瀑布流)
//rvView.setLayoutManager(new LinearLayoutManager(this));//默认垂直
//reverseLayout:数据倒置,从右边开始滑动
//rvView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, true));//水平
//rvView.setLayoutManager(new GridLayoutManager(this, 3));网格布局
rvView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false));
myAdapter=new MyAdapter(list);
rvView.setAdapter(myAdapter);
}
}
以上就是RecyclerView的简单使用,处理完了之后发现了一个问题 就是RecyclerView 没有默认的setOnClickLinstener,所以又换了一个布局风格并且添加了点击事件
activity_main.xml页面没有改变,新添加了一个流布局的适配器和recycler_item.xml
recycler_item.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">
<TextView
android:id="@+id/tv_text"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
MyStaggeredRecyclerView
public class MyStaggeredRecyclerView extends RecyclerView.Adapter<MyStaggeredRecyclerView.MyViewHolder> {
private List<String> list;
private List<Integer> heights;
private MyStaggeredRecyclerView.onItemClickLinstener onItemClickLinstener;
public MyStaggeredRecyclerView(List<String> list) {
// TODO Auto-generated constructor stub
this.list = list;
heights = new ArrayList<>();
for (int i = 0; i < list.size(); i++) {
heights.add((int)(200+Math.random()*50));
}
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
MyViewHolder holder=new MyViewHolder(View.inflate(viewGroup.getContext(), R.layout.recycler_item, null));
return holder;
}
@Override
public void onBindViewHolder(@NonNull final MyViewHolder myViewHolder, final int i) {
//绑定数据
final ViewGroup.LayoutParams params = myViewHolder.textView.getLayoutParams();
params.height = heights.get(i);
myViewHolder.textView.setBackgroundColor(Color.rgb(100, (int)(Math.random()*255), (int)(Math.random()*255)));
myViewHolder.textView.setLayoutParams(params);
myViewHolder.textView.setText(list.get(i));
if (onItemClickLinstener!=null){
myViewHolder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onItemClickLinstener.itemClick(v,myViewHolder.getLayoutPosition());
}
});
}
}
@Override
public int getItemCount() {
return list.size();
}
class MyViewHolder extends RecyclerView.ViewHolder{
TextView textView;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
textView=(TextView)itemView.findViewById(R.id.tv_text);
}
}
public interface onItemClickLinstener{
void itemClick(View view,int postion);
}
public void setOnItemClickLinstener(onItemClickLinstener linstener){
onItemClickLinstener = linstener;
}
}
MainActivity的主页面也发生了变化
public class MainActivity extends AppCompatActivity {
private RecyclerView rvView;
private List<String> list;
private MyStaggeredRecyclerView staggeredRecyclerView;
/**
* @param savedInstanceState
*/
@Override
protected void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
list=new ArrayList<>();
//模拟数据
for (int i=0;i<100;i++){
list.add("条目"+i);
}
rvView = (RecyclerView) findViewById(R.id.rv_view);
//瀑布流效果
rvView.setLayoutManager(new StaggeredGridLayoutManager(3, LinearLayoutManager.VERTICAL));
staggeredRecyclerView = new MyStaggeredRecyclerView(list);
rvView.setAdapter(staggeredRecyclerView);
staggeredRecyclerView.setOnItemClickLinstener(new MyStaggeredRecyclerView.onItemClickLinstener() {
@Override
public void itemClick(View view, int postion) {
Toast.makeText(MainActivity.this, "postion:" + postion, Toast.LENGTH_SHORT).show();
}
});
}
}
RecyclerView还未添加分割线,在后续会补充上。。。