Android RecyclerView 学习笔记

RecyclerView是什么?

一个用于大量数据展示的新控件RecylerView,可以用来代替传统的ListView,更加强大和灵活。可以实现横向滚动(ListView做不到)和瀑布流控件。

使用RecyclerView编写一个聊天界面

  1. 在app/build.gradle中添加依赖(RecyclerView在AndroidX包里)
    在这里插入图片描述
//实现RecyclerView要添加依赖
    implementation 'androidx.recyclerview:recyclerview:1.0.0'

在这里插入图片描述

2.编写主界面activity_chat.xml中的代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    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"
    android:background="#d8e0e8"
    android:orientation="vertical"
    tools:context=".ChatActivity">

    <androidx.appcompat.widget.Toolbar
        android:id="@+id/tool_bar_setting"
        xmlns:app="http //schemas android com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="@color/purple_200"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
        tools:ignore="MissingConstraints"></androidx.appcompat.widget.Toolbar>
    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/msg_recycler_view"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">
    </androidx.recyclerview.widget.RecyclerView>
    <LinearLayout
        android:layout_below="@id/tool_bar_setting"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        >
        <EditText
            android:id="@+id/inputText"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:hint="Type something here"
            android:maxLines="2"
            ></EditText>
        <Button
            android:id="@+id/send"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAllCaps="false"
            android:text="send"></Button>
<!--        android:textAllCaps="false"  使button的默认大写变小写-->
    </LinearLayout>

</LinearLayout>

界面效果图:
在这里插入图片描述

  1. 定义消息的实体类,新建Msg
package com.example.networktest;

public class Msg {

    static final int TYPE_RECEIVED = 0;//表示一条收到的消息
    static final int TYPE_SEND = 1;//表示一条发出的消息

    private String content;//表示消息内容
    private int type;//表示消息的类型

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public int getType() {
        return type;
    }

    public void setType(int type) {
        this.type = type;
    }


    public Msg(String content, int type) {
        this.content = content;
        this.type = type;
    }



}

  1. 编写RecyclerView子项的布局,新建msg_item.xml
<?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="wrap_content"
    android:orientation="vertical"
    android:padding="10dp">

    <LinearLayout
        android:id="@+id/left_layout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="left"
        android:background="@drawable/po_left">

        <TextView
            android:id="@+id/left_msg"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_margin="10dp"
            android:textColor="#fff"></TextView>
    </LinearLayout>

    <LinearLayout
        android:id="@+id/right_layout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="right"
        android:layout_margin="10dp"
        android:background="@drawable/po_right"
        android:orientation="horizontal"
        tools:ignore="RtlHardcoded">

        <TextView
            android:id="@+id/right_msg"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:layout_margin="10dp"></TextView>
    </LinearLayout>


</LinearLayout>

界面效果图:
在这里插入图片描述

  1. 创建RecyclerView的适配器类,新建类MsgAdapter
package com.example.networktest;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;

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

import java.util.List;

public class MsgAdapter extends RecyclerView.Adapter<MsgAdapter.ViewHolder> {

    private List<Msg> mMsgList;

    static class ViewHolder extends RecyclerView.ViewHolder {

        LinearLayout leftLayout;//做边子项布局

        LinearLayout rightLayout;//右边子项布局

        TextView leftMsg;//左边消息(接收)

        TextView rightMSg;//右边消息(发送)

        //绑定item控件 
        public ViewHolder(View view) {

            super(view);

            leftLayout = view.findViewById(R.id.left_layout);

            rightLayout = view.findViewById(R.id.right_layout);

            leftMsg = view.findViewById(R.id.left_msg);

            rightMSg = view.findViewById(R.id.right_msg);

        }
    }

    //绑定 数据
    public MsgAdapter(List<Msg> msgList) {

        mMsgList = msgList;
    }

    //绑定 显示页面
    // onCreateViewHolder 用于创建一个ViewHolder实例
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.msg_item, parent, false);
        return new ViewHolder(view);
    }


    //对消息类型的判断
    //onBindViewHolder 用于对RecyclerView子项的数据进行赋值的
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {

        //获得 当前的Msg实例
        Msg msg = mMsgList.get(position);

        //如果是 收到的消息,则显示左边的消息布局,将右边的消息布局隐藏
        if (msg.getType() == Msg.TYPE_RECEIVED) {

            holder.leftLayout.setVisibility(View.VISIBLE);

            holder.rightLayout.setVisibility(View.GONE);

            //消息内容
            holder.leftMsg.setText(msg.getContent());

        } else if (msg.getType() == Msg.TYPE_SEND) {
            //如果是 发出的消息,则显示右边的消息布局,将左边的消息布局隐藏
            holder.rightLayout.setVisibility(View.VISIBLE);

            holder.leftLayout.setVisibility(View.GONE);

            //消息内容
            holder.rightMSg.setText(msg.getContent());
        }


    }

    //获取 RecyclerView一共有多少子项
    @Override
    public int getItemCount() {
        return mMsgList.size();
    }
}

  1. 编写ChatActivity.java,为RecyclerView初始化数据,并给发送按钮加入事件响应
package com.example.networktest;

import androidx.appcompat.app.AppCompatActivity;

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

import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;

public class ChatActivity extends AppCompatActivity {

    private Toolbar tool_bar_setting;

    private List<Msg> msgList = new ArrayList<>();
    private EditText inputText;//文本输入框
    private Button send;//发送按钮
    private RecyclerView msgRecyclerView;
    private MsgAdapter mAdapter;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_chat);
        init();
        initMsgs();
        listen();
    }

    private void init() {
        //绑定 Toolbar
        tool_bar_setting = findViewById(R.id.tool_bar_setting);

        //得到toolBar实例
        setSupportActionBar(tool_bar_setting);

        //显示 tool_bar左侧按钮
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);


//            setSupportActionBar(toolbar);参数报错
//            Android Studio 自动导包错误
//            import android.widget.Toolbar;
//            将上面的代码替换成下面的
//            import androidx.appcompat.widget.Toolbar;

        inputText = findViewById(R.id.inputText);

        send = findViewById(R.id.send);

        msgRecyclerView = findViewById(R.id.msg_recycler_view);

        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);

        msgRecyclerView.setLayoutManager(linearLayoutManager);

        //给适配器绑定数据
        mAdapter = new MsgAdapter(msgList);

        //给RecyclerView控件绑定适配器
        msgRecyclerView.setAdapter(mAdapter);

    }

    private void listen() {

        send.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                String content = inputText.getText().toString();

                //发送内容不为空时
                if (!"".equals(content)) {

                    //将数据传入实体类
                    Msg msg = new Msg(content, Msg.TYPE_SEND);

                    msgList.add(msg);

                    //有新消息时刷新msgRecyclerView
                    mAdapter.notifyItemInserted(msgList.size() - 1);
                    
                    //将 RecyclerView 定位到最后一行,以保证可以看到最后发出的一条消息
                    msgRecyclerView.scrollToPosition(msgList.size()-1);

                    //发送完 清空输入框中的内容
                    inputText.setText("");
                }
            }
        });
    }

    //初始化几条 接收到的消息(毕竟是个没有联网的聊天界面)
    private void initMsgs() {

        Msg msg1 = new Msg("hello guy.", Msg.TYPE_RECEIVED);

        msgList.add(msg1);

        Msg msg2 = new Msg("hello. Who is that ?", Msg.TYPE_SEND);

        msgList.add(msg2);

        Msg msg3 = new Msg("This is Tom.Nice talking to you.", Msg.TYPE_RECEIVED);

        msgList.add(msg3);


    }

    //加载 toorlbar.xml这个菜单文件
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.tool_bar_setting, menu);
        return true;
    }

    //处理多个按钮的点击事件
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                Intent intent = new Intent(ChatActivity.this, MainActivity.class);
                startActivity(intent);
                finish();
                break;
            case R.id.love_setting:
                Toast.makeText(this, "you clicked love", Toast.LENGTH_SHORT).show();
                break;
        }
        return true;
    }
}

真机运行效果图:
请添加图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Android Studio是Google推出的Android应用程序开发工具,它集成了开发、调试、打包等功能。要学习使用Android Studio,需要了解以下几个方面的知识: 1. Java基础: Android开发是基于Java语言的,所以要学习Android Studio首先要掌握Java基础知识。 2. Android基础: 了解Android操作系统的基本构架和常用组件,如Activity、Service、BroadcastReceiver等。 3. Android Studio使用: 了解Android Studio的基本界面和常用功能,如创建工程、编写代码、调试程序等。 4. Android SDK: 了解Android SDK的安装和配置,以及如何使用SDK Manager来下载SDK并配置项目。 5. 练习实践: 多练习实际项目,熟悉Android Studio的使用,并不断练习和完善自己的技能。 ### 回答2: Android Studio 是一个为 Android 来开发的整体开发环境。它基于 IntelliJ IDEA ,强调速度和智能操作,并致力于为应用程序开发提供高效率的开发工具。Android Studio 的推出,使得 Android 开发者更加容易地创建高质量的应用程序。 首先,要学 Android Studio ,你需要首先了解一些基本知识。学习 Android Studio 的工具包括 Gradle 、 Kotlin 和 Java 等。通过学习这些基础知识,你可以了解不同的语言、工具和框架。 在学习 Android Studio 时要使用实战性的方法。也就是说,每次学习新的东西时,你需要找到一个相关的例子。这样可以帮助你更好地理解它。如果你使用 Android Studio 模板,这将非常有用。这些模板可以帮助你创建常见的应用程序结构,并且你可以基于这些模板创建自己的应用程序。 另外,还有很多不同的工具和插件可以帮助你学习 Android Studio 。例如, Android Studio 网站上有很多有用的文章和教程,可以帮助你更好地理解 Android Studio 。还有很多在线工具可以帮助你实现特定的功能,在初学者阶段,这些工具可以为学习的难度减轻很多。 总之,学习 Android Studio 任重而道远。需要有耐心和时间,还需要不断地尝试和实践。在这个过程中,你可以尝试教学资料、交流学习合作、进一步增强你的知识水平。通过不断的应用和实践,一定可以成为一名优秀的 Android 开发者并圆满地完成应用开发。 ### 回答3: 作为一个应用开发者,学习使用安卓应用程序开发套件非常重要。Android Studio是Google出品的最新安卓开发工具,它具有多种强大的工具和功能,可以极大地提高应用程序的开发效率和质量。在学习过程中,个人对Android Studio的理解主要体现在以下几个方面。 首先,要开始使用Android Studio,需要了解它的基本结构和工具。Android Studio主要由三个主要组件组成:IDE、SDK、和Emulator。IDE是开发者使用的主要工具。它提供了编写、测试和调试代码所需的所有基本功能,包括视觉化设计器,代码编辑器和调试工具。SDK是开发应用程序所需的软件开发包。它包括实用程序和库,可用于在应用程序中实现预定功能。Emulator是一个虚拟的安卓设备,可以用来在开发应用程序时模拟真实设备上的应用程序运行情况。 其次,一些基本的编程知识也必不可少,例如Java编程、XML语言、UI界面设计等。Java是Android Studio中最常用的编程语言,用于编写应用程序的逻辑代码;XML语言则用于设计UI界面。在学习这些基本知识时,建议首先了解Java语言特性和面向对象编程理念,熟悉它们的基本语法和数据类型。同时,也可以通过在线教程和网课等方式加强对UI设计和布局的理解。 最后,学会使用网上的资源和社区的帮助非常重要。Android Studio的开发者社区很大,有很多在线资源可以帮助开发者的开发学习,例如stack overflow、CSDN社区等。同时,Google官方的开发者网站也提供了大量的文档资料、教程、API使用说明等。 总之,Android Studio的学习需要进行持续不断的针对不同方面的学习和实践。要充分运用Android Studio的强大功能,建议在掌握基础知识的基础上,多做实际的项目练习,不断提高自己的技术水平和代码能力,才能成为一名优秀的安卓应用程序开发者。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值