#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);