删除 RecyclerView 项目

2024-04-11

我有一个 RecyclerView,它在每个特定时期添加项目。添加对象时,如果列表项超过(比方说)500,则第一个项目将被删除,新项目将被添加。

如果RecyclerView无法再向下滚动!recyclerView.canScrollVertically(1);然后,添加新项目后,RecyclerView 将smoothScroolToPosition()到最后一个位置。

哪里有问题?好吧,如果 ReyclerView 在删除旧项目时位于中间(不是底部,不是顶部),它会突然向上跳一些位置。我希望 RecyclerView 在删除顶部的项目时不要跳转位置并保持在原来的位置

我尝试使用layoutManager.setStackFromEnd(true);但没有运气

有什么建议么?

一些代码(无关代码已删除)。当 RecyclerView 从中间显示列表项并按 VOLUME_UP 时,可以重现我的问题:

public class ActivityMain extends ActionBarActivity {

    public static final int MAX_LOG_ITEMS = 500;

    private RecyclerView mRecyclerView;
    private AdapterLog mRecyclerAdapter;
    private boolean mAutoScroll = true;

    private DataReceiver mDataReceiver;
    private Handler mLogHandler = new Handler() {
        @Override public void handleMessage(Message msg) {
            switch (msg.what){
                case DataReceiver.CAT_LOGS:
                    List<Log> catLogs = (List<Log>) msg.obj;
                    updateLogs(catLogs);
                    break;
                case DataReceiver .CLEAR_LOGS:
                    if (mRecyclerAdapter.getItemCount() > MAX_LOG_ITEMS)
                        mRecyclerAdapter.removeFirstItems(mRecyclerAdapter.getItemCount() - MAX_LOG_ITEMS);
                    break;
                case Logcat.REMOVE_LOGS:
                    mRecyclerAdapter.clear();
            }
        }

    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        final LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        layoutManager.setStackFromEnd(true);
        mRecyclerAdapter = new AdapterLog();

        mRecyclerView = (RecyclerView) findViewById(R.id.activity_main_recyclerview);
        mRecyclerView.setHasFixedSize(true);        
        mRecyclerView.setLayoutManager(layoutManager);
        mRecyclerView.setAdapter(mRecyclerAdapter);
        mRecyclerView.setOnScrollListener(new UIUtils.ScrollManager(toolbarContainer != null ?
                toolbarContainer : toolbar){
                @Override public void onScrolled(RecyclerView r, int dx, int dy) {
                    super.onScrolled(r, dx, dy);
                    mAutoScroll = !r.canScrollVertically(1);
                    }
                });
    }



    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        switch(keyCode){
            case KeyEvent.KEYCODE_VOLUME_UP:
//                mAutoScroll = false;
//                mRecyclerView.scrollToPosition(0);
//                if (mRecyclerAdapter.getItemCount() > MAX_LOG_ITEMS)
                    mRecyclerAdapter.removeFirstItems(mRecyclerAdapter.getItemCount() - 50);

                return true;
            case KeyEvent.KEYCODE_VOLUME_DOWN:
                mAutoScroll = true;
                mRecyclerView.scrollToPosition(mRecyclerAdapter.getItemCount() -1);
                return true;
        }
        return false;
    }

    private void updateLogs(final List<Log> logList) {
        final boolean scroll = mAutoScroll;
        mRecyclerAdapter.addAll(logList);
        if (scroll) mRecyclerView.smoothScrollToPosition(mRecyclerAdapter.getItemCount() - 1);
    }

}

回收器适配器:

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

    private final List<Log> mLogList;

    public AdapterLog() {
        this.mLogList = new ArrayList<Log>();
    }

    @Override
    public AdapterLog.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.listitem_log, parent, false);
        return new ViewHolder(v);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.mTextView.setText(getItem(position).getMessage());
        holder.mTextView.setTextColor(getItem(position).getLevel().getColor());
    }

    @Override
    public int getItemCount() {
        return mLogList.size();
    }

    public Log getItem(int position) {
        return mLogList.get(position);
    }

    public void addAll(List<Log> logList) {
        mLogList.addAll(logList);
        notifyDataSetChanged();
    }

    public void removeFirstItems(int count) {
        for (int i=0; i<count; i++) mLogList.remove(0);
        notifyDataSetChanged();
    }

    public void clear() {
        mLogList.clear();
        notifyDataSetChanged();
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {
        public TextView mTextView;
        public ViewHolder(View v) {
            super(v);
            mTextView = (TextView) v.findViewById(R.id.listitem_log_textview);
        }
    }
}

您正在告诉您的观点,您更改了整个适配器。对于添加、删除和重新排序,请考虑使用以下方法:

notifyItemRangeChanged
notifyItemRangeInserted
notifyItemRangeRemoved
notifyItemMoved
notifyItemInserted
notifyItemChanged
notifyItemRemoved

所以在你的情况下你要去掉顶部count项目如此:

notifyItemRangeRemoved(0,count)

应该做这项工作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

删除 RecyclerView 项目 的相关文章

  • 我在哪里可以获得可靠的熵来源(真正的随机性字节[])?

    目前 我正在寻找一种方法来增加随机性的质量 in my Android应用程序 纸牌游戏 之前 估计对于我的情况 52 排列 至少需要 226 位熵 226 个随机位 我打算用这个byte 作为种子SecureRandom SecureRa
  • 让协程等待之前的调用

    我还没有完全掌握 Kotlin 协程 基本上我希望协程在执行之前等待任何先前的调用完成 下面的代码似乎可以工作 但它正在做我认为它正在做的事情吗 private var saveJob Job null fun save saveJob s
  • 从历史堆栈中删除活动

    我的应用程序在用户第一次运行应用程序时显示注册活动 如下所示 活动启动画面 欢迎来到游戏 注册帐户 ActivitySplashScreenSignUp 很好 填写此信息 ActivityGameMain 游戏主屏幕 因此 当用户单击每个屏
  • 从 arraylist 和 hashmap 中删除重复项

    我有一个数组列表 其中包含付款人的姓名 另一个数组列表包含每次付款的费用 例如 nameArray 尼古拉 劳尔 洛伦佐 劳尔 劳尔 洛伦佐 尼古拉 价格数组 24 12 22 18 5 8 1 我需要将每个人的费用相加 所以数组必须变成
  • 如何在android中压缩和解压png图像

    您好 在我的应用程序中 当我单击 zip 按钮时 我需要压缩图像文件 当我单击解压缩按钮时 我需要解压缩文件 我尝试使用下面的代码来压缩图像 但我的问题是当我单击 zip 按钮时 正在创建 zip 文件 但之后在使用 winzip 软件的系
  • 如何在 android 中启动“添加联系人”活动

    您能告诉我如何在 Android 中启动 添加联系人 活动吗 谢谢 API 级别 5 及以上解决方案 Add listener so your activity gets called back upon completion of act
  • android中根据屏幕尺寸计算图像尺寸

    我正在尝试根据屏幕尺寸计算图像高度和宽度 我从后端获取 5 x 7 尺寸的图像 为了将像素乘以 72 进行转换 我有 360 X 504 尺寸的图像 对于 360 X 504 我的动态透明矩形区域将显示为 1 223 x 1 179 即 8
  • Android PhoneGap 插件,UI 选项卡栏,调整 WebView 大小

    我正在创建一个美味的 PhoneGap 插件 希望一旦它能被打开 准备好了 插件基本完成了 我只需要一个漂亮的用户界面 相互作用 简而言之 我想创建一个 本机 android 工具栏组件 如果您实现 PhoneGap UIControls
  • 使用 HttpUrlConnection Android 将 base64 编码的图像发送到服务器

    我正在尝试使用 HttpUrlConnection 将 base64 编码的图像发送到服务器 我遇到的问题是大多数图像均已成功发送 但有些图像会生成 FileNotFound 异常 我的图像编码代码可以在下面找到 public static
  • Android Fragment onCreateView 与手势

    我正在尝试在片段中使用手势 我在 FragmentActivity 中有以下内容来处理我的详细信息片段 我试图发生的情况是 当在视图上检测到滑动时 将该视图内的数据替换为上一个或下一个条目 如果有更好的方法来处理这个问题 我完全同意 然而
  • 在选项卡上保存数据

    我有 3 个选项卡 每个选项卡都有一个单独的活动 我想在用户单击任一选项卡上的 保存 时保存数据 有几个选项可供选择 共享首选项 全局变量或将对象保存在上下文中 编辑 我必须保存图像和文本字段 Android 共享首选项 https sta
  • 使用 Android Studio 进行调试永远停留在“等待调试器”状态

    UPDATE The supposed重复是一个关于陷入 等待调试器 执行时Run 而这个问题就陷入了 等待调试器 执行时Debug 产生问题的步骤不同 解决方案也不同 每当我尝试使用Android Studio的调试功能时 运行状态总是停
  • 像 WhatsApp 一样发送图片

    我做了一个聊天应用程序 我想添加照片 文件共享我的应用程序中的概念与 WhatsApp 相同 我已经使用该应用程序制作了Xmpp Openfire目前我正在使用此功能进行照片共享 但它并不完全可靠 public void sendFile
  • SDK >=26 仍需要 mipmap/ic_launcher.png?

    在 Android 中 有两种指定启动器图标 可以说是应用程序图标 的方法 老 方式 在 mipmap 文件夹中指定不同的 png 文件 通常命名为 ic launcher png 但可以通过以下方式设置名称android icon mip
  • 我在 PopupMenu 中使用 ShareActionProvider,但显示两个 PopupMenu?

    我在 PopupMenu 中使用 ShareActionProvider 但是当我单击共享菜单项时 它会在屏幕上显示两个 PopupMenus 一个被另一个覆盖 一个显示应用程序图标和名称 另一个仅显示应用程序名称 除了这个问题之外 它工作
  • 如何关闭 EditText 中的建议?

    如何在 Android 中关闭 EditText 中的建议 android inputType textNoSuggestions 根据this http comments gmane org gmane comp handhelds an
  • 在 Android 手机中通过耳机插孔发送数据

    我目前正在处理一个新项目 我必须通过具有特定电压的耳机插孔发送数据 然后我可以在该电压上工作 所以这里我需要根据我的数据来编程具体电压 我是否可以在android中访问耳机的输出电压 然后创建一个应用程序来控制该电压 这是一篇讨论此问题的
  • 如何正确编写AttributeSet的XML?

    我想创建一个面板适用于 Android 平台的其他小部件 http code google com p android misc widgets 在运行时 XmlPullParser parser getResources getXml R
  • 为什么带处理程序的连续自动对焦相机不允许切换相机闪光灯?

    到目前为止我所做的 我已经实现了用于读取二维码的自定义相机 需要继续聚焦相机以获得更好的二维码读取 我的问题当我使用处理程序每 秒聚焦一次时 相机闪光灯开 关按钮不起作用 或者打开和关闭相机闪光灯需要太多时间 当我删除每秒自动对焦相机的代码
  • 将焦距(以毫米为单位)转换为像素 - Android

    在 Android 中 我当前正在访问camera s焦距通过使用getFocalLength in Camera1 Camera2不是一个选择 我正在尝试完全填充当前的计算 focal length pix focal length m

随机推荐

  • 一个对象(java bean)作为iReport(JasperReports)上的数据源

    我是 iReport 的新手 我必须创建 PDF 报告 使用 JavaBean DataSource 您可以包装 JavaBean 的数组 或集合 但我只需要传递一个对象 仅 JavaBean 的一个实例 我的意思是 我必须在报告中显示 j
  • 使用pdfkit生成pdf文件并将其发送到nodejs-expressjs中的浏览器

    我正在使用 pdfkit 生成 pdf 文件 我想将此 pdf 文件发送到浏览器 但我收到消息 TypeError listener must be a function 另外 文件正在我的父目录中生成 这是我不想要的 谁能解释一下如何生成
  • 为什么使用常量被认为比使用文字更好的编程风格?

    为什么使用常量被认为比使用文字更好的编程风格 前者相对于后者的具体优势是什么 原因之一是协助维护 假设您陷入了黑暗时代 并且您的图形处理程序只能使用 1 4M 软盘 您收到处理新型 2 8M 软盘的请求 您心里想 哈 我只需要搜索代码寻找
  • 在 Android 中放大图像以填充整个 ImageView

    我想放大图像以占据 ImageView 的整个大小 这与使用略有不同scaleType fit center因为健身中心 http developer android com intl fr reference android graphi
  • Django PositiveIntegerField 中的 0 值?

    models PositiveIntegerField 类型的字段可以包含 0 值吗 我正在做类似的事情 points models PositiveIntegerField Thanks 我知道我应该自己尝试一下 但是我这里没有Djang
  • VBA:使用过滤的行和 SpecialCells(xlCellTypeVisible) 与将数据复制到新工作表中

    我有一个包含 250 000 行和 10 列的 Excel 工作簿 我想将数据拆分到不同的工作簿中 我的想法是过滤列表 以便 Excel VBA 不必在每次我的代码要求在数据中查找某些内容时都遍历所有 250 000 行 但是 我遇到了一个
  • type.Protocol 类 `__init__` 方法在显式子类型构造期间未调用

    蟒蛇的PEP 544 https www python org dev peps pep 0544 介绍typing Protocol用于结构子类型 又名 静态鸭子类型 在本 PEP 的部分中合并和扩展协议 https www python
  • mule-standalone-3.3.1 无法在 Windows 7 上启动

    在 Windows 7 中启动 mule 服务器时遇到以下问题 我已经设定JAVA HOME and MULE HOME适当地 MULE HOME is set to C BAM Linux fresh mule standalone 3
  • 操作栏中的选项卡项目宽度 (Android)

    我在活动的操作栏中使用了 12 个选项卡 目标是 API 17 在 Galaxy Nexus 4 2 2 上测试 正如预期的那样 我在操作栏下得到了一个水平滚动的选项卡列表 在下面的屏幕截图中 您可以看到最后一个选项卡 右侧的 B 明显小于
  • Swift - 将数组写入文本文件

    我从一个包含几千行纯文本的文件中读入 myArray 原生 Swift myData String stringWithContentsOfFile myPath encoding NSUTF8StringEncoding error ni
  • 在理解聚集索引时我错过了什么?

    如果没有任何索引 则通过 IAM 索引分配映射 访问表行 我可以使用 IAM 以编程方式直接访问行吗 缺少索引是否意味着读取特定行的唯一方法是全表扫描读取所有表 为什么 IAM 不能参与更具体的直接访问 如果表是堆 换句话说 它没有聚集索引
  • 在画布中将 Raphael JS 生成的 SVG 保存为 png 时出现问题

    我正在尝试转换由以下方式生成的 SVG拉斐尔 JS http raphaeljs com 以及用户 因为您可以拖动和旋转图像 我跟着这个在浏览器中将 SVG 转换为图像 JPEG PNG 等 https stackoverflow com
  • 如何将 Firestore 文档中的所有数据显示到 html 表格中

    我正在设计一个网页 该网页将从我的 firestore 集合中获取数据并显示每个文档及其相应的字段以下是代码 table class table is striped is narrow is hoverable is fullwidth
  • 封装和抽象之间的区别

    我今天去面试了 我有一个问题来自OOP 关于之间的区别封装 抽象 我据我所知回答说封装基本上将数据成员和成员函数绑定到一个称为Class 然而抽象基本上是为了隐藏实现的复杂性并为用户提供方便的访问 我以为她会同意我的回答 但她质疑 如果两者
  • 不包含“GetAwaiter”的定义

    我在下面的代码集中收到以下错误 它在 alliancelookup 行上出错 我不确定我做错了什么 但我自己看不到任何东西 我运行到 crest 的查询似乎运行良好 但我遇到的问题似乎与等待者有关 我想知道是否有解决方法 DynamicCr
  • AudioUnitInitialize 返回 -10851 (kAudioUnitErr_InvalidPropertyValue)

    假设代码是 status AudioUnitSetProperty unit kAudioUnitProperty StreamFormat kAudioUnitScope Input element format sizeof Audio
  • JavaScript 相当于 printf/String.Format

    我正在寻找一个与 C PHP 相当的 JavaScriptprintf 或者对于 C Java 程序员来说 String Format IFormatProvider对于 NET 我的基本要求是目前数字的千位分隔符格式 但处理大量组合 包括
  • 允许多个角色成员资格的自定义 MVC AuthorizeAttribute

    我创建了一个自定义 AuthorizeAttribute 类来处理我的 MVC4 应用程序中的精细授权 这是班级 AttributeUsage AttributeTargets Method AllowMultiple true publi
  • 事件必须是委托类型吗?

    不太熟悉声明和使用事件并收到错误 事件必须是委托类型 基本上想通过IMyInterface作为对另一个类的依赖 该类可以订阅接收MyClassEvent事件和事件数据是MyClass public interface IMyInterfac
  • 删除 RecyclerView 项目

    我有一个 RecyclerView 它在每个特定时期添加项目 添加对象时 如果列表项超过 比方说 500 则第一个项目将被删除 新项目将被添加 如果RecyclerView无法再向下滚动 recyclerView canScrollVert