2016-11-29 2 views
0

В настоящее время я пытаюсь добавить некоторые элементы с разными представлениями в список. Чтобы включить просмотр списка с несколькими типами представлений, я создал класс адаптера следующим образом.Android: элементы в ListView с неправильными строковыми значениями

public class AddNewAlarmOptionItemListAdapter extends BaseAdapter { 

    private static final int ITEM_TEXT_ONLY = 0; 
    private static final int ITEM_TEXT_AND_PROGRESS_BAR = 1; 
    private static final int ITEM_TEXT_AND_SWITCH = 2; 

    // number of types in total. 
    private static final int ITEM_TOTAL_TYPES = 3; 

    private ArrayList<AddNewAlarmOptionItem> itemLists = new ArrayList<>(); 

    public AddNewAlarmOptionItemListAdapter() { 

    } 

    @Override 
    public int getViewTypeCount() { 
     return ITEM_TOTAL_TYPES; 
    } 

    @Override 
    public int getItemViewType(int position) { 
     return itemLists.get(position).getType(); 
    } 

    @Override 
    public int getCount() { 
     return itemLists.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return itemLists.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup viewGroup) { 
     final Context context = viewGroup.getContext(); 
     int viewType = getItemViewType(position); 

     if(convertView == null) { 
      LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      AddNewAlarmOptionItem item = itemLists.get(position); 

      switch(viewType) { 
       case ITEM_TEXT_ONLY: 
        convertView = inflater.inflate(R.layout.listitem_text_only, viewGroup, false); 
        TextView tvSubject = (TextView) convertView.findViewById(R.id.tvTitle); 
        TextView tvOptions = (TextView) convertView.findViewById(R.id.tvSubtitle); 
        tvSubject.setText(item.getTitle()); 
        tvOptions.setText(item.getSubtitle()); 
        break; 

       case ITEM_TEXT_AND_PROGRESS_BAR: 
        convertView = inflater.inflate(R.layout.listitem_text_and_progress_bar, viewGroup, false); 
        TextView tvAlarmType = (TextView) convertView.findViewById(R.id.tvAlarmType); 
        TextView tvAlarmOption = (TextView) convertView.findViewById(R.id.tvAlarmOption); 

        tvAlarmType.setText(item.getTitle()); 
        tvAlarmOption.setText(item.getSubtitle()); 

        ImageView ivSpeaker = (ImageView) convertView.findViewById(R.id.ivSpeaker); 
        ProgressBar pbVolume = (ProgressBar) convertView.findViewById(R.id.pbVolume); 

        break; 

       case ITEM_TEXT_AND_SWITCH: 
        convertView = inflater.inflate(R.layout.listitem_text_and_switch, viewGroup, false); 
        TextView tvAlarmOptionTitle = (TextView) convertView.findViewById(R.id.tvAlarmOptionTitle); 
        TextView tvAlarmOptionDescription = (TextView) convertView.findViewById(R.id.tvOptionDescription); 
        tvAlarmOptionTitle.setText(item.getTitle()); 
        tvAlarmOptionDescription.setText(item.getSubtitle()); 
        break; 
      } 
     } 
     return convertView; 
    } 

    // add a text-only item to list view 
    public void addItem(TextOnlyItem item) { 
     item.setType(ITEM_TEXT_ONLY); 
     itemLists.add(item); 
    } 

    // add a text-and-progress-bar item to list view 
    public void addItem(TextAndProgressBarItem item) { 
     item.setType(ITEM_TEXT_AND_PROGRESS_BAR); 
     itemLists.add(item); 
    } 

    // add a text-and-switch item to list view 
    public void addItem(TextAndSwitchItem item) { 
     item.setType(ITEM_TEXT_AND_SWITCH); 
     itemLists.add(item); 
    } 
} 

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

private void initializeListItems() { 
    itemRepeatAlarm = new TextOnlyItem(); 
    itemRepeatAlarm.setTitle(getString(R.string.repeat_weekly)); 
    itemRepeatAlarm.setSubtitle(getString(R.string.never)); 

    itemAlarmType = new TextAndProgressBarItem(); 
    itemAlarmType.setTitle(getString(R.string.alarm_type)); 
    itemAlarmType.setSubtitle(getString(R.string.sound)); 

    itemAlarmTone = new TextOnlyItem(); 
    itemAlarmTone.setTitle(getString(R.string.alarm_tone)); 
    itemAlarmTone.setSubtitle(getString(R.string.never)); 

    itemSnooze = new TextAndSwitchItem(); 
    itemSnooze.setTitle(getString(R.string.snooze)); 
    itemSnooze.setSubtitle(getString(R.string.snooze_details)); 

    itemIncreasingVolume = new TextAndSwitchItem(); 
    itemIncreasingVolume.setTitle(getString(R.string.increasing_volume)); 
    itemIncreasingVolume.setSubtitle(getString(R.string.increasing_volume_detail)); 

    itemAlarmName = new TextOnlyItem(); 
    itemAlarmName.setTitle(getString(R.string.alarm_name)); 
    itemAlarmName.setSubtitle(getString(R.string.none)); 
} 

private void addItemsToListView() { 
    listAdapter.addItem(itemRepeatAlarm); 
    listAdapter.addItem(itemAlarmType); 
    listAdapter.addItem(itemAlarmTone); 
    listAdapter.addItem(itemSnooze); 
    listAdapter.addItem(itemIncreasingVolume); 
    listAdapter.addItem(itemAlarmName); 
    listAdapter.notifyDataSetChanged(); 
} 

Когда я запустил код, результат был далек от того, что я ожидал. Вот скриншот.

enter image description here

Вот еще один скриншот, который взял на себя верхнюю часть списка.

enter image description here

Как вы можете видеть первое изображение, элементы с выключателями являются дубликатом, даже если я установить различные тексты каждый. И сравнивая первый и второй, один элемент дублируется (пожалуйста, найдите пункт TextOnlyItem с надписями «Повторить еженедельно» и «Никогда»). Это очень странно, поскольку еще один TextOnlyItem показывает ожидаемое строковое значение «Тревожный тон» и «Никогда».

Конечно, я уже дважды проверил строковые значения в файле xml.

ответ

0

Я думаю, что проблема в следующей проверке: if(convertView == null) {.... Попробуйте удалить эту проверку (предложение if-else), и я думаю, вы увидите ожидаемые результаты.

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