(这次换了一个,不做微信界面了)
功能说明:通过RecycleView实现一个可下拉的列表,点击对应项会弹出text提示信息。
分析:在使用RecyclerView时候,必须指定一个适配器Adapter和一个布局管理器LayoutManager。当我们去完成一个界面的布局时,我们要向里面传数据,全写在xml文件里显而不合适,这就是Adapter的作用。简而言之,Adapter就是数据与ui之间的桥梁,它把数据与前端UI连接到一起,是一个展示数据的载体。而设置布局管理器RecyclerView则是来控制Item的布局方式,横向、竖向以及瀑布流方式
接下来是源代码环节,前面的和上次做的类型相似,就不多赘述,只说后边的增加内容:
首先是添加一个适配器
package com.example.zy;
import android.content.Context;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
public class HomeAdapter extends RecyclerView.Adapter {
private List<String> mList;
private Context mContext;
public HomeAdapter(Context mContext, List mList) {
this.mContext = mContext;
this.mList = mList;
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(
mContext).inflate(R.layout.tab01_recycle_item,parent,false);
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.
nametv.setText(mList.get(position));
final String content = mList.get(position);
String stickyData =
mList.get(position);
holder.
nametv.setText(stickyData);
if (position == 0) {
holder.
nametv.setVisibility(View.VISIBLE);
holder.
nametv.setText(stickyData);
holder.
itemView.setTag(1);
}
else {
if (!TextUtils.equals(stickyData, mList.get(position - 1))) {
holder.
nametv.setVisibility(View.VISIBLE);
holder.
nametv.setText(stickyData);
holder.
itemView.setTag(2);
}
else {
holder.
nametv.setVisibility(View.GONE);
holder.
itemView.setTag(3);
}
}
holder.
itemView.setContentDescription(stickyData);
holder.
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(
mContext, "你选择了: " + content, Toast.LENGTH_SHORT).show();
}
});
}
@Override
public int getItemCount() {
return mList.size();
}
static class MyViewHolder extends RecyclerView.ViewHolder {
private TextView nametv;
public MyViewHolder(View itemView) {
super(itemView);
nametv = itemView.findViewById(R.id.tab01_header_view);
}
}
}
布局管理器会调用适配器的 onCreateViewHolder() 方法。该方法需要构造一个 RecyclerView.ViewHolder 并设置用于显示其内容的视图。ViewHolder 的类型必须与 Adapter 类签名中声明的类型一致。通常,它会通过扩充 XML 布局文件来设置视图。由于视图持有者尚未分配到任何特定数据,因此该方法实际上不会设置视图的内容。
布局管理器随后会将视图持有者绑定到相应数据。具体操作是调用适配器的 onBindViewHolder() 方法并将视图持有者的位置传入 RecyclerView。onBindViewHolder() 方法需要获取适当的数据,并使用它填充视图持有者的布局。例如,如果 RecyclerView 显示名称列表,该方法可能会在列表中找到适当的名称,并填充视图持有者的 TextView 微件。
如果列表需要更新,请对 RecyclerView.Adapter 对象调用通知方法,例如 notifyItemChanged()。然后,布局管理器会重新绑定任何受影响的视图持有者,使其数据得到更新。
创建RecyclerView的item.xml
当我们创建好RecyclerView时,我们思考,我们现在拥有的不管是一片空白。
我们把RecycleView视为一个大的集装箱,现在大的集装箱需要向里面添加一个个模式固定的小盒子,而小盒子里存放的就是我们的数据。
代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="100dp"
android:layout_margin="8dp"
android:background="@android:color/darker_gray"
android:orientation="vertical">
<TextView
android:id="@+id/item02_num"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
tools:text="1" />
<TextView
android:id="@+id/item02_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
tools:text="内容" />
</LinearLayout>
修改Fragment文件
代码:
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view = inflater.inflate(R.layout.tab02, container, false);
context = view.getContext();
recyclerView = view.findViewById(R.id.tab02_RecyclerView);
initData();
LinearLayoutManager manager = new LinearLayoutManager(context);
manager.setOrientation(LinearLayoutManager.VERTICAL);
verticalAdapter = new VerticalAdapter(mList,context);
recyclerView.setAdapter(verticalAdapter);
recyclerView.setLayoutManager(manager);
return view;
}
private void initData() {
//向list添加数据
mList.add("「及时雨」宋江");
mList.add("「玉麒麟」卢俊义");
mList.add("「智多星」吴用");
mList.add("「入云龙」公孙胜");
mList.add("「神机军师」朱武");
mList.add("「小旋风」柴进");
mList.add("「扑天雕」李应");
mList.add("「大刀」关胜");
mList.add("「豹子头」林冲");
mList.add("「霹雳火」秦明");
mList.add("「双鞭」呼延灼'');
mList.add("「双枪将」董平");
}