实验二:使用recycleview添加消息列表

   日期:2020-11-05     浏览:90    评论:0    
核心提示:使用recycleview添加微信消息列表1. 将支持库添加到 dependencies 部分。2. 将 RecyclerView 添加到布局中2.1 将微信fragment的布局改为recycleView布局2.2 创建显示数据3. 添加适配器4. 实验结果1. 将支持库添加到 dependencies 部分。dependencies { implementation 'com.android.support:recyclerview-v7:28.0.0'}2. 将 RecyclerVi

使用recycleview添加微信消息列表

  • 1. 将支持库添加到 dependencies 部分。
  • 2. 将 RecyclerView 添加到布局中
    • 2.1 将微信fragment的布局改为recycleView布局
    • 2.2 创建显示数据
  • 3. 添加适配器
  • 4. 实验结果

1. 将支持库添加到 dependencies 部分。

dependencies {
    implementation 'com.android.support:recyclerview-v7:28.0.0'
}

2. 将 RecyclerView 添加到布局中

2.1 将微信fragment的布局改为recycleView布局

现在需要将 RecyclerView 添加到上次的微信fragment对应的布局文件中。使用 RecyclerView 作为整个布局的唯一视图:

<?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" xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="vertical">

<!-- <TextView-->
<!-- android:layout_width="match_parent"-->
<!-- android:layout_height="match_parent"-->
<!-- android:gravity="center"-->
<!-- android:text="这是微信聊天界面"-->
<!-- android:textSize="30sp"-->
<!-- android:textStyle="bold"/>-->
    <androidx.recyclerview.widget.RecyclerView android:id="@+id/weixin_recycler_view" android:layout_width="match_parent" app:layout_constraintTop_toTopOf="parent" android:layout_height="wrap_content"/>

</LinearLayout>

在布局中添加了 weixinRecycleViewAdapter 微件之后,需要获取对象句柄,将其连接到布局管理器,并为要显示的数据附加适配器。

代码大致结构如下:

package com.example.myapplication.fragment;

import android.os.Bundle;

import android.app.Fragment;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.example.myapplication.R;
import com.example.myapplication.adapter.weixinRecycleViewAdapter;
import com.example.myapplication.entity.weixin;

import java.util.ArrayList;


public class weixinFragment extends Fragment { 
    private View view;
    private RecyclerView recyclerView;
    private RecyclerView.Adapter mAdapter;
    private RecyclerView.LayoutManager layoutManager;

    public weixinFragment() { 
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) { 
        // Inflate the layout for this fragment
        view=inflater.inflate(R.layout.table01, container, false);
        initRecyclerView();
        return view;
    }

    private void initRecyclerView() { 
        recyclerView = (RecyclerView) view.findViewById(R.id.weixin_recycler_view);
        recyclerView.setHasFixedSize(true);
        layoutManager = new LinearLayoutManager(getActivity());
        recyclerView.setLayoutManager(layoutManager);

        // specify an adapter (see also next example)
        ArrayList<weixin> weixinList = new ArrayList<>();
        for (int i = 0; i < 20; i++) { 
            weixin weixin = new weixin(
                    "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1604377714766&di=047992da111aa3829771424516bd6cdd&imgtype=0&src=http%3A%2F%2Fpic.51yuansu.com%2Fpic3%2Fcover%2F02%2F42%2F32%2F59ba3c2b4d7da_610.jpg",
                    "小明",
                    "8:00",
                    "这是一条消息"
            );
            weixinList.add(weixin);
        }

        mAdapter = new weixinRecycleViewAdapter(weixinList,getActivity());
        recyclerView.setAdapter(mAdapter);
    }
}

2.2 创建显示数据

我们要显示的数据应该如下:

这里有四个部分,头像,名称,最后一条消息,最后一次回复时间
我们先对其进行布局,代码和效果如下

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="wrap_content" android:id="@+id/weixin_item" xmlns:app="http://schemas.android.com/apk/res-auto">
    <!--头像-->
    <com.google.android.material.imageview.ShapeableImageView android:id="@+id/weixin_avatar" android:layout_marginTop="2dp" android:layout_marginBottom="2dp" android:layout_width="50dp" android:layout_height="50dp" android:layout_marginStart="20dp" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:shapeAppearanceOverlay="@style/roundedCornerStyle" android:layout_marginLeft="20dp" />
    <!--名称-->
    <TextView android:id="@+id/weixin_name" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="center_vertical" android:layout_marginStart="20dp" android:layout_marginTop="5dp" android:gravity="center" android:text="receiver name" app:layout_constraintStart_toEndOf="@+id/weixin_avatar" app:layout_constraintTop_toTopOf="parent" android:layout_marginLeft="20dp" />
    <!--最后的聊天内容-->
    <TextView android:id="@+id/weixin_content" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="center_vertical" android:layout_marginStart="20dp" android:layout_marginBottom="5dp" android:gravity="center" android:text="news content" app:layout_constraintStart_toEndOf="@+id/weixin_avatar" app:layout_constraintBottom_toBottomOf="parent" android:layout_marginLeft="20dp" />
    <!--最后的通信时间-->
    <TextView android:id="@+id/weixin_time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="time" android:visibility="visible" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintTop_toTopOf="parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

创建一个对应的实体类weixin

package com.example.myapplication.entity;

import java.util.Date;

public class weixin { 
    // 头像链接
    public String avatar;
    //姓名
    private String name;
    // 最后通信时间
    private String lastTime;
    //最后通信内容
    private String Content;

    public weixin(String avatar, String name, String lastTime, String content) { 
        this.avatar = avatar;
        this.name = name;
        this.lastTime = lastTime;
        Content = content;
    }

    public String getAvatar() { 
        return avatar;
    }

    public void setAvatar(String avatar) { 
        this.avatar = avatar;
    }

    public String getName() { 
        return name;
    }

    public void setName(String name) { 
        this.name = name;
    }

    public String getLastTime() { 
        return lastTime;
    }

    public void setLastTime(String lastTime) { 
        this.lastTime = lastTime;
    }

    public String getContent() { 
        return Content;
    }

    public void setContent(String content) { 
        Content = content;
    }
}

然后我们就可以创建数据对象,将其传入适配器

        ArrayList<weixin> weixinList = new ArrayList<>();
        for (int i = 0; i < 20; i++) { 
            weixin weixin = new weixin(
                    "https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1604377714766&di=047992da111aa3829771424516bd6cdd&imgtype=0&src=http%3A%2F%2Fpic.51yuansu.com%2Fpic3%2Fcover%2F02%2F42%2F32%2F59ba3c2b4d7da_610.jpg",
                    "小明",
                    "8:00",
                    "这是一条消息"
            );
            weixinList.add(weixin);
        }
        mAdapter = new weixinRecycleViewAdapter(weixinList,getActivity());

3. 添加适配器

要将所有数据输入列表中,必须扩展 RecyclerView.Adapter 类。此对象会创建项的视图,并在原始项不再可见时用新数据项替换部分视图的内容。
这里将weixinList的数据传入,然后替换视图中的内容

package com.example.myapplication.adapter;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.bumptech.glide.Glide;
import com.example.myapplication.R;
import com.example.myapplication.entity.weixin;

import java.util.List;

public class weixinRecycleViewAdapter extends RecyclerView.Adapter<weixinRecycleViewAdapter.MyViewHolder> { 
        private List<weixin> wexinList;
        private Context context;

        // 为每个数据项提供对视图的引用
        // 复杂的数据项每个项可能需要多个View,可以提供对ViewHolder中某个数据项的所有View的访问
        public static class MyViewHolder extends RecyclerView.ViewHolder{ 
                TextView weixinName;
                TextView weixinLastTime;
                TextView weixinContent;
                ImageView weixinAvatar;

                public MyViewHolder(View itemView) { 
                        super(itemView);
                        weixinName = itemView.findViewById(R.id.weixin_name);
                        weixinLastTime = itemView.findViewById(R.id.weixin_time);
                        weixinContent = itemView.findViewById(R.id.weixin_content);
                        weixinAvatar = itemView.findViewById(R.id.weixin_avatar);
                }
        }

        //提供合适的构造函数(取决于数据集的类型)
        public weixinRecycleViewAdapter(List<weixin> weixinList,Context context) { 
                this.wexinList=weixinList;
                this.context = context;
        }

        //创建新视图(由布局管理器调用)
        @Override
        public weixinRecycleViewAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent,
                                                                        int viewType) { 
                // 创建一个新view
                View v = LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.tb01viewtext, parent, false);
                return new MyViewHolder(v);
        }

        // 替换视图的内容(由布局管理器调用)
        @Override
        public void onBindViewHolder(MyViewHolder holder, int position) { 
                // 从此位置的数据集中获取元素
                // 用该元素替换视图的内容
                weixin weixin = this.wexinList.get(position);
                holder.weixinName.setText(weixin.getName());
                holder.weixinLastTime.setText(weixin.getLastTime());
                holder.weixinContent.setText(weixin.getContent());
                Glide.with(context)
                        .load(weixin.getAvatar())//加载图片链接
                        .into(holder.weixinAvatar);//将图片放进imageText
        }

        // 返回数据集的大小(由布局管理器调用)
        @Override
        public int getItemCount() { 
                return this.wexinList.size();
        }
}

这里对于图片的加载用了外部依赖,对于Glide的具体解释可以看上面代码注解

dependencies {
    implementation 'com.google.android.material:material:1.2.1'
    implementation 'com.github.bumptech.glide:glide:4.11.0'
    }

另外,在加载图片时,要使用网络,所以要授予通网权限
可以在manifests中

添加

<uses-permission android:name="android.permission.INTERNET" />

最后写完适配器,传入weixinList的数据创建适配器,给recycleViews设置适配器

        weixinRCAdapter = new weixinRecycleViewAdapter(weixinList,getActivity());
        recyclerView.setAdapter(weixinRCAdapter);

4. 实验结果

附上代码仓库地址:
https://gitee.com/hu_hong_tao/android-development-experiment
运行界面如下:

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服