Установите ограничение на режим ListView с несколькими разделами

#android #listview #android-listview

#Android #просмотр списка #android-listview

Вопрос:

У меня есть ArrayList определенных строк, определенных имен, и я добавляю в свой объект ListView следующим образом:

Я создаю адаптер массива и устанавливаю режим множественного выбора как в адаптере массива, так и в объекте ListView. Это отлично работает, я могу прокручивать и выбирать несколько объектов. Но проблема в том, что я хочу заставить пользователя выбирать только 4 элемента из ListView. Как я могу установить ограничение?

 adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_multiple_choice,names);
nameList.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
nameList.setAdapter(adapter);
  

Ответ №1:

Вы можете создать List , и всякий List раз, когда он превышает определенный размер, вы можете снять флажок с первого параметра List и удалить его из List , а затем добавить новый или даже запретить им выбирать другой.

Итак, просто проверьте onClick , какой у вас размер списка, а затем решите, хотите ли вы обработать этот дополнительный элемент.

Ответ №2:

Попробуйте это:

 public class AccountListAdapter extends BaseAdapter {

@SuppressWarnings("unused")
private final static String TAG = AccountListAdapter.class.getSimpleName();

private Context context;
private List<Account> rowItems;

private int selectedItemCounter = 0;

private final int limit;

public AccountListAdapter(Context context, List<Account> items, int limit) {
    this.context = context;
    this.rowItems = items;
    this.limit = limit;
}

public View getView(final int position, View convertView, ViewGroup parent) {

    LayoutInflater mInflater = (LayoutInflater) context
            .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

    final Account rowItem = (Account) getItem(position);

    convertView = mInflater.inflate(R.layout.account_selection_item, null);

    TextView tv = (TextView) convertView.findViewById(R.id.textView);
    ToggleButton tb = (ToggleButton) convertView
            .findViewById(R.id.toggleButton);

    tb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

        @Override
        public void onCheckedChanged(CompoundButton buttonView,
                boolean isChecked) {

            if (isChecked amp;amp; !rowItem.isSelected()) {

                if (selectedItemCounter >= limit) {
                    Toast.makeText(context,
                            "can't be more"   selectedItemCounter,
                            Toast.LENGTH_SHORT).show();
                    buttonView.setChecked(false);
                    return;
                }

                rowItem.setSelected(true);
                selectedItemCounter  ;
            } else if (!isChecked amp;amp; rowItem.isSelected()) {
                rowItem.setSelected(false);
                selectedItemCounter--;
            }

        }
    });

    tv.setText(rowItem.getDevId());
    tb.setChecked(rowItem.isSelected());

    return convertView;
}

@Override
public int getCount() {
    return rowItems.size();
}

@Override
public Object getItem(int position) {
    return rowItems.get(position);
}

@Override
public long getItemId(int position) {
    return rowItems.indexOf(getItem(position));
}
}
  

пытался улучшить свой код с помощью шаблона ViewHolder, но не удалось.
если у кого-нибудь есть идея получше, пожалуйста, дайте мне знать.

Ответ №3:

Да, у меня была идея, и я нашел хорошее решение.
Я решил проблему «после прокрутки пользователь listview также может снова установить более 3 флажков». установить static int count = 0;

 if (isChecked) {
    count  ;
} else if (!isChecked) {
    count--;
}

if (count >= 4) {
    buttonView.setChecked(false);
    count--;
} else {
    int getPosition = (Integer) buttonView.getTag();
    contact.get(getPosition).setSelected(buttonView.isChecked());
} 
  

И наиболее важным является то, что добавить count=0 в else и viewHolder.chkContact.setTag(position) после else;

 if(convertView == null){   

}
else
{
    viewHolder = (ViewHolder) convertView.getTag();
    count=0;
}
viewHolder.chkContact.setTag(position);