美文网首页
RecyclerView LinearLayoutManager

RecyclerView LinearLayoutManager

作者: 程序员张晴天 | 来源:发表于2018-06-10 18:02 被阅读958次

    有一个业务需求是要在onCreate()方法中,使用LinearLayoutManager.findViewByPosition()获得RecyclerView的childview

    模拟代码如下:

    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
        setContentView(R.layout.activity_main);  
      
        List<String> datas = new ArrayList<>();  
        for (int i = 0; i < 20; i++) {  
            datas.add("item " + i);  
        }  
        final RecyclerView recyclerView = findViewById(R.id.recyclerview);  
        CustomRecyclerAdapter adapter = new CustomRecyclerAdapter(datas);  
        final LinearLayoutManager layoutManager = new LinearLayoutManager(this,  
                LinearLayoutManager.VERTICAL, false);  
        recyclerView.setAdapter(adapter);  
        recyclerView.setLayoutManager(layoutManager);  
      
        View view = layoutManager.findViewByPosition(3);  
        Log.i(TAG, "onCreate: view = " + view.toString());  
    }  
    

    但是会报空指针错误NullPointerException,view一直是null


    NullPointerException

    原因:

    因为在Activity的onCreate()方法中,View还没有开始绘制,只是做了初始化工作,所以获取不到childview,在Activity的onResume()方法中才真正开始了View的绘制

    解决办法:

    重写addOnGlobalLayoutListener()接口,在View绘制完成之后再获取childview

    //View加载完成时回调
    recyclerView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver
            .OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            View view = layoutManager.findViewByPosition(3);
            Log.i(TAG, "onCreate: view = " + view.toString());
    
            //OnGlobalLayoutListener可能会被多次触发
            //所以完成了需求后需要移除OnGlobalLayoutListener
            recyclerView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
        }
    });
    



    补充记录:

    // view重绘时回调    
    view.getViewTreeObserver().addOnDrawListener(new OnDrawListener() {    
        @Override    
        public void onDraw() {    
            // TODO Auto-generated method stub    
        }    
    });   
    

    参考文章:
    android 如何判断一个 View textview imageview etc 是否绘制完成
    OnGlobalLayoutListener获得一个视图的高度
    View的生命周期方法和Activity生命周期方法关系

    相关文章

      网友评论

          本文标题:RecyclerView LinearLayoutManager

          本文链接:https://www.haomeiwen.com/subject/yoweottx.html