2013-04-15 95 views
3

我想创建一个自定义列表视图,其中每行都有一个textview和一个imageview(我将用它来检查/取消选中列表项),如下图所示:删除自定义列表视图中的多个项目

enter image description here

我想从列表中删除多个项目。如何实现这一点??你可以请提供任何教程或参考或链接学习这?

+0

从列表中删除这些选中的项目,然后再弹出的列表视图。 –

+0

我想要一些参考或教程,通过它我可以实现这种机制。上面的图片仅仅是为了举例。 –

回答

3

这是我如何创建我的自定义列表视图轻松:

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 

import android.app.Activity; 
import android.app.AlertDialog; 
import android.app.AlertDialog.Builder; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.pm.ActivityInfo; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.os.Bundle; 
import android.view.KeyEvent; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.ArrayAdapter; 
import android.widget.ImageView; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.Toast; 

public class DeleteData extends Activity { 

    Cursor cursor; 
    ListView lv_delete_data; 
    static ArrayList<Integer> listOfItemsToDelete; 
    SQLiteDatabase database; 
    private Category[] categories; 
    ArrayList<Category> categoryList; 
    private ArrayAdapter<Category> listAdapter; 
    ImageView iv_delete; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_delete_data); 

     this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

     manage_reload_list(); 

     listOfItemsToDelete = new ArrayList<Integer>(); 

     iv_delete = (ImageView) findViewById(R.id.imageViewDeleteDataDelete); 
     iv_delete.setClickable(true); 
     iv_delete.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (listOfItemsToDelete.isEmpty()) { 

        Toast.makeText(getBaseContext(), "No items selected.", 
          Toast.LENGTH_SHORT).show(); 
       } 

       else { 
        showDialog(
          "Warning", 
          "Are you sure you want to delete these categories ? This will erase all records attached with it."); 
       } 
      } 
     }); 

     lv_delete_data = (ListView) findViewById(R.id.listViewDeleteData); 
     lv_delete_data.setAdapter(listAdapter); 
     lv_delete_data.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 
        long arg3) { 
       // TODO Auto-generated method stub 
       ImageView imageView = (ImageView) arg1 
         .findViewById(R.id.imageViewSingleRowDeleteData); 
       Category category = (Category) imageView.getTag(); 

       if (category.getChecked() == false) { 
        imageView.setImageResource(R.drawable.set_check); 
        listOfItemsToDelete.add(category.getId()); 
        category.setChecked(true); 
       } else { 
        imageView.setImageResource(R.drawable.set_basecircle); 
        listOfItemsToDelete.remove((Integer) category.getId()); 
        category.setChecked(false); 
       } 
      } 
     }); 
    } 

    private void showDialog(final String title, String message) { 

     AlertDialog.Builder adb = new Builder(DeleteData.this); 
     adb.setTitle(title); 
     adb.setMessage(message); 
     adb.setIcon(R.drawable.ic_launcher); 
     String btn = "Ok"; 
     if (title.equals("Warning")) { 
      btn = "Yes"; 
      adb.setNegativeButton("No", new DialogInterface.OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        dialog.dismiss(); 
       } 
      }); 
     } 

     adb.setPositiveButton(btn, new DialogInterface.OnClickListener() { 

      public void onClick(DialogInterface arg0, int arg1) { 

       if (title.equals("Warning")) { 

        for (int i : listOfItemsToDelete) { 

         // -------first delete from category table----- 

         database.delete("category_fields", "cat_id=?", 
           new String[] { i + "" }); 

         // --------now fetch rec_id where cat_id = 
         // i----------------- 

         cursor = database.query("records_data", 
           new String[] { "rec_id" }, "cat_id=?", 
           new String[] { i + "" }, null, null, null); 
         if (cursor.getCount() == 0) 
          cursor.close(); 
         else { 
          ArrayList<Integer> al_tmp_rec_id = new ArrayList<Integer>(); 
          while (cursor.moveToNext()) 
           al_tmp_rec_id.add(cursor.getInt(0)); 
          cursor.close(); 

          for (int i1 : al_tmp_rec_id) { 
           database.delete("records_fields_data", 
             "rec_id=?", new String[] { i1 + "" }); 

           database.delete("record_tag_relation", 
             "rec_id=?", new String[] { i1 + "" }); 
          } 

          // ---------delete from records_data------- 

          database.delete("records_data", "cat_id=?", 
            new String[] { i + "" }); 

          cursor.close(); 
         } 
        } 

        showDialog("Success", 
          "Categories, with their records, deleted successfully."); 
       } else { 
        database.close(); 
        listOfItemsToDelete.clear(); 
        manage_reload_list(); 
        lv_delete_data.setAdapter(listAdapter); 
       } 
      } 
     }); 

     AlertDialog ad = adb.create(); 
     ad.show(); 
    } 

    protected void manage_reload_list() { 

     loadDatabase(); 

     categoryList = new ArrayList<Category>(); 

     // ------first fetch all categories name list------- 

     cursor = database.query("category", new String[] { "cat_id", 
       "cat_description" }, null, null, null, null, null); 
     if (cursor.getCount() == 0) { 
      Toast.makeText(getBaseContext(), "No categories found.", 
        Toast.LENGTH_SHORT).show(); 
      cursor.close(); 
     } else { 

      while (cursor.moveToNext()) { 

       categories = new Category[] { new Category(cursor.getInt(0), 
         cursor.getString(1)) }; 
       categoryList.addAll(Arrays.asList(categories)); 
      } 
      cursor.close(); 
     } 
     listAdapter = new CategoryArrayAdapter(this, categoryList); 
    } 

    static class Category { 

     String cat_name = ""; 
     int cat_id = 0; 
     Boolean checked = false; 

     Category(int cat_id, String name) { 
      this.cat_name = name; 
      this.cat_id = cat_id; 
     } 

     public int getId() { 
      return cat_id; 
     } 

     public String getCatName() { 
      return cat_name; 
     } 

     public Boolean getChecked() { 
      return checked; 
     } 

     public void setChecked(Boolean checked) { 
      this.checked = checked; 
     } 

     public boolean isChecked() { 
      return checked; 
     } 

     public void toggleChecked() { 
      checked = !checked; 
     } 
    } 

    static class CategoryViewHolder { 

     ImageView imageViewCheck; 
     TextView textViewCategoryName; 

     public CategoryViewHolder(ImageView iv_check, TextView tv_category_name) { 
      imageViewCheck = iv_check; 
      textViewCategoryName = tv_category_name; 
     } 

     public ImageView getImageViewCheck() { 
      return imageViewCheck; 
     } 

     public TextView getTextViewCategoryName() { 
      return textViewCategoryName; 
     } 
    } 

    static class CategoryArrayAdapter extends ArrayAdapter<Category> { 

     LayoutInflater inflater; 

     public CategoryArrayAdapter(Context context, List<Category> categoryList) { 

      super(context, R.layout.single_row_delete_data, 
        R.id.textViewSingleRowDeleteData, categoryList); 
      inflater = LayoutInflater.from(context); 
     } 

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

      Category category = (Category) this.getItem(position); 

      final ImageView imageViewCheck; 
      final TextView textViewCN; 

      if (convertView == null) { 

       convertView = inflater.inflate(R.layout.single_row_delete_data, 
         null); 

       imageViewCheck = (ImageView) convertView 
         .findViewById(R.id.imageViewSingleRowDeleteData); 
       textViewCN = (TextView) convertView 
         .findViewById(R.id.textViewSingleRowDeleteData); 

       convertView.setTag(new CategoryViewHolder(imageViewCheck, 
         textViewCN)); 
      } 

      else { 

       CategoryViewHolder viewHolder = (CategoryViewHolder) convertView 
         .getTag(); 
       imageViewCheck = viewHolder.getImageViewCheck(); 
       textViewCN = viewHolder.getTextViewCategoryName(); 
      } 

      imageViewCheck.setFocusable(false); 
      imageViewCheck.setFocusableInTouchMode(false); 
      imageViewCheck.setClickable(true); 
      imageViewCheck.setOnClickListener(new View.OnClickListener() { 
       public void onClick(View v) { 
        ImageView iv = (ImageView) v; 
        Category category = (Category) iv.getTag(); 

        if (category.getChecked() == false) { 
         imageViewCheck.setImageResource(R.drawable.set_check); 
         listOfItemsToDelete.add(category.getId()); 
         category.setChecked(true); 
        } else { 
         imageViewCheck 
           .setImageResource(R.drawable.set_basecircle); 
         listOfItemsToDelete.remove((Integer) category.getId()); 
         category.setChecked(false); 
        } 
       } 
      }); 
      imageViewCheck.setTag(category); 

      if (category.getChecked() == true) 
       imageViewCheck.setImageResource(R.drawable.set_check); 
      else 
       imageViewCheck.setImageResource(R.drawable.set_basecircle); 

      textViewCN.setText(category.getCatName()); 

      return convertView; 
     } 
    } 

    private void loadDatabase() { 
     database = openOrCreateDatabase("WalletAppDatabase.db", 
       SQLiteDatabase.OPEN_READWRITE, null); 
    } 

    @Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { 

      finish(); 
      return true; 
     } 
     return super.onKeyDown(keyCode, event); 
    } 
} 

任何人谁有怀疑这个可以问我...

0

所有的Fisrt为你的listview制作一个自定义的适配器和行布局。点击此链接(click)即可。然后为每一行添加复选框。您可以自定义复选框以实现与您发布的图片类似的效果。为此,请检查此链接(click

创建完自定义列表视图,你必须在自定义适配器(内部getview方法)复选框点击复选框获取检查列表视图行ID。当用户点击复选框,你必须得到点击行ID并存储到数组列表。让我们说,你选择id-array列表是“ArrayId”,而你的listview项目数组列表是“Yourarray”。这里是代码,

checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

    @Override 
    public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) { 

     if(isChecked) 
      { 
      ArrayId.add(Yourlist.get(position));//add item position to arraylist if checked 
      } 
      else 
      { 
      ArrayId.remove(Yourlist.get(position));//remove item position from arraylist if unchecked 
      } 

    } 
} 

然后你遍历存储在ArrayList和删除entry.Check下面的代码每个ID,

for(int i=0;i<ArrayId.size();i++) 
{ 
    Yourlist.remove(ArrayId[i]); 
} 

现在从你的列表视图项中的项基于阵列“Yourlist”将被删除。然后使用更新的“Yourlist”数组使无效列表视图失效。

相关问题