2016-11-30 2 views
-1

Вот Adapter Исходный код, который расширяет BaseAdapter и содержит несколько просмотров.

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() { 

    } 

    // overridden method for enabling the adapter to contain different types of views. 
    @Override 
    public int getViewTypeCount() { 
     return ITEM_TOTAL_TYPES; 
    } 

    // overridden method for enabling the adapter to contain different types of views. 
    @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); 
     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_seek_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); 
       SeekBar sbVolume = (SeekBar) convertView.findViewById(R.id.sbVolume); 

       break; 

      case ITEM_TEXT_AND_SWITCH: 
       convertView = inflater.inflate(R.layout.listitem_text_and_switch, viewGroup, false); 
       TextAndSwitchItem textAndSwitchItem = new TextAndSwitchItem(); 
       TextView tvAlarmOptionTitle = (TextView) convertView.findViewById(R.id.tvAlarmOptionTitle); 
       TextView tvAlarmOptionDescription = (TextView) convertView.findViewById(R.id.tvOptionDescription); 
       Switch switchOption = (Switch) convertView.findViewById(R.id.switchOption); 
       tvAlarmOptionTitle.setText(item.getTitle()); 
       tvAlarmOptionDescription.setText(item.getSubtitle()); 
       switchOption.setChecked(true); 
       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(TextAndSeekbarItem 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); 
    } 
} 

И это часть Activity, которая содержит перечень и onItemClickListener.

listAdapter = new AddNewAlarmOptionItemListAdapter(); 
     lvAlarmOptionList = (ListView) findViewById(R.id.lvAlarmOptionList); 
     lvAlarmOptionList.setAdapter(listAdapter); 

     tpTimePicker = (TimePicker) findViewById(R.id.tpTimePicker); 

     btnCancel = (Button) findViewById(R.id.btnCancel); 
     btnSave = (Button) findViewById(R.id.btnSave); 

     btnCancel.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       cancelAddingNewAlarm(); 
      } 
     }); 

     btnSave.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       saveAlarm(); 
      } 
     }); 

     initializeListItems(); 
     addItemsToListView(); 

     lvAlarmOptionList.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) { 
       Toast.makeText(CreateNewAlarmActivity.this, position, Toast.LENGTH_SHORT).show(); 
      } 
     }); 

Когда я запустил этот код, я ожидал, что сообщение Тост будет отображаться с соответствующим номером позиции, но он упал с этим сообщением - android.content.res.Resources$NotFoundException: String resource ID #0x0.

+0

Это потому, что тост не может раздувать значения int. Вы должны использовать String.valueOf (position) –

ответ

0

Вы должны использовать

Toast.makeText(CreateNewAlarmActivity.this, ""+position, Toast.LENGTH_SHORT).show(); 

из вашего кода, вы пытаетесь тоста позицию элемента в ListView мыши. Но тост принимает сообщение в String ресурс для отображения.

0

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

Toast.makeText имеет две версии

первый метод будет принимать контекст, RESOURCEID -> Integer, длительность

  Toast.makeText(context, resource, Toast.LENGTH_SHORT).show(); 

второй метод будет принимать контекст, строка сообщения, длительность

  Toast.makeText(context, resource, Toast.LENGTH_SHORT).show(); 

В вашем случае ваша текущая позиция, так что она будет вызывать 1-й метод, она будет искать любой ресурс с id 0, который не будет найден, поэтому он будет генерировать ресурсы $ NotFoundException.

Решение:

Toast.makeText(context, string.valueof(resource), Toast.LENGTH_SHORT).show(); 
0
lvAlarmOptionList.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) { 
      Toast.makeText(CreateNewAlarmActivity.this, position+"", Toast.LENGTH_SHORT).show(); 
     } 
    }); 
Смежные вопросы