2017-02-18 15 views
0

У меня есть HorizontalScrollView, содержащий LinearLayout, который используется для отображения дерева файлов лентыУдаление зрения или диапазон мнений в LinearLayout вызывает NullPointerException в вызове unFocus

<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 как пользователь переходит к ним

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) 

Любая помощь приветствуется.

Edit:

Удаление и повторное добавление просмотров делает работу, но я не считаю, что это хорошее решение.

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

Как насчет запроса вызоваChildFocus Перед удалением? – motis10

+0

Это также сбой, потому что ViewGroup возвращает null для getFocusedChild(), который требуется для requestChildFocus –

 Смежные вопросы

  • Нет связанных вопросов^_^