2016-11-29 54 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子句),我想,你会看到预期的结果。

相关问题