类微信界面 02 -RecyclerView

2024-01-01 22:50

本文主要是介绍类微信界面 02 -RecyclerView,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、功能说明

10-9

编辑功能
psLxi.png

删除功能
psD8L.jpg

查看详情页
ps4DC.jpg

2、核心代码

xml部分

item.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"android:id="@+id/linearLayout_item1"android:layout_width="match_parent"android:layout_height="80dp"android:background="@drawable/underline_list"android:orientation="horizontal"><ImageViewandroid:id="@+id/imageView_item1"android:layout_width="72dp"android:layout_height="53dp"android:layout_gravity="center"app:srcCompat="@drawable/ic___wx_this" /><TextViewandroid:id="@+id/textView_item1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_margin="5dp"android:text="编号"android:textSize="16dp" /><TextViewandroid:id="@+id/textView_item2"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_margin="5dp"android:text="内容"android:textSize="16dp" /></LinearLayout>

tab02.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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:background="@color/hui"android:layout_height="match_parent"android:orientation="horizontal"><androidx.recyclerview.widget.RecyclerViewandroid:id="@+id/recyclerView1"android:layout_width="match_parent"android:layout_height="match_parent"android:overScrollMode="never"android:scrollbars="none"android:visibility="visible"/><com.google.android.material.floatingactionbutton.FloatingActionButtonandroid:id="@+id/fab"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentEnd="true"android:layout_alignParentBottom="true"android:layout_gravity="end|bottom"android:layout_marginStart="16dp"android:layout_marginTop="16dp"android:layout_marginEnd="36dp"android:layout_marginBottom="41dp"android:contentDescription="add"android:src="@drawable/ic_action_name" /><androidx.constraintlayout.widget.ConstraintLayoutandroid:id="@+id/constraintlayout_none"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_alignParentStart="true"android:layout_alignParentTop="true"android:layout_alignParentEnd="true"android:layout_alignParentBottom="true"android:layout_marginStart="2dp"android:layout_marginTop="48dp"android:layout_marginEnd="-2dp"android:layout_marginBottom="461dp"android:background="@color/hui"android:visibility="gone"><EditTextandroid:id="@+id/text_add"android:layout_width="294dp"android:layout_height="58dp"android:layout_marginTop="4dp"android:ems="10"android:hint="请输入..."android:imeOptions="actionNext"android:inputType="text"android:minHeight="48dp"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" /><Buttonandroid:id="@+id/button_cl"android:layout_width="117dp"android:layout_height="wrap_content"android:layout_marginTop="36dp"android:text="取消"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toStartOf="@+id/button_ok"app:layout_constraintHorizontal_bias="0.444"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toBottomOf="@+id/text_add"app:layout_constraintVertical_bias="0.0" /><Buttonandroid:id="@+id/button_ok"android:layout_width="137dp"android:layout_height="48dp"android:layout_marginTop="36dp"android:layout_marginEnd="32dp"android:text="确认"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintTop_toBottomOf="@+id/text_add"app:layout_constraintVertical_bias="0.0" /></androidx.constraintlayout.widget.ConstraintLayout></RelativeLayout>

输入框开始是隐藏状态

Java部分

onBindViewHolder中设置3个组件内容

        holder.textView1.setText("" + position);//转字符串holder.textView2.setText(list.get(position));holder.imageView_item1.setImageResource(addimg(position));

onBindViewHolder中的监听

holder.linearLayout_item1.setOnTouchListener(new View.OnTouchListener() {private int X;private int lastX;private int Y;@SuppressLint("ResourceAsColor")@Overridepublic boolean onTouch(View view, MotionEvent event) {switch (event.getAction() & MotionEvent.ACTION_MASK) {case MotionEvent.ACTION_DOWN://当屏幕检测到第一个触点按下之后就会触发到这个事件。lastX = (int) event.getRawX();Y = (int) event.getRawY();X = (int) event.getRawX();break;case MotionEvent.ACTION_UP://当触点松开时被触发。if (Math.abs((int) event.getRawX() - X)<2){//单击,点击坐标没发生变化Intent intent = new Intent(holder.itemView.getContext(), MainActivity2.class);intent.putExtra("msg","position:"+position+"\n"+list.get(position));context.startActivity(intent);}if(Math.abs(((int) event.getRawX() - X))<200){holder.linearLayout_item1.setLeft(0);}else{onSwiped(position);holder.linearLayout_item1.setLeft(0);}break;case MotionEvent.ACTION_MOVE:int dx = (int) event.getRawX() - lastX;int left = view.getLeft() + dx;holder.linearLayout_item1.setLeft(left);lastX = (int) event.getRawX();break;}return true;}});

MotionEvent的几种触发的事件,目前存在bug.竖直滚动与左右滑动的判断
拖动还是点击的判断:根据触摸与抬起的坐标差在一定范围

删除数据

//  删除数据@SuppressLint("NotifyDataSetChanged")public void onSwiped(int p) {list.remove(p);notifyItemRemoved(p);notifyDataSetChanged();}

Fragment.java中Viewinit()函数

private void Viewinit() {context = this.getActivity();//fullview=getView();myadapter = new Adapter(context);//设置LayoutManagerLinearLayoutManager linearLayoutManager = new LinearLayoutManager(context);linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);recyclerView.setLayoutManager(linearLayoutManager);recyclerView.setHasFixedSize(true);recyclerView.setAdapter(myadapter);myadapter.list(list);}

列表的添加

@SuppressLint("NotifyDataSetChanged")@Overridepublic void onStart() {super.onStart();fab=getActivity().findViewById(R.id.fab);ConstraintLayout constraintlayout_none=getActivity().findViewById(R.id.constraintlayout_none);EditText text_add=getActivity().findViewById(R.id.text_add);Button button_cl=getActivity().findViewById(R.id.button_cl);Button button_ok=getActivity().findViewById(R.id.button_ok);InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);   ;fab.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {constraintlayout_none.setVisibility(View.VISIBLE);recyclerView.setVisibility(View.INVISIBLE);imm.showSoftInput(text_add, 0);text_add.setText("");button_ok.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {String s=text_add.getText().toString();constraintlayout_none.setVisibility(View.GONE);list.add(s);Log.d("add","+1");imm.hideSoftInputFromWindow(text_add.getWindowToken(), 0);myadapter.notifyDataSetChanged();recyclerView.scrollToPosition(myadapter.getItemCount() - 1);Toast.makeText(context, "添加成功", Toast.LENGTH_SHORT).show();recyclerView.setVisibility(View.VISIBLE);}});button_cl.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {constraintlayout_none.setVisibility(View.GONE);Toast.makeText(context, "取消添加", Toast.LENGTH_SHORT).show();recyclerView.setVisibility(View.VISIBLE);imm.hideSoftInputFromWindow(text_add.getWindowToken(), 0);}});//list.add("111111");//Log.d("add",list.toString());}});}

思路是点击添加按钮后显示输入的layout,隐藏Reclyview,打开键盘

  • 如果点击确认则获取输入的值添加到列表,刷新reclyview,隐藏输入layout,软键盘,显示Reclyview

  • 如果点击取消直接还原视图(即隐藏输入layout,显示Reclyview…)

完整代码


Adapter.java

package com.example.applicationtest;import android.annotation.SuppressLint;
import android.content.Context;
import android.content.Intent;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;public class Adapter extends RecyclerView.Adapter<Adapter.Myholder> {private View itemview;private Context context;private List<String> list;public int addimg(int i) {if (i % 4 == 0) {return R.drawable.num_a;} else if (i % 4 - 1 == 0) {return R.drawable.num_b;} else if (i % 4 - 2 == 0) {return R.drawable.num_c;} else if (i % 4 - 3 == 0) {return R.drawable.num_d;} else {return R.drawable.ic___fx;}}public Adapter(Context context) {this.context = context;}public void list(List<String> list) {this.list = list;notifyDataSetChanged();}@NonNull@Overridepublic Myholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {itemview = LayoutInflater.from(context).inflate(R.layout.item1, parent, false);Myholder holder;holder = new Myholder(itemview);return holder;}@SuppressLint({"SetTextI18n", "ClickableViewAccessibility"})@Overridepublic void onBindViewHolder(@NonNull Myholder holder, @SuppressLint("RecyclerView") int position) {holder.textView1.setText("" + position);//转字符串holder.textView2.setText(list.get(position));holder.imageView_item1.setImageResource(addimg(position));
//        holder.linearLayout_item1.setOnClickListener(new View.OnClickListener() {
//            @Override
//            public void onClick(View view) {
//                //Toast.makeText(itemview.getContext(), position + "号:" + list.get(position), Toast.LENGTH_SHORT).show();
//                Intent intent = new Intent(holder.itemView.getContext(), MainActivity2.class);
//                intent.putExtra("msg","position:"+position+"\n"+list.get(position));
//                context.startActivity(intent);
//                //onSwiped(position);
//            }
//        });holder.linearLayout_item1.setOnTouchListener(new View.OnTouchListener() {private int X;private int lastX;private int Y;@SuppressLint("ResourceAsColor")@Overridepublic boolean onTouch(View view, MotionEvent event) {switch (event.getAction() & MotionEvent.ACTION_MASK) {case MotionEvent.ACTION_DOWN://当屏幕检测到第一个触点按下之后就会触发到这个事件。lastX = (int) event.getRawX();Y = (int) event.getRawY();X = (int) event.getRawX();break;case MotionEvent.ACTION_UP://当触点松开时被触发。if (Math.abs((int) event.getRawX() - X)<2){//单击,点击坐标没发生变化Intent intent = new Intent(holder.itemView.getContext(), MainActivity2.class);intent.putExtra("msg","position:"+position+"\n"+list.get(position));context.startActivity(intent);}if(Math.abs(((int) event.getRawX() - X))<200){holder.linearLayout_item1.setLeft(0);}else{onSwiped(position);holder.linearLayout_item1.setLeft(0);}break;case MotionEvent.ACTION_MOVE:int dx = (int) event.getRawX() - lastX;int left = view.getLeft() + dx;holder.linearLayout_item1.setLeft(left);lastX = (int) event.getRawX();break;}return true;}});}//  删除数据@SuppressLint("NotifyDataSetChanged")public void onSwiped(int p) {list.remove(p);notifyItemRemoved(p);notifyDataSetChanged();}@Overridepublic int getItemCount() {return list.size();}public static class Myholder extends RecyclerView.ViewHolder {private TextView textView1, textView2;private ImageView imageView_item1;private LinearLayout linearLayout_item1;public Myholder(@NonNull View itemView) {super(itemView);textView1 = itemView.findViewById(R.id.textView_item1);textView2 = itemView.findViewById(R.id.textView_item2);imageView_item1 = itemView.findViewById(R.id.imageView_item1);linearLayout_item1 = itemView.findViewById(R.id.linearLayout_item1);}}}

Fragment2.java

package com.example.applicationtest;import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.text.InputType;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;import com.google.android.material.floatingactionbutton.FloatingActionButton;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;import javax.security.auth.PrivateCredentialPermission;public class Fragment2 extends Fragment {private RecyclerView recyclerView;private Context context;private FloatingActionButton fab;private Adapter myadapter;private List<String> list = new ArrayList<>();@Overridepublic View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {// Inflate the layout for this fragmentView view;view = inflater.inflate(R.layout.tab02, container, false);recyclerView = view.findViewById(R.id.recyclerView1);listdata();Viewinit();return view;}@SuppressLint("NotifyDataSetChanged")@Overridepublic void onStart() {super.onStart();fab=getActivity().findViewById(R.id.fab);ConstraintLayout constraintlayout_none=getActivity().findViewById(R.id.constraintlayout_none);EditText text_add=getActivity().findViewById(R.id.text_add);Button button_cl=getActivity().findViewById(R.id.button_cl);Button button_ok=getActivity().findViewById(R.id.button_ok);InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);   ;fab.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {constraintlayout_none.setVisibility(View.VISIBLE);recyclerView.setVisibility(View.INVISIBLE);imm.showSoftInput(text_add, 0);text_add.setText("");button_ok.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {String s=text_add.getText().toString();constraintlayout_none.setVisibility(View.GONE);list.add(s);Log.d("add","+1");imm.hideSoftInputFromWindow(text_add.getWindowToken(), 0);myadapter.notifyDataSetChanged();recyclerView.scrollToPosition(myadapter.getItemCount() - 1);Toast.makeText(context, "添加成功", Toast.LENGTH_SHORT).show();recyclerView.setVisibility(View.VISIBLE);}});button_cl.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {constraintlayout_none.setVisibility(View.GONE);Toast.makeText(context, "取消添加", Toast.LENGTH_SHORT).show();recyclerView.setVisibility(View.VISIBLE);imm.hideSoftInputFromWindow(text_add.getWindowToken(), 0);}});//list.add("111111");//Log.d("add",list.toString());}});}private void Viewinit() {context = this.getActivity();//fullview=getView();myadapter = new Adapter(context);//设置LayoutManagerLinearLayoutManager linearLayoutManager = new LinearLayoutManager(context);linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);recyclerView.setLayoutManager(linearLayoutManager);recyclerView.setHasFixedSize(true);recyclerView.setAdapter(myadapter);myadapter.list(list);}private void listdata() {list.add("明媚的阳光和明媚的少女······是不是很相衬呢?");list.add("别动哦,借你的眼睛照照镜子。是不是觉得很怀念?");list.add("我的眼睛漂亮吗?这可不是美瞳哦,是美少女的魔法。");...}}

3、实验小结

  • 继承于RecyclerView.ViewHolder,编写自己的ViewHolder

  • 实现onCreateViewHolder(ViewGroup parent, int viewType)
    当RecyclerView需要我们提供类型为viewType的新ViewHolder时,会回调这个方法。实例化出了Item的根布局,并返回一个和它绑定的ViewHolder

  • 实现onBindViewHolder(VH viewHolder, int position)
    当RecyclerView需要展示对应position位置的数据时会回调这个方法。
    通过viewHolder中持有的对应position上的View,更新视图。

  • 实现getItemCount()
    返回Item的总数。

代码仓库:

https://github.com/2412322029/Applicationtest

这篇关于类微信界面 02 -RecyclerView的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/560720

相关文章

Git 的特点—— Git 学习笔记 02

文章目录 Git 简史Git 的特点直接记录快照,而非差异比较近乎所有操作都是本地执行保证完整性一般只添加数据 参考资料 Git 简史 众所周知,Linux 内核开源项目有着为数众多的参与者。这么多人在世界各地为 Linux 编写代码,那Linux 的代码是如何管理的呢?事实是在 2002 年以前,世界各地的开发者把源代码通过 diff 的方式发给 Linus,然后由 Linus

MySQL record 02 part

查看已建数据库的基本信息: show CREATE DATABASE mydb; 注意,是DATABASE 不是 DATABASEs, 命令成功执行后,回显的信息有: CREATE DATABASE mydb /*!40100 DEFAULT CHARACTER SET utf8mb3 / /!80016 DEFAULT ENCRYPTION=‘N’ / CREATE DATABASE myd

GPU 计算 CMPS224 2021 学习笔记 02

并行类型 (1)任务并行 (2)数据并行 CPU & GPU CPU和GPU拥有相互独立的内存空间,需要在两者之间相互传输数据。 (1)分配GPU内存 (2)将CPU上的数据复制到GPU上 (3)在GPU上对数据进行计算操作 (4)将计算结果从GPU复制到CPU上 (5)释放GPU内存 CUDA内存管理API (1)分配内存 cudaErro

一款支持同一个屏幕界面同时播放多个视频的视频播放软件

GridPlayer 是一款基于 VLC 的免费开源跨平台多视频同步播放工具,支持在一块屏幕上同时播放多个视频。其主要功能包括: 多视频播放:用户可以在一个窗口中同时播放任意数量的视频,数量仅受硬件性能限制。支持多种格式和流媒体:GridPlayer 支持所有由 VLC 支持的视频格式以及流媒体 URL(如 m3u8 链接)。自定义网格布局:用户可以配置播放器的网格布局,以适应不同的观看需求。硬

centOS7.0设置默认进入字符界面

刚装的,带有x window桌面,每次都是进的桌面,想改成自动进命令行的。记得以前是修改 /etc/inittab 但是这个版本inittab里的内容不一样了没有id:x:initdefault这一行而且我手动加上也不管用,这个centos 7下 /etc/inittab 的内容 Targets systemd uses targets which serve a simil

Appium--界面元素选择

在操作界面元素前,我们需要进行手机与电脑的连接,这里介绍一个adb无线连接的方法: Adb无线连接功能 无线连接步骤(确保手机和电脑处于同一局域网) 1先以USB有线连接方式连接到计算机 2激活手机adb的无线服务: 命令行输入adb tcpip 5555(5555是端口号) 3计算机以无线方式连接到手机: 命令行输入adb connect 配置信息 desired_caps:这些键值对告诉ap

滚雪球学MyBatis(02):环境搭建

环境搭建 前言 欢迎回到我们的MyBatis系列教程。在上一期中,我们详细介绍了MyBatis的基本概念、特点以及它与其他ORM框架的对比。通过这些内容,大家应该对MyBatis有了初步的了解。今天,我们将从理论走向实践,开始搭建MyBatis的开发环境。了解并掌握环境搭建是使用MyBatis的第一步,也是至关重要的一步。 环境搭建步骤 在开始之前,我们需要准备一些必要的工具和软件,包括J

SAP学习笔记 - 开发02 - BTP实操流程(账号注册,BTP控制台,BTP集成开发环境搭建)

上一章讲了 BAPI的概念,以及如何调用SAP里面的既存BAPI。 SAP学习笔记 - 开发01 - BAPI是什么?通过界面和ABAP代码来调用BAPI-CSDN博客 本章继续讲开发相关的内容,主要就是BTP的实际操作流程,比如账号注册,登录,BTP集成开发环境的搭建这方面。 目录 1,账号注册 2,BTP登录URL 3,如何在BTP上进行开发? 以下是详细内容。 1,账

浙大数据结构:02-线性结构4 Pop Sequence

这道题我们采用数组来模拟堆栈和队列。 简单说一下大致思路,我们用栈来存1234.....,队列来存输入的一组数据,栈与队列进行匹配,相同就pop 机翻 1、条件准备 stk是栈,que是队列。 tt指向的是栈中下标,front指向队头,rear指向队尾。 初始化栈顶为0,队头为0,队尾为-1 #include<iostream>using namespace std;#defi

【YOLO 系列】基于YOLOV8的智能花卉分类检测系统【python源码+Pyqt5界面+数据集+训练代码】

前言: 花朵作为自然界中的重要组成部分,不仅在生态学上具有重要意义,也在园艺、农业以及艺术领域中占有一席之地。随着图像识别技术的发展,自动化的花朵分类对于植物研究、生物多样性保护以及园艺爱好者来说变得越发重要。为了提高花朵分类的效率和准确性,我们启动了基于YOLO V8的花朵分类智能识别系统项目。该项目利用深度学习技术,通过分析花朵图像,自动识别并分类不同种类的花朵,为用户提供一个高效的花朵识别