2015-02-03 2 views
3

내 탐색 창 내부에 recyclerView를 사용하고 있으며이 라이브러리 Twoway-view을 사용하여 클릭 및 선택 지원을 받고 있습니다.Recyclerview, getChildAt (위치) 항목보기를 가져올 수 없습니다. Null 개체 참조

그것은 완벽하게 작동하고 나는 각 위치의 OnClick 방법 내부 문제없이 텍스트의 색상과 아이콘을 변경할 수 있습니다

itemClickSupport.setOnItemClickListener(new ItemClickSupport.OnItemClickListener() { 
     @Override 
     public void onItemClick(RecyclerView parent, View view, int position, long id) { 
      TypedValue typedValue = new TypedValue(); 
      MainActivity.this.getTheme().resolveAttribute(R.attr.colorAccent, typedValue, true); 
      final int color = typedValue.data; 

      //TODO Icon and text colors 

      for (int i = 0; i < drawerTitles.length; i++){ 
       if (i == position){ 
        ImageView imageViewDrawerIcon = (ImageView) recyclerViewDrawer.getChildAt(i).findViewById(R.id.imageViewDrawerIcon); 
        TextView textViewDrawerTitle = (TextView) recyclerViewDrawer.getChildAt(i).findViewById(R.id.textViewDrawerItemTitle); 
        imageViewDrawerIcon.setColorFilter(color); 
        if(Build.VERSION.SDK_INT > 15){ 
         imageViewDrawerIcon.setImageAlpha(255); 
        }else{ 
         imageViewDrawerIcon.setAlpha(255); 
        } 
        textViewDrawerTitle.setTextColor(color); 
        RelativeLayout relativeLayoutDrawerItem = (RelativeLayout) recyclerViewDrawer.getChildAt(i).findViewById(R.id.relativeLayoutDrawerItem); 
        relativeLayoutDrawerItem.setFocusableInTouchMode(true); 
       }else{ 
        ImageView imageViewDrawerIcon = (ImageView) recyclerViewDrawer.getChildAt(i).findViewById(R.id.imageViewDrawerIcon); 
        TextView textViewDrawerTitle = (TextView) recyclerViewDrawer.getChildAt(i).findViewById(R.id.textViewDrawerItemTitle); 
        imageViewDrawerIcon.setColorFilter(getResources().getColor(R.color.md_text)); 
        if(Build.VERSION.SDK_INT > 15){ 
         imageViewDrawerIcon.setImageAlpha(138); 
        }else{ 
         imageViewDrawerIcon.setAlpha(138); 
        } 
        textViewDrawerTitle.setTextColor(getResources().getColor(R.color.md_text)); 
        RelativeLayout relativeLayoutDrawerItem = (RelativeLayout) recyclerViewDrawer.getChildAt(i).findViewById(R.id.relativeLayoutDrawerItem); 
        relativeLayoutDrawerItem.setFocusableInTouchMode(false); 
       } 
      } 

      //TODO Fragments (closedrawers before setfragment) 
      final Handler handler = new Handler(); 
      handler.postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        // Do something after some time 

       } 
      }, 250); 
      mDrawerLayout.closeDrawers(); 
     } 
    }); 

문제는 내가 그처럼 첫 번째 항목에 액세스 할 것입니다 메서드를 사용하지만, 먼저 (선택한 첫 번째 항목을 설정하려면 다른 색으로 설정해야합니다.) 내가의 OnClick 방법 이외의 첫 번째 항목을 얻을 때

하지만 충돌 (null 참조)을 얻을 :

ImageView imageViewDrawerIcon = (ImageView) recyclerViewDrawer.getChildAt(0).findViewById(R.id.imageViewDrawerIcon); 

모든 코드 :이와 마지막으로 해결

// Setup RecyclerView inside drawer 
    recyclerViewDrawer = (RecyclerView) findViewById(R.id.recyclerViewDrawer); 
    recyclerViewDrawer.setHasFixedSize(true); 
    recyclerViewDrawer.setLayoutManager(new LinearLayoutManager(MainActivity.this)); 

    ArrayList<DrawerItem> drawerItems = new ArrayList<>(); 
    final String[] drawerTitles = getResources().getStringArray(R.array.drawer); 
    final TypedArray drawerIcons = getResources().obtainTypedArray(R.array.drawerIcons); 
    for (int i = 0; i < drawerTitles.length; i++) { 
     drawerItems.add(new DrawerItem(drawerTitles[i], drawerIcons.getDrawable(i))); 
    } 
    drawerIcons.recycle(); 
    adapterDrawer = new DrawerAdapter(drawerItems); 
    recyclerViewDrawer.setAdapter(adapterDrawer); 

    // Here is the problem 
    ImageView imageViewDrawerIcon2 = (ImageView) recyclerViewDrawer.getChildAt(0).findViewById(R.id.imageViewDrawerIcon); 

    // RecyclerView item listener. 
    ItemClickSupport itemClickSupport = ItemClickSupport.addTo(recyclerViewDrawer); 
    itemClickSupport.setOnItemClickListener(new ItemClickSupport.OnItemClickListener() { 
     @Override 
     public void onItemClick(RecyclerView parent, View view, int position, long id) { 
      TypedValue typedValue = new TypedValue(); 
      MainActivity.this.getTheme().resolveAttribute(R.attr.colorAccent, typedValue, true); 
      final int color = typedValue.data; 

      //TODO Icon and text colors 

      for (int i = 0; i < drawerTitles.length; i++){ 
       if (i == position){ 
        ImageView imageViewDrawerIcon = (ImageView) recyclerViewDrawer.getChildAt(i).findViewById(R.id.imageViewDrawerIcon); 
        TextView textViewDrawerTitle = (TextView) recyclerViewDrawer.getChildAt(i).findViewById(R.id.textViewDrawerItemTitle); 
        imageViewDrawerIcon.setColorFilter(color); 
        if(Build.VERSION.SDK_INT > 15){ 
         imageViewDrawerIcon.setImageAlpha(255); 
        }else{ 
         imageViewDrawerIcon.setAlpha(255); 
        } 
        textViewDrawerTitle.setTextColor(color); 
        RelativeLayout relativeLayoutDrawerItem = (RelativeLayout) recyclerViewDrawer.getChildAt(i).findViewById(R.id.relativeLayoutDrawerItem); 
        relativeLayoutDrawerItem.setFocusableInTouchMode(true); 
       }else{ 
        ImageView imageViewDrawerIcon = (ImageView) recyclerViewDrawer.getChildAt(i).findViewById(R.id.imageViewDrawerIcon); 
        TextView textViewDrawerTitle = (TextView) recyclerViewDrawer.getChildAt(i).findViewById(R.id.textViewDrawerItemTitle); 
        imageViewDrawerIcon.setColorFilter(getResources().getColor(R.color.md_text)); 
        if(Build.VERSION.SDK_INT > 15){ 
         imageViewDrawerIcon.setImageAlpha(138); 
        }else{ 
         imageViewDrawerIcon.setAlpha(138); 
        } 
        textViewDrawerTitle.setTextColor(getResources().getColor(R.color.md_text)); 
        RelativeLayout relativeLayoutDrawerItem = (RelativeLayout) recyclerViewDrawer.getChildAt(i).findViewById(R.id.relativeLayoutDrawerItem); 
        relativeLayoutDrawerItem.setFocusableInTouchMode(false); 
       } 
      } 

      //TODO Fragments (closedrawers before setfragment) 
      final Handler handler = new Handler(); 
      handler.postDelayed(new Runnable() { 
       @Override 
       public void run() { 
        // Do something after some time 

       } 
      }, 250); 
      mDrawerLayout.closeDrawers(); 
     } 
    }); 

답변

8

(source) :

recyclerViewDrawer.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
     @Override 
     public void onGlobalLayout() { 
      ImageView imageViewDrawerIcon = (ImageView) recyclerViewDrawer.getChildAt(0).findViewById(R.id.imageViewDrawerIcon); 
      TextView textViewDrawerTitle = (TextView) recyclerViewDrawer.getChildAt(0).findViewById(R.id.textViewDrawerItemTitle); 
      imageViewDrawerIcon.setColorFilter(color); 
      if (Build.VERSION.SDK_INT > 15) { 
       imageViewDrawerIcon.setImageAlpha(255); 
      } else { 
       imageViewDrawerIcon.setAlpha(255); 
      } 
      textViewDrawerTitle.setTextColor(color); 
      RelativeLayout relativeLayoutDrawerItem = (RelativeLayout) recyclerViewDrawer.getChildAt(0).findViewById(R.id.relativeLayoutDrawerItem); 
      relativeLayoutDrawerItem.setFocusableInTouchMode(true); 
      // unregister listener (this is important) 
      recyclerViewDrawer.getViewTreeObserver().removeGlobalOnLayoutListener(this); 
     } 
    }); 

그런데 누군가가 더 나은 해결책을 가지고 있다면 나는 그것을 알고 싶습니다.

+0

이 방법을 사용하면'getChildViiew (0)'의 인스턴스가 여전히 null이됩니다. 나는 개인적으로 그것을 재현 할 수 없다. 'setAdapter'를 사용하면 하위 뷰 인플레이션이 발생하므로 아이 뷰가 비정상적으로 팽창되어 RecyclerView에 추가 될 때 콜백이 발생합니다. – ono

7

이 나를 위해 일한 매력

View viewItem = recycleView.getLayoutManager().findViewByPosition(position); 
    View icon = viewItem.findViewById(R.id.view); 
+0

네, 저에게 잘 맞습니다. Aha –

0

같은 작품이다.

recyclerView.post(new Runnable() { 
    @Override 
    public void run() { 
    View viewItem = recycleView.getLayoutManager().findViewByPosition(position); 
    View icon = viewItem.findViewById(R.id.view); 
    } 
}); 
관련 문제