安卓 实现Recyclerview(新手笔记-8)

我这里是在碎片里面实现了一个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);
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值