現在、別のビューのアイテムをリストビューに追加しようとしています。 リストビューで複数のタイプのビューを使用できるようにするため、次のようにアダプタクラスを作成しました。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();
}
私がコードを実行したとき、結果は私が期待していたものとは大きく異なりました。ここにスクリーンショットがあります。
ここでは、リストビューの上部を取った別のスクリーンショットです。
あなたが最初の画像を見ることができるように、スイッチを持つアイテムは、私はそれぞれ異なるテキストを設定していても、重複しています。 1回目と2回目を比較すると、1つのアイテムが重複しています(TextOnlyItem
のアイテムは「毎週繰り返す」と「しない」という単語があります)。別のTextOnlyItem
が期待される文字列値 'Alarm tone'と 'Never'を表示しているので、これは非常に奇妙です。
もちろん、xmlファイルの文字列値をすでに確認しました。