4

Прошу прощения за мой английский, но переведенный с помощью google. Мне нужна помощь для моего приложения, Я использую ExpandableListView с тремя различными макетами, но у меня проблемы с тем, что я не нашел ответа на разных форумах. В принципе, если метод getChildView() проверяет, является ли преобразование равным нулю, я смещаю все макеты или даже повторяю их несколько раз. Если я не сделаю эту проверку, вы увидите макет как следует, но значения в EditText стираются, если я нажму на другую группу, или если вы просмотрите список, пока не увидите больше макета с помощью EditText. Надеюсь, я был достаточно ясен, и я надеюсь, что ответы одинаково ясны, к сожалению, я был повсюду в Интернете, но не смог найти ответ, который я искал. Заранее спасибо тем, кто поможет мнеExpandableListView с несколькими макетами

public View getChildView(int groupPosition, final int childPosition, 
        boolean isLastChild, View convertView, ViewGroup parent) { 

      View view = convertView; 
      ViewHolder holder; 

      if (view == null) { 
        holder = new ViewHolder(); 

        if (groupPosition == 0) { 
          convertView = infalInflater.inflate(R.layout.adv_item, null); 
          holder.btn1 = (ImageButton) convertView 
              .findViewById(R.id.button1); 
          holder.btn2 = (ImageButton) convertView 
              .findViewById(R.id.button2); 
          holder.btn3 = (ImageButton) convertView 
              .findViewById(R.id.button3); 
          holder.et1 = (EditText) convertView.findViewById(R.id.editText1); 
          holder.et2 = (EditText) convertView.findViewById(R.id.editText2); 
          holder.et3 = (EditText) convertView.findViewById(R.id.editText3); 
          holder.et4 = (EditText) convertView.findViewById(R.id.editText4); 
          holder.et5 = (EditText) convertView.findViewById(R.id.editText5); 
          holder.et6 = (EditText) convertView.findViewById(R.id.editText6); 
          holder.check_sc1 = (CheckBox) convertView 
              .findViewById(R.id.item_check_sc1); 
          holder.check_sc2 = (CheckBox) convertView 
              .findViewById(R.id.item_check_sc2); 
          holder.check_sc3 = (CheckBox) convertView 
              .findViewById(R.id.item_check_sc3); 
          holder.check_oo = (CheckBox) convertView 
              .findViewById(R.id.item_check_oo); 
          convertView.setTag(holder); 
        } 
        if (groupPosition == 1) { 
          convertView = infalInflater.inflate(R.layout.visual_item, null); 
        } 
        if (groupPosition == 2) { 
          convertView = infalInflater.inflate(R.layout.routes_item, null); 
        } 
      } else { 
        holder = (ViewHolder) convertView.getTag(); 
      } 
      return convertView; 
    } 

ответ

12

Сейчас ваш список «не знает», что она имеет три различных типа записей. Вы должны «сказать» это что переопределение следующую функцию адаптера:

@Override 
public int getViewTypeCount() { 
    return 3;  // <-- Here goes your view types count 
} 

Также необходимо переопределить функцию адаптера, чтобы выяснить, какой тип зрения использования:

@Override 
public int getItemViewType(int position) { 
    return getItemViewType(position); // <-- Here must be your logic to get the type of the item 
} 

Так теперь у Android есть пул из трех типов элементов списка, которые вы можете использовать. И теперь вам не нужно «if (groupPosition == 2)» (и т. Д.), Потому что ListView будет использовать эти функции для отображения правильного макета для перехода в функцию getView(). Вышеприведенное верно для простых списков адресов.

Что касается ExpandableAdapters они имеют схожие функции:

public int getGroupTypeCount() 
public int getGroupType (int groupPosition) 
public int getChildType (int groupPosition, int childPosition) 
public int getChildTypeCount() 

Вам нужно переопределить их все, или некоторые из них, в зависимости от того, используете ли вы различные макеты для групп или нет. Что касается Вашего случая, я предлагаю попробовать что-то вроде:

@Override 
public int getChildTypeCount() { 
    return 3; <-- you have three types of views 
} 

@Override 
public int getChildType (int groupPosition, int childPosition) { 
    /* 
    * In case of group 1 this function returns 1, 
    * in case of group 2 it returns 2, and so on. 
    */ 
    return groupPosition; 
} 
+4

В случае, если кто-то получает немного смущены этим, когда вы не можете найти методы, это не интерфейс ExpandableListAdapter, который имеет эти методы, но класс BaseExpandableListAdapter, который реализует интерфейс, и вы можете расширить –

+0

Спасибо .. Это помогло .. –

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