2014-02-03 2 views
1

У меня есть SimpleCursorAdapter с ImageView и TextView. Он работает так, как есть. Я пытаюсь добавить CheckBox в моем listview, когда я нажимаю на checkbox Я хочу, чтобы строка списка удалялась из базы данных.Любой хороший пример для флажка с SimpleCursorAdapter

Его трудно найти в этом примере, если у вас есть пример для моей ситуации.

Main.class

public void forGeneral(){ 
     c = m.fetchAllReminders(); 

     String[] from = new String[]{Database.KEY_FIRST, Database.KEY_LAST}; 
     int[] to = new int[]{R.id.tFirst, R.id.tSecond}; 
     r2 = new ImageV(getActivity().getApplicationContext(), R.layout.forcheckbox, c, from, to); 
     h = r2.getItemId(c.getPosition()); 

     r2.setViewBinder(new SimpleCursorAdapter.ViewBinder() { 

      @Override 
      public boolean setViewValue(View arg0, Cursor arg1, final int arg2) { 
       // TODO Auto-generated method stub 
       if(arg0.getId() == R.id.cbCheckk){ 

        final CheckBox cb1 = (CheckBox) arg0.findViewById(R.id.cbCheckk) ; 
        cb1.setTag(arg2); 
        cb1.setOnCheckedChangeListener(new OnCheckedChangeListener(){ 

         @Override 
         public void onCheckedChanged(
           CompoundButton buttonView, boolean isChecked) { 
          // TODO Auto-generated method stub 

         } 

        }); 



       } 
       return false; 
      } 
     }); 

     setListAdapter(r2); 



    } 

ImageV.class

public class ImageV extends SimpleCursorAdapter{ 

    private Cursor cn; 
    private Context context; 
    private ViewHolder holder = null; 
    private Layout mlayout; 
    private ArrayList<String> list = new ArrayList<String>(); 
    private ArrayList<Boolean> itemChecked = new ArrayList<Boolean>(); 
    private int i; 

    public ImageV(Context context, int layout, Cursor c, String[] from, int[] to) { 
     super(context, layout, c, from, to); 
     this.cn= c; 
     this.context = context; 

     for(int i = 0; i < this.getCount(); i++){ 
      itemChecked.add(i, false); 
     } 


    } 
    private class ViewHolder{ 
     TextView mFirst; 
     TextView mLast; 
     CheckBox mCheckBox; 
     ListView lv; 

    } 

    public View getView (final int pos, View inView, ViewGroup parent){ 


     LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
     if(inView == null){ 
      inView = mInflater.inflate(R.layout.forcheckbox, null); 
      holder = new ViewHolder(); 
      holder.mFirst = (TextView) inView.findViewById(R.id.tFirst); 
      holder.mLast = (TextView) inView.findViewById(R.id.tSecond); 
      holder.mCheckBox = (CheckBox) inView.findViewById(R.id.cbCheckk); 
      inView.setTag(holder); 
     }else { 
      holder = (ViewHolder) inView.getTag(); 

     } 
     this.cn.moveToPosition(pos); 
     String first = c.getString(c.getColumnIndex(Database.KEY_FIRST)); 
     String last = c.getString(c.getColumnIndex(Database.KEY_LAST)); 


     holder.mFirst.setText(first); 
     holder.mLast.setText(last); 
     holder.mCheckBox.setTag(pos); 
     holder.mCheckBox.setOnClickListener(new OnClickListener(){ 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       CheckBox cb = (CheckBox) v.findViewById(R.id.cbCheckk); 
       if(cb.isChecked()){ 

        itemChecked.set(pos, true); 
        Toast.makeText(getApplicationContext(), "Yes", Toast.LENGTH_LONG).show(); 
        long u = c.getLong(i); 
        m.deleteReminder(u); 
        cb.setChecked(false); 
        c.requery(); 
       } 


      } 

     }); 

     return (inView); 


     } 
+1

вы хотите строки удалить, как только элемент проверяется или сначала вы хотите выбрать несколько элементов в список, а затем удалить их? если вы хотите первый вариант, я предлагаю вместо использования «CheckBox» вы должны использовать кнопку «Button». – SMR

+0

хорошо я хочу реализовать флажок для эстетической цели. Любой хороший пример? Мой вопрос был отредактирован с кодом, который у меня есть. –

+0

неправильный .. Может быть, похоже, что он работает, но реализация должна включать newView & bindView вместо getView (который будет неявно вызван) – Ewoks

ответ

0

Хорошо, Так что ниже ваш ответ.

yourName.XML

<CheckBox 
     android:id="@+id/checkBox1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginTop="8dp" 
     android:focusable="false" 
     android:focusableInTouchMode="false" /> 

    <TextView 
     android:id="@+id/classname" 
     android:layout_width="200dp" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="10dip" 
     android:layout_marginTop="8dp" 
     android:text="TextView" 
     android:textAppearance="?android:attr/textAppearanceMedium" 
     android:textColor="#000000" 
     android:textStyle="bold" /> 

    <ImageView 
     android:id="@+id/classImage" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_marginLeft="20dp" 
     android:layout_marginTop="15dp" /> 

CustomAdapter

public class Custom_ClassAdapter extends BaseAdapter { 

    LayoutInflater inflater; 
    Context context; 

    List<List_ClassModel> rowItems; 

    public Custom_ClassAdapter(Context context, List<List_ClassModel> rowItems) { 
     inflater = LayoutInflater.from(context); 
     this.context = context; 
     this.rowItems = rowItems; 
    } 

    private class ViewHolder { 
     ImageView mImageView; 
     TextView mTextView; 
     CheckBox mCheckBox; 
    } 

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

     LayoutInflater mInflater = (LayoutInflater) context 
       .getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 
     if (convertView == null) { 
      convertView = mInflater.inflate(R.layout.custom_class, null); 
      holder = new ViewHolder(); 
      holder.mImageView = (ImageView) convertView 
        .findViewById(R.id.classImage); 
      holder.mTextView = (TextView) convertView 
        .findViewById(R.id.classname); 
      holder.mCheckBox = (CheckBox) convertView 
        .findViewById(R.id.checkBox1); 
      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     holder.mImageView.setImageResource(position); 

     holder.mCheckBox.setTag(position); 
     holder.mCheckBox 
       .setOnCheckedChangeListener(new OnCheckedChangeListener() { 
        @Override 
        public void onCheckedChanged(CompoundButton buttonView, 
          boolean isChecked) { 
         // TODO Auto-generated method stub 
         Code.classDel = (Integer) buttonView.getTag(); 
        } 
       }); 

Где Code.classDel является статической переменной целое.

+1

Я использую SimleCursorAdapter not BaseAdapter. Как вы намерены получить адаптер от другого класса? Мой вопрос был отредактирован с рабочим кодом, который у меня есть. –

+0

Тогда вы можете использовать базовый адаптер, как я указал в моем примере, попробуйте этот код и сообщите мне, работает он или нет. – InnocentKiller

+1

Его не работает человек, я загружаю данные из базы данных. Пожалуйста, помогите мне. –

0

Проверить это POST

и попытаться добавить onCheckChangeListener в вашей деятельности или фрагмента, а не в адаптере

+0

, не помогая человеку. Как получить адаптер из другого класса? Мой вопрос был отредактирован с кодом, который у меня есть. –

+0

Dushyant, я думаю, вам пора работать над вашими соглашениями об именах. – Pankaj

+0

Вы можете передать CheckChangeListener в ImageV, а в getView вы должны добавить позицию к флажку с помощью setTag, а в onCheckChange вы получите позицию, в которой вы изменили проверку, а затем выполните операцию с данными и notifyDataSetChange к адаптеру – Pankaj

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