Вопрос по checkbox, android, listview – Как связать флажок для каждого контакта в заполненном списке?

2

У меня было много проблем с этой проблемой. У меня есть просмотр списка, который содержит:

ImageView / contactName / TextView / CheckBox

contactName в списке просмотра заполняется чтением контактов на телефоне изSimpleCursorAdapter, Все элементы отображаются при запуске приложения, но проблема, с которой я столкнулся, заключается в подключении флажков к соответствующему элементу в списке.

В результате некоторых исследований я обнаружил, что должен использоватьgetView() связать чекбоксы с элементами в списке, но на практике я, кажется, не могу заставить его работать правильно. Кроме того, ни один из примеров, которые я пробовал, действительно не объясняет, как применять getView (). Самый полный пример, из которого я работал, отсюда:

http://androidcocktail.blogspot.com/2012/04/adding-checkboxes-to-custom-listview-in.html

Суть в том, что это читает и заполняет мой список с моими контактами:

<code>private void populateContactList() {
    // Build adapter with contact entries
    Cursor cursor = getContacts();
    String[] fields = new String[] {
            ContactsContract.Data.DISPLAY_NAME       
    };

    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.contact_entry, cursor,
            fields, new int[] {R.id.contactEntryText});    
    lv.setAdapter(adapter);        
} // END POPULATECONTACTLIST


private Cursor getContacts()
{ 
    // Run query
    Uri uri = ContactsContract.Contacts.CONTENT_URI;
    String[] projection = new String[] {
            ContactsContract.Contacts._ID,
            ContactsContract.Contacts.DISPLAY_NAME
    };
    String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '" +
            (chkboxAllVisible ? "0" : "1") + "'";
    String[] selectionArgs = null;
    String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC";

    return managedQuery(uri, projection, selection, selectionArgs, sortOrder);
} // END GETCONTACTS 
</code>

How do I link each checkbox to the a corresponding contact items in my listview?

Ваш Ответ

3   ответа
-1

вы можете использовать стандартный просмотр списка с возможностью установки флажков, но только по одному для каждого элемента списка читать представление списка на сайте разработчика Android для свойства представления списка. у listview есть флажок, вам просто нужно установить представление списка с несколькими выборами

Edit 1:

перейди по ссылке :кликните сюда

public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);

      setListAdapter(new ArrayAdapter<String>(this,
              android.R.layout.simple_list_item_multiple_choice, GENRES));

      final ListView listView = getListView();

      listView.setItemsCanFocus(false);
      listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
  }
Можете ли вы привести пример? SpicyWeenie
ты уверен, подожди .......
Причина в том, что мне нужно запрограммировать флажок для работы с каждым отдельным контактом. Кроме того, у меня есть флажок за пределами списка, который служит главным флажком. Когда установлен главный флажок, его задача состоит в том, чтобы проверять все флажки в списке. И чтобы проверить флажки в списке, пытаясь реализовать LogCat для отображения, какой элемент проверен. SpicyWeenie
3

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

ЗДЕСЬ МОЯ СОЗДАННАЯ ФУНКЦИЯ ДЕЯТЕЛЬНОСТИ.

super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ArrayList<String> elements = new ArrayList<String>();
for (int i = 0; i < 10; i++) {
    elements.add("elements " + i);
}

CheckBox master_cb = new CheckBox(getApplicationContext());
master_cb.setText("Check All");
//HERE IS THE LIST VIEW WHICH I HAVE CREATED IN MY XML FILE.
ListView lv = (ListView) findViewById(R.id.listView1);
//HERE I AM CREATING CUSTOM ADAPTER OBJECT.
my_custom_adapter adapter = new my_custom_adapter(this, android.R.layout.simple_list_item_1, elements);
lv.addHeaderView(master_cb);
lv.setAdapter(adapter);
master_cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        Intent my_intent = new Intent("master_check_change");
        my_intent.putExtra("check_value", isChecked);
        sendBroadcast(my_intent);
    }
});

}

ЗДЕСЬ МОЙ ТАМОЖЕННЫЙ АДАПТЕР.

public class my_custom_adapter extends ArrayAdapter<String> {
    private Context context                     = null;
    ArrayList<String>  elements                 = null;
    private ArrayList<Boolean> itemChecked      = null;

    public my_custom_adapter(Context context, int type, ArrayList<String>  elements)
    {
        super(context, type, elements);
        this.elements =  elements;
        this.context = context;
        itemChecked = new ArrayList<Boolean>();
        BroadcastReceiver receiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                if (intent.getAction().equals("master_check_change")) {
                    boolean check_value = intent.getBooleanExtra("check_value", false);
                    set_checked(check_value);
                    notifyDataSetChanged();
                }
            }
        };
        context.registerReceiver(receiver, new IntentFilter("master_check_change"));
        set_checked(false);
    }

    // AS EVERY TIME LISTVIEW INFLATE YOUR VIEWS WHEN YOU MOVE THEM SO YOU NEED TO SAVE ALL OF YOUR CHECKBOX STATES IN SOME ARRAYLIST OTHERWISE IT WILL SET ANY DEFAULT VALUE.
    private void set_checked(boolean is_checked)
    {
        for (int i=0; i < elements.size(); i++) {
            itemChecked.add(i, is_checked);
        }
    }

    //THIS IS SIMPLY A CLASS VIEW WILL HOLD DIFFERENT VIEWS OF YOUR ROW.
    static class ViewHolder
    {
        public TextView tv;
        public CheckBox cb;
        public ImageView iv;
    }

    @Override
    public View getView (final int position, View convertView, ViewGroup parent)
    {
        View rowView = convertView;
        ViewHolder holder = null;

        if (rowView == null) {
            LayoutInflater inflater = (LayoutInflater)context.getSystemService(
                                               Context.LAYOUT_INFLATER_SERVICE);
            // HERE I AM INFLATING LISTVIEW LAYOUT.
            rowView = inflater.inflate(R.layout.inflated_layout, null, false);
            holder = new ViewHolder();
            holder.cb = (CheckBox) rowView.findViewById(R.id.checkBox1);
            holder.tv = (TextView) rowView.findViewById(R.id.textView1);
            holder.iv = (ImageView) rowView.findViewById(R.id.imageView1);
            rowView.setTag(holder);

        } else {
            holder = (ViewHolder) rowView.getTag();
        }

        if (holder != null) {
            holder.tv.setText(elements.get(position));

            holder.cb.setOnCheckedChangeListener(new OnCheckedChangeListener() {

                @Override
                public void onCheckedChanged(CompoundButton buttonView,
                                             boolean isChecked) {
                    itemChecked.set(position, isChecked);
                }
            });

            if(position < itemChecked.size()) {
                holder.cb.setChecked(itemChecked.get(position));
            }
        }
        return rowView;
    }
}

Файл main.xml это:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/RelativeLayout1"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >


    <ListView
        android:id="@+id/listView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true" >

    </ListView>

</RelativeLayout>

Код inflated_layout:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/RelativeLayout1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical" >

    <CheckBox
        android:id="@+id/checkBox1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:layout_marginRight="17dp" />




    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:layout_toLeftOf="@+id/checkBox1"
        android:layout_toRightOf="@+id/imageView1"
        android:singleLine="true"
        android:text="Large Text"
        android:textAppearance="?android:attr/textAppearanceLarge" />


    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerVertical="true"
        android:src="@drawable/ic_launcher" />

</RelativeLayout>

если вы хотите использовать строковый массив вместо arraylist, замените

    String[] elements = new String[10];
    for (int i = 0; i < 10; i++) {
        elements[i] = "elements " + i;
    }

// В ВАШЕМ ТАМОЖЕННОМ АДАПТЕРЕ CUNSTRUCTOR

public my_custom_adapter(Context context, int type, String[]  elements)

и еще несколько изменений соответственно

Нет, вам не нужно устанавливать приемник вещания в файле манифеста. просто добавьте его, вам не нужно ничего делать, просто создайте уважаемые файлы и классы в новом проекте и запустите его.
не меняйте пользовательский адаптер на строку и передавайте строку в супер пользовательского адаптера. он может принимать как массив данных, так и массив строк.
Главный флажок работает! У меня есть несколько вопросов, хотя. Как мне установить количество элементов на размер количества контактов? SpicyWeenie
супер (контекст, тип, элементы) все, что вы передадите в этом как & quot; элементы & quot; будет создано столько строк, так что просто передайте все ваши контакты в виде массива, и он автоматически создаст строки, которые будут равны количеству контактов. В моем примере ни одна из строк не будет elements.size (). Вы настроили свой адаптер так, чтобы передать любой список в вашем адаптере
Хорошо, я применил ваш пример, но перед тем, как я протестирую его, должен ли я указать в своем манифесте получателя для вашего пользовательского класса? Или я мог бы просто добавить это как обычное занятие? Спасибо за терпение. Это очень ценится. :) SpicyWeenie
0
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.contact_entry, cursor,
        fields, new int[] {R.id.contactEntryText});

что вы отображаете только текстовый источник (в поле) с фактическим textView (R.id.contactEntryText) ... Так же вам нужно добавить ... другое поле и соответствующий вид для сопоставления для Checkbox.

или лучше создать CustomAdapter, вы можете найти учебники по этому и переопределить метод getView, вы получите максимальную гибкость. Вы можете делать все, что хотите.

Это может помочь:http://windrealm.org/tutorials/android/listview-with-checkboxes-without-listactivity.php

@prikshit я попробую эту ссылку SpicyWeenie
Есть некоторые проблемы, когда вы будете следовать этим флажкам, чтобы автоматически прокручиваться при прокрутке

Похожие вопросы