2013-06-19 2 views
0

Я работаю над приложением, где я использую пользовательские gridview с изображениями & checkboxes. Отображение gridview с изображениями & checkboxes работает хорошо. Но здесь моя проблема заключается в том, чтобы сделать один флажок установленным, если я прокрутил сетку, еще один флажок установлен еще &, если я прокручу вниз, он отображается. Здесь checkbox checked state was maintaing. Мой Adapterclass кодекс ..Как сохранить постоянство CheckBox в Gridview Android (режим checkbox)?

MyGrid.java

public class ImageAdapter extends BaseAdapter { 
    private LayoutInflater mInflater; 

    public ImageAdapter() { 
     mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    public int getCount() { 
     return count; 
    } 

    public Object getItem(int position) { 
     return position; 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     final ViewHolder holder; 
     if (convertView == null) { 
      holder = new ViewHolder(); 
      convertView = mInflater.inflate(R.layout.galleryitem, null); 
      holder.imageview = (ImageView) convertView.findViewById(R.id.thumbImage); 
      holder.checkbox = (CheckBox) convertView.findViewById(R.id.itemCheckBox); 
      holder.textview = (TextView) convertView.findViewById(R.id.saved_image_name); 

      Drawable background = holder.textview.getBackground(); 
      background.setAlpha(150); 
      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     holder.checkbox.setId(position); 
     holder.imageview.setId(position); 
     holder.textview.setId(position); 

     holder.checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener() { 

      @Override 
      public void onCheckedChanged(CompoundButton arg0, boolean arg1) { 
       // TODO Auto-generated method stub 
       CheckBox cb = (CheckBox) holder.checkbox; 

       int id = cb.getId(); 

       if (thumbnailsselection[id]) { 
        cb.setChecked(false); 
        thumbnailsselection[id] = false; 
        selected_images.remove(String.valueOf(id)); 
       } else { 
        cb.setChecked(true); 
        thumbnailsselection[id] = true; 
        if (selected_images.contains(String.valueOf(id))) { 

        }else{ 
         selected_images.add(String.valueOf(id)); 
        } 
       } 
      } 
     }); 

     holder.imageview.setOnClickListener(new OnClickListener() { 

      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       int id = v.getId(); 
       Intent intent = new Intent(); 
       intent.setAction(Intent.ACTION_VIEW); 
       intent.setDataAndType(Uri.parse("file://" + arrPath[id]), 
       "image/*"); 
       startActivity(intent); 
      } 
     }); 
     if (arrPath[position] == null || arrPath[position].equals(null)) { 

     }else{ 
     image_name=extractString(arrPath[position]); 
     String[] splited_name = image_name.split("\\."); 

     for (int i = 0; i < selected_images.size(); i++) { 
      if (selected_images.get(i).equals(String.valueOf(position)) || selected_images.get(i) == String.valueOf(position)) { 
       holder.checkbox.setChecked(true); 
      } 
     } 

     holder.textview.setText(splited_name[0]); 
     holder.imageview.setImageBitmap(thumbnails[position]); 
     holder.checkbox.setChecked(thumbnailsselection[position]); 
     holder.id = position; 

     holder.imageview.setScaleType(ImageView.ScaleType.FIT_XY); 
     } 
     return convertView; 
    } 
} 

class ViewHolder { 
    ImageView imageview; 
    CheckBox checkbox,checkbox1; 
    TextView textview; 
    int id; 
} 

Может кто-нибудь помочь мне, как сохранить состояние персистенции флажка (флажок).

+0

вы хотите флажок проверил, чтобы поддерживать состояние при прокрутке? предположим, что флажок строки один (проверяется при прокрутке вверх и вниз только флажок с первой строкой проверяется. это то, что вы ищете? – Raghunandan

+0

да .. точно я ищу это решение. – user2384424

+0

какая часть кода вы сбиты с толку? – Raghunandan

ответ

0

Клетки повторно используются. В getView(), где вы устанавливаете идентификатор, вы также должны установить состояние флажка holder.checkbox..setChecked(thumbnailsselection[position]);. Также не рекомендуется менять идентификатор, если вы хотите сохранить позицию, используя setTag() и разместив там позицию, в представлениях уже есть идентификаторы в макете.

1

https://groups.google.com/forum/?fromgroups#!topic/android-developers/No0LrgJ6q2M

Рисунок из раствора Ромен парня из ListView в ссылке выше.

Ваш заказ адаптер должен реализовать CompoundButton.OnCheckedChangeListener и использовать SparseBooleanArray

Тогда

cb.setChecked(mCheckStates.get(position, false)); 
cb.setOnCheckedChangeListener(this); 

Тогда

 public boolean isChecked(int position) { 
     return mCheckStates.get(position, false); 
    } 

    public void setChecked(int position, boolean isChecked) { 
     mCheckStates.put(position, isChecked); 

    } 

    public void toggle(int position) { 
     setChecked(position, !isChecked(position)); 
    } 
@Override 
public void onCheckedChanged(CompoundButton buttonView, 
     boolean isChecked) { 
    mCheckStates.put((Integer) buttonView.getTag(), isChecked);  

} 

Пример

public class MainActivity extends Activity implements 
AdapterView.OnItemClickListener { 
    int count; 
private CheckBoxAdapter mCheckBoxAdapter; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    final GridView gridView = (GridView) findViewById(R.id.lv); 
    gridView.setTextFilterEnabled(true); 
    gridView.setOnItemClickListener(this); 
    mCheckBoxAdapter = new CheckBoxAdapter(this); 
      gridView.setAdapter(mCheckBoxAdapter); 

    } 

public void onItemClick(AdapterView parent, View view, int 
position, long id) { 
    mCheckBoxAdapter.toggle(position); 
} 

class CheckBoxAdapter extends ArrayAdapter implements CompoundButton.OnCheckedChangeListener 
{ private SparseBooleanArray mCheckStates; 
    LayoutInflater mInflater; 
    ImageView imageview1,imageview; 
    CheckBox cb; 

    CheckBoxAdapter(MainActivity context) 
    { 
     super(context,0); 
     mCheckStates = new SparseBooleanArray(10); 
     mInflater = (LayoutInflater)MainActivity.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    } 
    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return 10; 
    } 

    @Override 
    public Object getItem(int position) { 
     // TODO Auto-generated method stub 
     return position; 
    } 

    @Override 
    public long getItemId(int position) { 
     // TODO Auto-generated method stub 

     return 0; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     // TODO Auto-generated method stub 
     View vi=convertView; 
     if(convertView==null) 
     vi = mInflater.inflate(R.layout.checkbox, null); 
     imageview= (ImageView) vi.findViewById(R.id.textView1); 

     cb = (CheckBox) vi.findViewById(R.id.checkBox1); 

     cb.setTag(position); 
     cb.setChecked(mCheckStates.get(position, false)); 
     cb.setOnCheckedChangeListener(this); 
     return vi; 
    } 
    public boolean isChecked(int position) { 
      return mCheckStates.get(position, false); 
     } 

     public void setChecked(int position, boolean isChecked) { 
      mCheckStates.put(position, isChecked); 

     } 

     public void toggle(int position) { 
      setChecked(position, !isChecked(position)); 
     } 
    @Override 
    public void onCheckedChanged(CompoundButton buttonView, 
      boolean isChecked) { 
     // TODO Auto-generated method stub 
     mCheckStates.put((Integer) buttonView.getTag(), isChecked);  

    } 

} 

} 

activity_main.xml

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <GridView 
    android:id="@+id/lv" 
    android:layout_width="wrap_content" 
    android:numColumns="2" 
     android:layout_height="wrap_content" 
     /> 

    </RelativeLayout> 

checkbox.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <ImageView 
     android:id="@+id/textView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" 
     android:layout_marginLeft="15dp" 
     android:layout_marginTop="34dp" 
     android:src="@drawable/ic_launcher"/> 

    <CheckBox 
     android:id="@+id/checkBox1" 
     android:focusable="false" 
     android:focusableInTouchMode="false" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentRight="true" 
     android:layout_below="@+id/textView1" 
     android:layout_marginRight="22dp" 
     android:layout_marginTop="23dp" /> 

</RelativeLayout> 

Похожие на один ответил здесь. Вместо listview используйте gridview, а вместо textview используйте imageview.

How to change the text of a CheckBox in listview?

+0

как я был немного смущен, вы можете объяснить изменения в соответствии с моим кодом .. – user2384424

+0

см. код перед редактированием. Вы должны иметь возможность изменить пример. Какую часть вы путаете? – Raghunandan

Смежные вопросы