2017-02-18 47 views
0

我有含有用於顯示文件樹色帶卸下的從一個的LinearLayout視圖的視圖或範圍將導致一個NullPointerException中調用無焦點

<HorizontalScrollView 
     android:id="@+id/content_ribbon_scrollview" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_marginStart="16dp" 
     android:scrollbars="none"> 

     <LinearLayout 
      android:id="@+id/content_file_ribbon" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:orientation="horizontal"> 

     </LinearLayout> 

    </HorizontalScrollView> 

項目被添加到所述的LinearLayout一個的LinearLayout一個Horizo​​ntalScrollView當用戶導航到他們時

void addRibbonItem(final Node node) { 
     final TextView view = (TextView) getLayoutInflater().inflate(R.layout.shard_ribbon_item, mRibbon, false); 
     view.setText(node.getName()); 

     mRibbon.addView(view); 
     mRibbon.postDelayed(() -> mRibonScrollView.fullScroll(View.FOCUS_RIGHT), 17); 

當一個項目被點擊時,它的所有項目的權利應該被刪除。

我試圖用removeViewsInLayout方法來做到這一點,以及反覆刪除最終的視圖。

(忽略缺乏邊界的檢查)

view.setOnClickListener(v -> { 
     mRibbon.removeViewsInLayout(mRibbon.indexOfChild(view) + 1, mRibbon.getChildCount()); 
    }); 


    view.setOnClickListener((v) -> { 
     final int index = mRibbon.indexOfChild(view); 
     for(int i = 0; i < index; i++) mRibbon.removeViewAt(mRibbon.getChildCount()); 
    }); 

這兩種方法得到相同的異常

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.view.View.unFocus(android.view.View)' on a null object reference 
                     at android.view.ViewGroup.removeViewsInternal(ViewGroup.java:4691) 
                     at android.view.ViewGroup.removeViewsInLayout(ViewGroup.java:4539) 
                     at com.tpb.projects.repo.content.ContentActivity.lambda$-com_tpb_projects_repo_content_ContentActivity_lambda$1(ContentActivity.java:67) 

任何幫助理解。

編輯:

刪除並重新添加的意見的工作,但我不認爲這是一個很好的解決方案。

view.setOnClickListener(v -> { 
     final ArrayList<View> views = new ArrayList<>(); 
     for(int i = 0; i <= mRibbon.indexOfChild(view); i++) { 
      views.add(mRibbon.getChildAt(i)); 
     } 
     mRibbon.removeAllViews(); 
     for(View item : views) { 
      mRibbon.addView(item); 
     } 

    }); 

回答

0

試試這個:
1.使用子元素才能到父級的引用。
2.將父項轉換爲ViewGroup,以便您可以訪問removeView方法並使用它。

((ViewGroup)scrollChildLayout.getParent()).removeView(scrollChildLayout); 

,而不是像這樣:

//scrollView.removeView(scrollChildLayout); 
+0

這讓我刪除被點擊了查看,但我得到試圖消除各種從ViewGroup中,視圖時死機一樣這是我需要做。 –

+0

怎麼樣call requestChildFocus 在刪除之前? – motis10

+0

這也會崩潰,因爲ViewGroup爲getFocusedChild()返回null,這是requestChildFocus所必需的 –

相關問題