2015-02-09 2 views
1

У меня есть список заголовков CheckBox, и я хочу иметь контроль, который будет проверяться по умолчанию. Поэтому я пытаюсь получить правильное представление и проверить его, но по какой-то причине он не работает. любая идея почему?Check CheckBox получает от arrayadapter

form_checkbox_item.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:gravity="center" 
    android:orientation="horizontal" > 
    <CheckBox 
     android:id="@+id/checkBox1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="40dp" 
     android:textColor="@color/background_red" 
     android:padding="12dp" 
     /> 

    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="10dp" 
     android:text="TextView" 
     android:textColor="@color/background_red" 
     android:textSize="18sp" /> 

</LinearLayout> 

CheckboxAdapter.java

package com.rgis.datacollection.ui.adapters; 

import android.app.Activity; 
import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.CheckBox; 
import android.widget.TextView; 

import com.rgis.datacollection.R; 

import java.util.List; 

public class CheckboxAdapter extends ArrayAdapter 
{ 
    Context context; 
    List<String> checkboxItems; 
    public CheckboxAdapter(Context context, List<String> resource) 
    { 
     super(context, R.layout.form_checkbox_item ,resource); 

     this.context = context; 
     this.checkboxItems = resource; 
    } 

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

     LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
     convertView = inflater.inflate(R.layout.form_checkbox_item, parent, false); 
     TextView textView = (TextView) convertView.findViewById(R.id.textView1); 
     CheckBox cb = (CheckBox) convertView.findViewById(R.id.checkBox1); 

     textView.setText(checkboxItems.get(position)); 
     return convertView; 
    } 
} 

часть formCheckBox.java

formItem = (LinearLayout) linflater.inflate(R.layout.checkbox_layout, null); 
    listView = (ListView) formItem.findViewById(R.id.checkboxList); 
    stringList = dbUtils.getServiceConfigForFixedOptions(attribute.getListValues()); 
    CheckboxAdapter checkboxAdapter = new CheckboxAdapter(context, stringList); 
    listView.setAdapter(checkboxAdapter); 

    CheckBox cb = (CheckBox) checkboxAdapter.getView(0, null, listView).findViewById(R.id.checkBox1); 
    cb.setChecked(true); 
+0

Вы можете установить этот флажок. Но проверка происходит в другом месте. Правильно? – user1728071

+0

@Bruce: Не могли бы вы объяснить, что происходит? – user1728071

ответ

1

Один путь, имеющий список булевы в адаптере, который представляет состояние каждого флажка. Вы должны инициализировать, что ложно, а затем с помощью метода setCheckbox изменения состояния конкретного флажка

public class CheckboxAdapter extends ArrayAdapter 
{ 
    Context context; 
    List<Boolean> checkboxState; 
    List<String> checkboxItems; 
    public CheckboxAdapter(Context context, List<String> resource) 
    { 
     super(context, R.layout.form_checkbox_item ,resource); 

     this.context = context; 
     this.checkboxItems = resource; 
     this.checkboxState = new ArrayList<Boolean>(Collections.nCopies(resource.size(), true)); 
    } 

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

     LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
convertView = inflater.inflate(R.layout.form_checkbox_item, parent, false); 
     TextView textView = (TextView) convertView.findViewById(R.id.textView1); 
     CheckBox cb = (CheckBox) convertView.findViewById(R.id.checkBox1); 

     textView.setText(checkboxItems.get(position)); 
     cb.setChecked(checkboxState.get(position)); 
     return convertView; 
    } 

Этого метод позволит вам контролировать, какие Флажки Активизированных

void setChecked(boolean state, int position) 
    { 
    checkboxState.set(position, state); 
    } 
+0

Спасибо. работает :) – Bruse

3

Я рекомендую вам реализовать этот путь :

  1. Пропустить булевский массив в конструкторе для инициализации состояний.
  2. Зарегистрировать слушателя для изменений состояния флажка для обновления массива состояний.
  3. Реализовать «isChecked», чтобы проверить, проверен ли предмет в определенном положении.

Используя «getCount» и «isChecked», вы можете перемещать список извне адаптера.

Вот код:

public class CheckboxAdapter extends ArrayAdapter<String> { 
    List<String> subcategories; 
    boolean[] checked; 

    public SubcategoriesAdapter(Context context, List<String> subcategories, boolean[] checked) { 
     super(context, android.R.layout.simple_list_item_1); 

     this.subcategories = subcategories; 
     this.checked = checked; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
     convertView = inflater.inflate(R.layout.form_checkbox_item, parent, false); 
     TextView textView = (TextView) convertView.findViewById(R.id.textView1); 
     CheckBox cb = (CheckBox) convertView.findViewById(R.id.checkBox1); 

     textView.setText(checkboxItems.get(position)); 

     // Set state 
     cb.setChecked(checked[position]); 

     // Register listener 
     cb.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       checked[position] = cb.isChecked(); 
      } 
     }); 

     return convertView; 
    } 

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

    @Override 
    public DTOSubcategoria getItem(int position) { 
     return subcategories.get(position); 
    } 

    public void selectAll() { 
     selectAll(true); 
     notifyDataSetChanged(); 
    } 

    public void selectNone() { 
     selectAll(false); 
     notifyDataSetChanged(); 
    } 

    void selectAll(boolean selected) { 
     for (int i = 0; i < checked.length; i++) { 
      checked[i] = selected; 
     } 
    } 

    public boolean isChecked(int index) { 
     return checked[index]; 
    } 
} 

ПРИМЕЧАНИЕ: После того как вы исправить адаптер, рассмотреть вопрос об изменении его использовать шаблон ViewHolder и тем самым улучшить производительность.

+1

Спасибо. Похоже, он должен работать, я сделал это, как в другом ответе. – Bruse