两年没怎么做项目,基本忘的差不多了,打算这两天重新学学基础,唉,苦逼ing
目标效果:
activity_main.xml页面:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<android.support.v7.widget.RecyclerView
android:id="@+id/rvShow"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v7.widget.RecyclerView>
</RelativeLayout>
list_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="50dp">
<TextView
android:id="@+id/tvItem"
android:text="hello"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
MyAdapter.java页面:
package com.example.one;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
import java.util.ArrayList;
/**
* 用来将数据适配到RecyclerView中
*/
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder>{
private ArrayList<String> mData; //存储要显示的数据
Context context; //识别Activity
/*构造方法,初始化*/
public MyAdapter(Context context,ArrayList<String> mData) {
this.context=context; //从Activity中传过来的当前是哪个Activity和要显示的数据
this.mData = mData;
}
@NonNull
@Override
/*RecyclerView一开始调用一遍,把每一项都初始一遍 */
public ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
View v= LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.list_item,viewGroup,false); //实例化展示的View
final ViewHolder viewHolder=new ViewHolder(v) ; //实例化ViewHolder
v.setOnClickListener(new View.OnClickListener() { //每一行的点击事件
@Override
public void onClick(View v) {
Toast.makeText(context,"你好"+viewHolder.tvItem.getText().toString(),Toast.LENGTH_LONG).show();
}
});
return viewHolder; //返回一个ViewHolder
}
@Override
/*RecyclerView滑动时调用*/
public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {
viewHolder.tvItem.setText(mData.get(i)); //绑定数据
}
@Override
/*返回总条数*/
public int getItemCount() {
return mData.size();
}
/*为了提高运行效率,一般自定义类ViewHolder来减少findViewById的使用(指滑动过程中不断的初始化控件)*/
class ViewHolder extends RecyclerView.ViewHolder{
TextView tvItem;
public ViewHolder(View itemView){
super(itemView);
tvItem=(TextView) itemView.findViewById(R.id.tvItem);
}
}
}
MainActivity.java页面:
package com.example.one;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
private RecyclerView mRecyclerView;
private RecyclerView.Adapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
initView();
}
/*初始化数据*/
private void initData() {
mLayoutManager=new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false); //设置布局管理器
mAdapter=new MyAdapter(MainActivity.this,getData()); //设置Adapter
}
/*获取数据*/
private ArrayList<String> getData() {
ArrayList<String> data=new ArrayList<>();
String temp="item";
for(int i=0;i<20;i++){
data.add(i+temp);
}
return data;
}
/*初始化视图*/
private void initView() {
mRecyclerView=(RecyclerView)findViewById(R.id.rvShow);
mRecyclerView.setLayoutManager(mLayoutManager); //设置布局管理器
mRecyclerView.setAdapter(mAdapter); //设置Adapter
}
}
时间长了对这些控件概念比较模糊了,而且RecyclerView作为一个新的控件(不知道什么时候出来的,但是以前没用过)更是有点不理解,这里比较一下RecyclerView和传统ListView的区别:
1.在滚动视图中一般都会使用ViewHolder来保存视图,使每次滑动不必再重复调用findViewById,提高效率,但是在ListView中需要自己写,即可以使用也可以不使用,而在RecyclerView中直接调用RecyclerView.ViewHolder,这就使ViewHolder的使用变成了必须;
2.ListView的样式比较单一,只能垂直方向滚动,而RecyclerView可以对样式进行了扩展;