精华内容
参与话题
问答
  • Android中getChildAt()方法介绍

    万次阅读 2016-08-28 18:27:50
    getChildAt: 官方文档:public View getChildAt (int index)Returns the view at the specified position in the group.Parameters index: the position at which to get the view from returns: the view at ...

    getChildAt:
    官方文档:

    public View getChildAt (int index)

    Returns the view at the specified position in the group.

    Parameters
    index: the position at which to get the view from
    returns:
    the view at the specified position or null if the position does not exist within the group

    大致意思:
      public View getChildAt (int index)
      
      在集合中返回指定位置的视图。
      
      参数
      index:索引的位置得到的视图
      returns:在集合中如果位置不存在,视图在指定的位置还是null

    本人菜鸟一个,有什么不对的地方希望大家指出评论,大神勿喷,希望大家一起学习进步!

    展开全文
  • getChildAt 踩坑

    2019-12-30 14:42:44
    先说需求:项目中有个recycleview,recycleview中插入了一个广告,当这个广告在屏幕可视范围之内的话就需要调曝光的方法,曝光的方法有个参数是当前的广告view; 直接上代码 recycleRecommended.setOnScrollListener...

    先说需求:项目中有个recycleview,recycleview中插入了一个广告,当这个广告在屏幕可视范围之内的话就需要调曝光的方法,曝光的方法有个参数是当前的广告view;

    直接上代码
    recycleRecommended.setOnScrollListener(new RecyclerView.OnScrollListener() {
                @Override
                public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                    switch (newState) {
                        case RecyclerView.SCROLL_STATE_IDLE:
                            RecyclerView.LayoutManager layoutManager = recyclerView.getLayoutManager();
                            //判断是当前layoutManager是否为LinearLayoutManager
                            if (layoutManager instanceof LinearLayoutManager) {
                                LinearLayoutManager linearManager = (LinearLayoutManager) layoutManager;
                                //获取最后一个可见view的位置
                                int firstItemPositin = linearManager.findFirstVisibleItemPosition();
                                int lastItemPosition = linearManager.findLastVisibleItemPosition();
                                for (int i = 0; i <= lastItemPosition-firstItemPositin; i++) {
                                    if (recommended_data != null && recommended_data.size() > (i+firstItemPositin) && recommended_data.get(i+firstItemPositin).infoMationInfo != null) {
                                        ((DoNewsAdNativeData) recommended_data.get(i+firstItemPositin).infoMationInfo).onExposured(recyclerView.getChildAt(i+1));
                                    }
                                }
                            }
                            break;
                        default:
                            break;
                    }
                }
    
                @Override
                public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                    super.onScrolled(recyclerView, dx, dy);
                }
            });
    

    以上代码:监听recycleview的滑动方法,获取到recycleview显示的第一个和最后一个item角标,然后判断广告是否在这个显示的区间内,如果在的话获取到广告对象调onExposured曝光方法;其中用到了getChildAt来获取view,getChildAt需要传入一个角标,这个角标实际上传入的是屏幕可见范围内的角标,而不是广告所在位置的角标
    在这里插入图片描述
    以上面的图为例(有点丑不过这不重要),比如广告是在整个recycleview的第7位,即角标为6的地方,当滑动到这种状态下,想要获取广告的itemView,getChildAt(index)中的index不应该传6,而是应该传入可视范围的角标,即应该传入4;

    for (int i = 0; i <= lastItemPosition-firstItemPositin; i++) {
            if (recommended_data != null && recommended_data.size() > (i+firstItemPositin) && recommended_data.get(i+firstItemPositin).infoMationInfo != null) {
                 ((DoNewsAdNativeData) recommended_data.get(i+firstItemPositin).infoMationInfo).onExposured(recyclerView.getChildAt(i+1));
            }
     }
    

    可以通过以上方法通过for循环获取到当前显示的角标i,然后通过getChildAt(i+1)获取到当前view;

    总结:getChildAt(index)中的index传入的角标是屏幕可见范围内的角标,而不是所在位置的角标;

    如有不明白,或者写的不清楚的地方可以给我留言或者私信我!

    展开全文
  • 以前对于AdapterView(ListView和GridView的父类)以及这个类的getChildAt()方法理解十分粗浅,以为是指传入一个绝对position(就是这个item是AdapterView第几个元素)来直接获得到该item,当然,android SDK中对于...

    以前对于AdapterView(ListView和GridView的父类)以及这个类的getChildAt()方法理解十分粗浅,以为是指传入一个绝对position(就是这个item是AdapterView第几个元素)来直接获得到该item,当然,android SDK中对于该方法也没有很具体的说明。这个理解是错误的。以简单的listview为例先说下listview对于item的复用,一个元素很多的listview,如果页面的可视区域内最多可以看到6个元素,不妨假如它们的index是0-5,那么在内存中只有6个item对象。当第7个item(即index=6)进入到可视区域的时候,那么其实是在复用index=0的item。由于在滑动时getView这个更新控件的方法执行非常频繁,所以肉眼是丝毫看不出这种复用的。
    那么,接着上面的例子来说,任何情况下,getChildAt(int position)返回的item都是指的可视区域内的第position个元素。下面是一种巧妙和严谨的方法可以在任何时候(指的是listView滑动在任意状态时)根据position取得可视区域内的item,如果该item不在可视区域,则返回null。

    private static class ChildViewInfo {
    
            private Integer firstVisiblePosition = null;
            private Integer childCount = null;
    
            private Integer headerViewsCount = null;
    
            private Integer firstVisiblePositionWithOutHeaderViews = null;
            private Integer childCountWithOutHeaderViews = null;
            private Integer visibleHeaderViewsCount = null;
    
            public ChildViewInfo(AdapterView<Adapter> adapterView) {
                Adapter adapter = adapterView.getAdapter();
                firstVisiblePosition = adapterView.getFirstVisiblePosition();
                childCount = adapterView.getChildCount();
                if (null != adapter && adapter instanceof HeaderViewListAdapter) {
                    headerViewsCount = ((HeaderViewListAdapter) adapter).getHeadersCount();
    
                    firstVisiblePositionWithOutHeaderViews = firstVisiblePosition - headerViewsCount;
                    if (firstVisiblePositionWithOutHeaderViews < 0) {
                        firstVisiblePositionWithOutHeaderViews = 0;
                    }
    
                    visibleHeaderViewsCount = headerViewsCount - firstVisiblePosition;
                    if (visibleHeaderViewsCount > 0) {
                        visibleHeaderViewsCount = Math.min(childCount, visibleHeaderViewsCount);
                        childCountWithOutHeaderViews = childCount - visibleHeaderViewsCount;
                    } else {
                        visibleHeaderViewsCount = 0;
                        childCountWithOutHeaderViews = childCount;
                    }
                }
            }
    
    
            public View getItemView(int position, boolean withOutHeaderViews) { 
                boolean b = withOutHeaderViews && adapterView.getAdapter() instanceof HeaderViewListAdapter;
                ChildViewInfo childViewInfo = new ChildViewInfo(adapterView);
                int firstVisiblePosition = b ? childViewInfo.firstVisiblePositionWithOutHeaderViews : 
                    childViewInfo.firstVisiblePosition;
                int childCount = b ? childViewInfo.childCountWithOutHeaderViews : 
                    childViewInfo.childCount;
                Integer index = getItemViewIndex(firstVisiblePosition, childCount, position);
                if (null != index) {
                    index = b ? index + childViewInfo.visibleHeaderViewsCount : index;
                    return adapterView.getChildAt(index);
                }
                return null;
            }
    
            public static Integer getItemViewIndex(int firstVisiblePosition, int childCount, int position) {
                int index = position - firstVisiblePosition;
                int count = childCount;
                if (index >= 0 && index < count) {
                    return index;
                }
                return null;
            }
    }
    展开全文
  • 1.原理在很多时候ListView列表数据不需要全部刷新,只需刷新有数据变化的那一条,这时可以用getChildAt(index)获取某个指定position的view,并对该view进行刷新。 注意:在ListView中,使用getChildAt(index)的取值...

    1.原理

    在很多时候ListView列表数据不需要全部刷新,只需刷新有数据变化的那一条,这时可以用getChildAt(index)获取某个指定position的view,并对该view进行刷新。

    注意:在ListView中,使用getChildAt(index)的取值,只能是当前可见区域(列表可滚动)的子项!

    即取值范围在 >= ListView.getFirstVisiblePosition() && <= ListView.getLastVisiblePosition();
    1)所以如果想获取前部的将会出现返回Null值空指针问题;
    2)getChildCount跟getCount获取的值将会不一样(数量多时);
    3)如果使用了getChildAt(index).findViewById(…)设置值的话,滚动列表时值就会改变了。

    需要使用getFirstVisiblePosition()获得第一个可见的位置,再用当前的position-它,再用getChildAt取值!即getChildAt(position - ListView。getFirstVisiblePosition()).findViewById(…)去设置值

    2.如果想更新某一行数据,需要配合ListView的滚动状态使用,一般不滚动时才加载更新数据

    //全局变量,用来记录ScrollView的滚动状态,1表示开始滚动,2表示正在滚动,0表示停止滚动
    伪代码
    ListView设置

    public int scrollStates; 
    class OnScrollListenerImpl implements OnScrollListener{ 
    @Override 
    public void onScrollStateChanged(AbsListView view, int scrollState) { 
    scrollStates = scrollState;  
    } 
    
    @Override 
    public void onScroll(AbsListView view, int firstVisibleItem, 
    int visibleItemCount, int totalItemCount) { 
    int lastInScreen = firstVisibleItem + visibleItemCount; 
    } 
    listView.setOnScrollListener(new OnScrollListenerImpl()); 
    
    
    Activity中 
    if(scrollStates==OnScrollListener.SCROLL_STATE_IDLE){ 
    
    更新视图数据 
    } 

    原文链接:http://ahua186186.iteye.com/blog/1830180

    展开全文
  • 对于有起名困难症的人,可以不给控件设置id,仅仅获取根布局的实例,再用getChildAt方法去取  可是Fragment是可以获取的, 但是activity怎么获取 其实activity也是接受view参数的,所以 root = ...
  • 3、通过contently.getChildAt(i)的方法获得View v; 4、可以使用 content ct = (content)v; 5、使用ct.ok()和ct.cancel(); 代码如下: ll = (LinearLayout) findViewById(R.id.contently); btncancle = ...
  • 在很多时候ListView列表数据不需要全部刷新,只需刷新有数据变化的那一条,这时可以用getChildAt(index)获取某个指定position的view,并对该view进行刷新。 注意:在ListView中,使用getChildAt(index)的取值,...
  • Android ListView getChildAt View 为空

    万次阅读 2011-09-29 21:24:47
    困扰我多久的问题终于解决,这里共享下: 原网站:http://www.linuxidc.com/Linux/2011-09/43139p4.htm   我们在每个 ListView 条目的最后增加一个 CheckBox ,即每一个 ListView 条目所包含的内容为:
  • Listview 中 getChildAt方法记录

    千次阅读 2014-10-15 12:15:46
    ListView中getChildAt(index)的使用注意事项 1.原理 在很多时候ListView列表数据不需要全部刷新,只需刷新有数据变化的那一条,这时可以用getChildAt(index)获取某个指定position的view,并对该view进行刷新。 ...
  • View callLogView = mListView.getChildAt(i); mRelativeLayout = (LinearLayout)callLogView.findViewById(R.id.myShow); if(i == position){ if(mRelativeLayout.getVisibility() ==...
  • 解决RecyclerView.getChildAt(Position)崩溃

    千次阅读 2017-05-15 10:12:24
    问题描述: 程序中,屏幕可以获取到6... 实际上:getChildAt()这个方法,只能get到屏幕显示的部分. 解决办法: 只需要用当前的position减去屏幕显示的第一个View的position,得到真实的position即可: int[] firstV...
  • 因为ListView的Item复用的机制,所以在使用listView.getChildAt(postion)时,需要拿当前的postion-listView.getFirstVisiblePosition(),这样可以保证,postion不在屏幕显示之内,get的View也不会是空的。 ListView...
  • getChildAt(index)方法ViewGroup类的方法,许多需要adapter的类(List,GridView)都可以使用这个方法。今天就用到了getChildAt(index)方法,我用的是GridView,需要在数据库中读出GridView中的某些项目,给这些子项...
  • 解决RecyclerView.getChildAt(Position)崩溃

    千次阅读 2017-11-29 10:34:06
    getChildAt() ,position为6或者为7的时候,程序崩溃,报空指针的异常. 实际上:getChildAt()这个方法,只能get到屏幕显示的部分. 解决办法: View childView = recyclerView.getLayoutManager()....
  • 今天发现一个很奇怪的现象, 自定义ListView想获得listView 中每个item的 对象 ,用getChildAt()方法, 参数是一个int 类型的position 利用onTouchEvent里面的down 事件,可以拿到当前按下的坐标点 , 利用...
  • 今天在写程序时,发现一个奇怪的问题:在GridView没有滚动的时候,用getChildAt方法返回的值是正确的;但是只要我一滚动它,用getChildAt方法返回的值就为null。 去网上搜了一下,很多都说刚刚setAdapter后马上...
  • getChildAt(index)方法ViewGroup类的方法,许多需要adapter的类(List,GridView)都可以使用这个方法。今天就用到了getChildAt(index)方法,我用的是GridView,需要在数据库中读出GridView中的某些项目,给这些子项...
  • 获取listview的第n个位置的item,调用listview.getChildAt(position) 可能会返回null 原因:由于Listview的复用机制,页面上最多显示n个item ,当滑动到第n+1个item时候,第n+1个item 会复用界面上可见的第一个item...
  • 在很多时候ListView列表数据不需要全部刷新,只需刷新有数据变化的那一条,这时可以用getChildAt(index)获取某个指定position的view,并对该view进行刷新。 注意:在ListView中,使用getChildAt(index)的取值,...
  • 经过试验发现,Listview的getChildAt()方法只能返回当前屏幕可视范围内的view,比如屏幕只能容下6个,则getChildAt (0)到getChildAt (5)都是可用的,大于5就会返回空值。如果我取第6个的话就null了 解决办法: ...

空空如也

1 2 3 4 5 ... 20
收藏数 34,123
精华内容 13,649
关键字:

getchildat