2016-11-29 8 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

あなたが最初の画像を見ることができるように、スイッチを持つアイテムは、私はそれぞれ異なるテキストを設定していても、重複しています。 1回目と2回目を比較すると、1つのアイテムが重複しています(TextOnlyItemのアイテムは「毎週繰り返す」と「しない」という単語があります)。別のTextOnlyItemが期待される文字列値 'Alarm tone'と 'Never'を表示しているので、これは非常に奇妙です。

もちろん、xmlファイルの文字列値をすでに確認しました。

答えて

0

私は問題が次の点検であると思う:if(convertView == null) {...。このチェックを外してみると(if-else節)、私は期待した結果が見えると思います。

関連する問題