我这里是在碎片里面实现了一个RecyclerView,所以可能在一些上下文方面的可能存在区别,自己注意分辨。
首先创建一个装在Recyclerview的布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>
然后我们需要把Recyclerview中的每一项进行设计布局(因为单项也是一种布局格式),下面代码代表每一项里面有两个TextView显示在两边:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/username_item"
android:text="username"
android:paddingLeft="10dp"
android:gravity="center_vertical|center"
android:layout_width="wrap_content"
android:layout_height="50dp" />
<TextView
android:id="@+id/password_item"
android:layout_width="match_parent"
android:layout_height="50dp"
android:layout_marginRight="10dp"
android:text="password"
android:gravity="right|center_vertical" />
</LinearLayout>
接着设计一个实体类来对应每一项中的布局(因为需要一个类来承接布局的样式),而且也是一整个数据列表的基础项:
public class RecyclerViewListItem {
private String username;
private String password;
public RecyclerViewListItem(String username, String password){
this.username = username;
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
实现适配器:
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> {
//context 上下文
//itemList 所有数据所储存的数组(列表)
//resources 资源类型(通过它可以getDrawable()getLayout()等等)
//infalter 引用布局
private Context context;
List<RecyclerViewListItem> itemList;
private Resources resources;
private LayoutInflater inflater;
//构造方法,初始化一个Adapter,并把需要的数据传进来
public RecyclerViewAdapter(Context context, List<RecyclerViewListItem> itemList){
this.context = context;
this.itemList = itemList;
this.resources = context.getResources();
this.inflater = LayoutInflater.from(context);
}
//使用一个ViewHolder来作为承载View的类,这样可以将View与RecyclerView分离开。
public static class ViewHolder extends RecyclerView.ViewHolder{
public TextView username;
public TextView password;
public ViewHolder(View itemView) {
super(itemView);
username = itemView.findViewById(R.id.username_item);
password = itemView.findViewById(R.id.password_item);
}
}
//创建一个ViewHolder的过程
@Override
public RecyclerViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = inflater.inflate(R.layout.recyclerview_item_list,parent,false);
ViewHolder holder = new ViewHolder(view);
return holder;
}
//绑定一个ViewHolder的过程
@Override
public void onBindViewHolder(RecyclerViewAdapter.ViewHolder holder, final int position) {
final RecyclerViewListItem recyclerViewListItem = itemList.get(position);
holder.username.setText(recyclerViewListItem.getUsername());
holder.password.setText(recyclerViewListItem.getPassword());
//设置tag
holder.itemView.setTag(position);
//设置点击事件
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
monItemClickListener.onClick(position);
}
});
holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
monItemClickListener.onLongClick(position);
return false;
}
});
}
//获取recyclerview的长度(也就是数量)
@Override
public int getItemCount() {
return itemList.size();
}
//自己重构一种点击事件,将其设置为接口模式。
public interface OnItemClickListener{
void onClick(int position);
void onLongClick(int position);
}
//实现该接口
private OnItemClickListener monItemClickListener;
//面向activity的一个接口,通过这个来获得在activity使用的ClickListener
public void setOnItemClickListener(OnItemClickListener onItemClickListener){
this.monItemClickListener = onItemClickListener;
}
}
在Fragment中实现Recyclerview:
public class FirstFragment extends Fragment {
private RecyclerView recyclerView;
private List<RecyclerViewListItem> viewData = new ArrayList<RecyclerViewListItem>();
View view;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
//避免同一activity下 多个fragment 切换时重复执行onCreateView方法
// Fragment之间切换时每次都会调用onCreateView方法,导致每次Fragment的布局都重绘,无法保持Fragment原有状态。
if (view == null) {
view = inflater.inflate(R.layout.first_fragment, container, false);
} else {
ViewGroup parent = (ViewGroup) view.getParent();
if (null != parent) {
parent.removeView(view);
}
}
//添加数据的函数(这里的数据就随意添加了)
initData();
recyclerView = view.findViewById(R.id.recyclerView);
//添加布局管理(这里有多重布局,实现效果也不同,比如Gridlayout)
LinearLayoutManager layoutManager = new LinearLayoutManager(view.getContext());
recyclerView.setLayoutManager(layoutManager);
//添加recyclerview的适配器
RecyclerViewAdapter scenAdapter = new RecyclerViewAdapter(view.getContext(), viewData);
recyclerView.setAdapter(scenAdapter);
//设置监听事件
scenAdapter.setOnItemClickListener(new RecyclerViewAdapter.OnItemClickListener() {
@Override
public void onClick(int position) {
Toast.makeText(view.getContext(),"on click line " + position,Toast.LENGTH_SHORT).show();
}
@Override
public void onLongClick(int position) {
Toast.makeText(view.getContext(),"on long click line " + position,Toast.LENGTH_SHORT).show();
}
});
return view;
}
private void initData() {
viewData.add(new RecyclerViewListItem("happy","123456"));
viewData.add(new RecyclerViewListItem("sad","156816"));
viewData.add(new RecyclerViewListItem("anger","555555"));
viewData.add(new RecyclerViewListItem("excite","789498"));
viewData.add(new RecyclerViewListItem("diss","151965"));
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
}