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

查看:870
本文介绍了android - 安卓如何让View往屏幕外隐藏?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

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

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

解决方案

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

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;
    }

这篇关于android - 安卓如何让View往屏幕外隐藏?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆