#android #listview #checkbox
#Android #listview #флажок
Вопрос:
Хай я пытаюсь разработать приложение, с помощью которого я мог бы отправлять sms и электронную почту определенной группе людей..
У меня есть listview, показывающий контакты, которые находятся в моей группе.Каждая строка имеет вид
TextView (имя) TextView (телефон) Флажок (sms)
TextView (идентификатор электронной почты) Флажок (почта)
Я использовал пользовательский адаптер для отображения контактных данных в listview.я установил прослушиватель onitemclick для поиска позиции строки.. Я должен отправлять sms и электронную почту тем контактам, для которых флажки установлены как true.как я могу найти состояние каждого из флажков?
Пожалуйста, помогите мне .. заранее благодарю..
Я добавил ниже пользовательский адаптер, который я создал..
открытый класс ContactInfoAdapter расширяет ArrayAdapter{
private ArrayList<Boolean> mChecked_sms,mChecked_email;
Context context;
int layoutResourceId;
ContactInfo data[] = null;
public ContactInfoAdapter(Context context, int layoutResourceId, ContactInfo[] data) {
super(context, layoutResourceId, data);
this.layoutResourceId = layoutResourceId;
this.context = context;
this.data = data;
mChecked_sms = new ArrayList<Boolean>();
mChecked_email = new ArrayList<Boolean>();
for (int i = 0; i < this.getCount(); i ) {
mChecked_sms.add(i, false);
mChecked_email.add(i,false);
}
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final ContactHolder holder;
View row = convertView;
if(row == null)
{
LayoutInflater inflater = ((Activity)context).getLayoutInflater();
row = inflater.inflate(layoutResourceId, parent, false);
holder = new ContactHolder();
holder.txtName = (TextView)row.findViewById(R.id.textViewName);
holder.txtPhone = (TextView) row.findViewById(R.id.textViewPhone);
holder.txtEmail = (TextView) row.findViewById(R.id.textViewEmail);
holder.cb_sms_state = (CheckBox) row.findViewById(R.id.checkBox1);
holder.cb_email_state = (CheckBox) row.findViewById(R.id.checkBox2);
row.setTag(holder);
}
else
{
holder = (ContactHolder)row.getTag();
}
ContactInfo contact = data[position];
holder.txtName.setText(contact.name);
holder.cb_sms_state.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
if (holder.cb_sms_state.isChecked()) {
mChecked_sms.set(position, true);
Toast.makeText(getContext(), "checked", 2).show();
} else {
mChecked_sms.set(position, false);
}
}
});
holder.cb_sms_state.setChecked(mChecked_sms.get(position));
holder.cb_email_state.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
if (holder.cb_email_state.isChecked()) {
mChecked_email.set(position, true);
Toast.makeText(getContext(), "checked", 2).show();
} else {
mChecked_email.set(position, false);
}
}
});
holder.cb_email_state.setChecked(mChecked_email.get(position));
holder.txtPhone.setText(contact.number);
holder.txtEmail.setText(contact.email);
return row;
}
static class ContactHolder
{
TextView txtName;
TextView txtPhone;
TextView txtEmail;
CheckBox cb_sms_state;
CheckBox cb_email_state;
}
}
Класс ContactInfo является :
публичный класс ContactInfo {
public String name;
public String number;
public String email;
public boolean sms_state;
public boolean email_state;
public ContactInfo(){
super();
}
public ContactInfo(String name,String number,String email,boolean sms_state,boolean email_state) {
super();
this.name = name;
this.number = number;
this.email = email;
this.sms_state = sms_state;
this.email_state = email_state;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setNUmber(String number) {
this.number = number;
}
public String getNumber() {
return number;
}
public void setEmail(String email) {
this.email = email;
}
public String getEmail() {
return email;
}
public void setSms_state(Boolean sms_state)
{
this.sms_state = sms_state;
}
public Boolean getSms_state(){
return sms_state;
}
public void setEmail_state(Boolean email_state)
{
this.email_state = email_state;
}
public Boolean getEmail_state(){
return email_state;
}
Комментарии:
1. Привет, ребята … я понял … спасибо за помощь…
2. Чтобы получить отмеченные состояния флажков, которые нам нужно сделать: listview.getAdapter().data
Ответ №1:
Внутри getView()
метода вы должны реализовать a OnCheckedChangeListener
для флажка.
Вот код прослушивателя, скажем, например:
ChkBx.setOnCheckedChangeListener(new OnCheckedChangeListener()
{
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
{
if ( isChecked )
{
// perform logic
}
}
});
Комментарии:
1. верно! но я думаю, что должен быть шаблон проектирования, в котором, если в строке списка есть флажок, состояние флажка должно быть изменено при нажатии на всю строку списка, а не только на сам флажок.
2. Я реализовал это .. но мне нужно знать, как я могу получить arraylist, в котором я храню эти значения, на странице активности.
Ответ №2:
Ответ №3:
Вот простой пример:
mContactListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long arg3) {
CheckBox chkContact = (CheckBox) view.findViewById(R.id.listrow_contact_chkContact);
if (chkContact.isChecked()) {
...
}
});
Комментарии:
1. обратите внимание, это будет работать для щелчка по всему списку, только если вы установите правильные параметры для своего флажка:
2. <Флажок android: id=»@ id/listrow_contact_chkConteact» android:layout_width=»wrap_content» android:layout_height=»wrap_content» android: кликабельный =»false» android: фокусируемый =»false» />
3. Да .. я установил флажок focusable как false, а listview focusable как true .. мне нужно знать, как я могу повторно использовать значения в arraylist, в которые я сохраняю состояния флажков.
4. почему бы вам не создать новый список<Contact> readyForSendingContacts и List.add внутри if (chkContact.IsChecked()){…}? Это также эффективно, когда вы предоставляете пользователю проверку подтверждения. В противном случае вы могли бы добавить логическое значение IsChecked в свой контактный POJO, но ИМХО в этом нет необходимости. Также помните, что вы не можете полагаться на ChkBx.IsChecked, пока он находится внутри (массива?) Адаптер и ChkBx не полагаются на контактный POJO…
Ответ №4:
У меня была эта проблема с моим приложением Hasta La Vista, я создал пользовательский listview с проверенными элементами, и мне нужно было получить проверенные элементы, это было решение:
ListView lv = getListView(); //ver listview
if(lv != null){
final SparseBooleanArray checkedItems = lv.getCheckedItemPositions(); //get checked items
if (checkedItems == null) {
return;
}
final int checkedItemsCount = checkedItems.size();
for (int i = 0; i < checkedItemsCount; i) {
// This tells us the item position we are looking at
final int position = checkedItems.keyAt(i);
// This tells us the item status at the above position
final boolean isChecked = checkedItems.valueAt(i);
if(isChecked){
//get item from list and do something
lv.getAdapter().getItem(position);
}
}
}
Ответ №5:
Поскольку представления ListView перерабатываются, вы не можете полагаться на прослушивание конкретного экземпляра, вам придется сохранить «проверенное» состояние в вашей модели данных. Вам также понадобится пользовательский адаптер списка, в котором вы создаете и заполняете отдельные записи. Необходимо выполнить следующее: — в переопределенном getView() либо создать новое представление (в случае, если convertView не был предоставлен), либо создать новое — заполнить поля viewv из вашей модели данных — удалить старый прослушиватель onclick и установить новый (может быть анонимный внутренний класс), модифицирующий вашу модель данных
PS: повторное использование представлений важно, если ваш список большой
Комментарии:
1. У меня есть пользовательский интерфейс для заполнения listview .. и в getView() я использовал arraylist для хранения логического значения флажков, установив прослушиватель checkedchange. как я могу получить этот массив для действия.
2. Я понятия не имею, так как я не видел ваш код. Опубликуйте его, тогда кто-нибудь может вам помочь