安卓如何让View往屏幕外隐藏?

发布于 2022-09-04 17:27:53 字数 372 浏览 20 评论 0

如图,让和让最新那条插入的数据 显示在 顶部开始的地方,而旧的数据隐藏在顶部屏幕之外呢?

当插入 问题14的时候,,前13条被隐藏在顶部之外的地方了。怎么做到这样呢?
模仿语言助手那种界面?如何做到

图片描述

图片描述

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

情话墙 2022-09-11 17:27:53

以下两种方案都亲测可行:
方案一:(无动画)

listView.setSelection(问题14的position);

方案二:(带动画)

ListView lvBaseList添加问题14后调用

                final int targetPosition = 2;//假设你要置顶的ItemView的position = 2
                final long targetId = adapter.getItemId(targetPosition);
                View child = getTargetView(lvBaseList, targetId);
                final boolean isVisible = child != null;
                
                if (isVisible) {//问题14已显示
                    Log.d(TAG, "lvBaseList.onItemClick  isVisible = true >> ");
                    Log.d(TAG, "lvBaseList.onItemClick  lvBaseList.getY() = " + (int) lvBaseList.getY());
                    Log.d(TAG, "lvBaseList.onItemClick  child.getY() = " + (int) child.getY());
                    lvBaseList.smoothScrollBy((int) (child.getY() - lvBaseList.getY()), 200);
                    return;
                }
                
                //问题14未显示
                Log.d(TAG, "lvBaseList.onItemClick  isVisible = false >> ");
                lvBaseList.smoothScrollToPosition(targetPosition + lvBaseList.getHeaderViewsCount());
                lvBaseList.setOnScrollListener(new OnScrollListener() {
                    
                    @Override
                    public void onScrollStateChanged(AbsListView view, int scrollState) {
                        if (scrollState == SCROLL_STATE_IDLE) {
                            lvBaseList.setOnScrollListener(null);//避免影响正常滚动
                            
                            View child = getTargetView(lvBaseList, targetId);
                            if (child == null) {
                                Log.e(TAG, "lvBaseList.onItemClick  child == null >>  return;");
                                return;
                            }
                            
                            Log.d(TAG, "lvBaseList.onItemClick  lvBaseList.getY() = " + (int) lvBaseList.getY());
                            Log.d(TAG, "lvBaseList.onItemClick  child.getY() = " + (int) child.getY());
//                            lvBaseList.scrollListBy((int) (child.getY() - lvBaseList.getY()));//可行,无动画
                            lvBaseList.smoothScrollBy((int) (child.getY() - lvBaseList.getY()), 200);
                        }
                    }
                    
                    @Override
                    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
                        
                    }
                });

需要用到的函数:

     //根据targetId获取childView
     private View getTargetView(ListView lvBaseList, long targetId) {
        View child = null;
        MomentView itemView;//MomentView相当于ViewHolder,里面存放item数据或者itemId
        MomentItem item;
        for (int i = 0; i < lvBaseList.getChildCount(); i++) {
            child = lvBaseList.getChildAt(i);
            itemView = child == null ? null : (MomentView) child.getTag();
            item = itemView == null ? null : itemView.getData();
            Log.d(TAG, "lvBaseList.onItemClick  item.getId() = " + (item == null ? 0 : item.getId()) + "; targetId = " + targetId);
            if (item != null && item.getId() == targetId) {
                Log.d(TAG, "lvBaseList.onItemClick  item != null && item.getId() == targetId >>  break;");
                break;
            }
            child = null;
        }
        return child;
    }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文