Android:ListView中的项目使用错误的字符串值

时间:2016-11-29 13:41:57

标签: 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文件中的字符串值。

1 个答案:

答案 0 :(得分:0)

我认为问题是以下检查:if(convertView == null) {...。尝试删除此检查(if-else子句),我认为,您将看到预期的结果。