2015-07-06 2 views
1

Просто моя проблема заключается в следующем.
Я реализую ExapndableListView, первая группа имеет дочерние элементы, которые имеют макет, состоящий из трех: TextView, ImageView, ImageView.
Теперь, когда нажимается дочерний элемент, я устанавливаю видимость одного из двух изображений с помощью v.findViewById(). SetVisibility() и его работоспособность, как я себе представлял.
Проблема заключается в том, что в списке больше 10 детей, система Android восстанавливает вид, используя последний скрытый вверху при прокрутке вниз, теперь, когда я нажимаю дочерний элемент «0», я переключаю изображение вида THAT только пока другие не изменились, до сих пор хорошо, но когда я прокручиваю вниз, и система андроидов перерабатывает представление, используя дочерний вид «0» в дочернем элементе позиции «11», он меняет текст, соответствующий дочернему элементу «11», как и должно быть, но представление, используемое для дочернего «11», представляет собой представление дочернего «0», таким образом, тот же самый образ, который был ранее переключен, появляется на вид ребенка «11», как если бы он был нажат, но это не было ! им делать это:Расширяемый просмотр списка Повторяющиеся виды

@Override 
    public View getChildView(final int parentPosition, final int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { 

    Log.d("status","parent : "+parentPosition + " child : " + childPosition + " View : "+convertView + " ViewGroup : "+parent); 
    int itemType = 25; 
    itemType = getChildType(parentPosition, childPosition); 
    String child_title = (String) getChild(parentPosition,childPosition); 
    if (convertView == null) 
    { 
     if (itemType == 0) 
     { 
      LayoutInflater inflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = inflater.inflate(R.layout.activities2_child_layout, parent, false); 

     } else if (itemType == 1) { 
      LayoutInflater inflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = inflater.inflate(R.layout.activities2_child2_layout, parent, false); 
     } else if (itemType == 2) { 
      LayoutInflater inflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = inflater.inflate(R.layout.activities2_child2_layout, parent, false); 
     } 
    } 
    if (itemType == 0) 
    //region parent 0 child handling 
    { 
     Log.d("Child", childPosition + " : " + child_title); 

     final TextView child_textview = (TextView) convertView.findViewById(R.id.activities2_child_txt); 
     final ImageView img_Likes = (ImageView) convertView.findViewById(R.id.activities2_img_like); 
     final ImageView img_Dislikes = (ImageView) convertView.findViewById(R.id.activities2_img_dislike); 
     child_textview.setText(child_title); 

     child_textview.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 

       switch (AAChildClicks[childPosition]) { 
        case 0: 
         AAChildClicks[childPosition]++; 
         img_Likes.setVisibility(View.VISIBLE); 
         //add to total 
         All_Likes.add(child_textview.getText().toString()); 
         Log.d("Likes", "Likes + " + child_textview.getText().toString()); 
         break; 
        case 1: 
         AAChildClicks[childPosition]++; 
         img_Likes.setVisibility(View.GONE); 
         img_Dislikes.setVisibility(View.VISIBLE); 
         String child = child_textview.getText().toString(); 
         //remove from total 
         All_Likes.remove(child_textview.getText().toString()); 
         Log.d("Likes", "Likes - " + child_textview.getText().toString()); 
         //add to total 
         All_Dislikes.add(child_textview.getText().toString()); 
         Log.d("Likes", "Dislikes + " + child_textview.getText().toString()); 
         break; 
        case 2: 
         AAChildClicks[childPosition] = 0; 
         img_Likes.setVisibility(View.GONE); 
         img_Dislikes.setVisibility(View.GONE); 
         String child2 = child_textview.getText().toString(); 
         //remove from total 
         All_Dislikes.remove(child_textview.getText().toString()); 
         Log.d("Likes", "Dislikes - " + child_textview.getText().toString()); 
         break; 
       } 
      } 

     }); 
    } 
    //endregion 

    if (itemType == 1) 
    //region parent 1 child handling 
    { 
     TextView child_textview = (TextView) convertView.findViewById(R.id.activities2_child2_txt); 
     child_textview.setText(child_title); 
    } 
    //endregion 

    if (itemType == 2) 
    //region parent 2 child handling 
    { 
     TextView child_textview = (TextView) convertView.findViewById(R.id.activities2_child2_txt); 
     child_textview.setText(child_title); 
    } 
    //endregion 

    return convertView; 
} 

Как избежать такого дублирования/ошибка?!

+0

Оставьте весь метод getChildView, пожалуйста. – NameSpace

+0

@NameSpace Я только что скорректировал код для u –

ответ

1

Когда представление будет переработано, его компоненты сохранят прежнее состояние видимости. Поэтому, если вы спрятали части представления, они будут скрыты, когда они будут переработаны.

Таким образом, вам нужно сделать две вещи:

  1. Установить видимость Посмотреть на надлежащем состоянии каждый вызов GetChildView.

  2. Вам необходимо отслеживать данные местоположения за пределами видов. Прямо сейчас ваша запись о видимости видимости находится на самом представлении. Когда это представление перерабатывается, ваша запись теряется (состояние представления становится исходным состоянием какой-либо другой позиции - вот почему мы должны перезаписать его в # 1).

Вы должны отслеживать зрения видимости в какой-то список или тип узла архитектуры - вы не можете хранить эти данные на мнения, так как они постоянно не связаны с какой-либо одной позиции.

+0

okay i kinda думаю как-то я понял слова ур, я дам ему попробуйте и вернитесь к вам после того, как некоторые испытания расскажут, что я достиг .. спасибо за поддержку ур! –

+0

Я не могу вас поблагодарить! сначала я думал, что ур слов не хватало, чтобы решить его, но я думаю, что я только что сделал xD thanksss again .... @ namespace –

1

В настоящее время хранить состояние в itemView img_Likes.setVisibility(View.VISIBLE);

вы должны хранить его в Моделле тоже

((MyType) getChild(parentPosition,childPosition)).setIsVisible(true) 

Если вы (повторно) создать элемент ListView вы использовать эту информацию, чтобы (EN/dis) возможная видимость

img_Likes.setVisibility((((MyType) getChild(parentPosition,childPosition)).getIsVisible()) ? View.VISIBLE : View.GONE); 
+0

Я ДЕЙСТВИТЕЛЬНО люблю звук этого! xD может у вас, пожалуйста, проиллюстрируйте больше?! Что такое MyType? где «хранить в моей модели»? –

+0

Я пытаюсь применить это в течение последних 2 часов, но я действительно не знаю, как это сделать .. Мне действительно нужна помощь ur @ k3b –

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