2012-01-26 140 views
4

我在列表中有50个列表项。现在我已经检查了10个项目,所以当点击删除按钮时,如何将这10个选中的项目从列表视图中删除(删除)。如何从列表中删除复选框项目

这里是我的代码

请看看我的代码和响应,其中是错误

public class BookmarksJokes extends Activity implements OnClickListener, 
    OnItemClickListener { 
ListView lv; 
Button btn_delete; 
public String TAG = "horror"; 
private SQLiteDatabase db; 
public static final String PREFS_NAME = "MyPreferences"; 
static String[] tempTitle = new String[100]; 
static String[] tempBody = new String[100]; 
private static boolean bRequiresResponse; 

private static class EfficientAdapter extends BaseAdapter { 
    private LayoutInflater mInflater; 

    public EfficientAdapter(Context context) { 
     mInflater = LayoutInflater.from(context); 

    } 
    public int getCount() { 
     return tempTitle.length; 
    } 

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

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

    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 
     if (convertView == null) { 
      convertView = mInflater.inflate(R.layout.bookmarks_list_item, 
        null); 
      holder = new ViewHolder(); 
      holder.text1 = (TextView) convertView 
        .findViewById(R.id.title); 
      holder.text2 = (TextView) convertView 
        .findViewById(R.id.body); 
      holder.checkBox = (CheckBox) convertView.findViewById(R.id.checkbox); 

      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     holder.text1.setText(tempTitle[position]); 
     holder.text2.setText(tempBody[position]); 
     // bRequiresResponse = checkBox.isChecked(); 
     return convertView; 
    } 

    static class ViewHolder { 
     TextView text1; 
     TextView text2; 
     CheckBox checkBox; 
    } 
} 

@Override 
protected void onCreate(Bundle savedInstanceState) { 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.bokmarksjoks); 

    try { 
     db = (new DatabaseHelper(this)).getWritableDatabase(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    setUpViews(); 

    title = (TextView) findViewById(R.id.body); 
    SharedPreferences pref = getSharedPreferences(PREFS_NAME, 0); 

    //String ids = pref.getString("jid", ""); 
    String one = pref.getString("title", ""); 
    String two = pref.getString("body", ""); 

    tempTitle = one.split(","); 
    tempBody = two.split(","); 
    lv.setAdapter(new EfficientAdapter(this)); 
} 

private void setUpViews() { 
    lv = (ListView) findViewById(R.id.list); 
    btn_delete = (Button) findViewById(R.id.delete); 
    btn_delete.setOnClickListener(this); 
    // checkbox = (CheckBox) findViewById(R.id.checkbox); 

} 
private void removeData(){ 
//int pos= getIntent().getIntExtra("POSITION", 0); 
//lv.removeViewAt(pos); 
// notifyAll();*/ 
// int pos= getIntent().getIntExtra("POSITION", 0); 
// if(checkBox.isChecked()){ 
//  Log.d(TAG, " checked d]"+pos); 
//  Toast.makeText(this, "checked "+pos, Toast.LENGTH_SHORT).show(); 
// } 
} 
public void onClick(View v) { 
    switch (v.getId()) { 
     case R.id.delete: 
     AlertDialog.Builder alt_bld = new AlertDialog.Builder(this); 
     alt_bld.setMessage("Are you Sure want to delete all checked jok ?") 
       .setCancelable(false) 
       .setPositiveButton("Yes", 
         new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, 
            int id) { 
           //removeJok(); 

          } 
         }) 
       .setNegativeButton("No", 
         new DialogInterface.OnClickListener() { 
          public void onClick(DialogInterface dialog, 
            int id) { 
           dialog.cancel(); 
          } 
         }); 
     AlertDialog alert = alt_bld.create(); 
     alert.setTitle("Delete Jokes"); 
     alert.show(); 
    case R.id.checkbox: 

    default: 
     break; 
    } 

} 

public void onItemClick(AdapterView<?> arg0, View view, int position, 
     long ids) { 

    try { 

    // checkBox = (CheckBox)view.findViewById(R.id.checkbox); 
    // checkBox.setChecked(true); 

     Intent intent = new Intent(BookmarksJokes.this, 
       BookmarkJokesDetails.class); 

     intent.putExtra("POSITION", position); 
     intent.putExtra("ID", ids); 
     Cursor cursor = (Cursor) adapter.getItem(position); 

     intent.putExtra("_ID", 
       cursor.getInt(cursor.getColumnIndex("_id"))); 

     startActivity(intent); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    Toast.makeText(BookmarksJokes.this, 
      "Item in position " + position + " clicked", Toast.LENGTH_LONG) 
      .show(); 
} 
} 

这里是我的全码:

http://pastebin.com/LB2WKHMP

+0

你可以发布你的代码吗? –

+0

@一个公平的球员,请参阅我的代码。 –

回答

10

我在我的一个应用程序中执行了相同的任务。

你应该做的是使用一个ArrayList与列表项目大小相同,每个项目默认包含0。现在在您选中的每个复选框的高效适配器中,在arrayList中的特定位置指定1。最后在按钮上单击删除,遍历ArrayList,并从列表中删除所有那些包含1的项目,该列表中包含1,并且最后调用notifyDatasetChanged()方法列表,以便列表刷新并显示新列表。

下面是一些示例代码,让您在这个更好的主意:

ArrayList<Integer> checks=new ArrayList<Integer>(); 
在onCreate方法

现在现在

for(int b=0;b<tempTitle.length;b++){ 
    checks.add(b,0); //assign 0 by default in each position of ArrayList 
     } 

在efficientAdapter的getView方法

public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 
     if (convertView == null) { 
      convertView = mInflater.inflate(R.layout.bookmarks_list_item, 
        null); 
      holder = new ViewHolder(); 
      holder.text1 = (TextView) convertView 
        .findViewById(R.id.title); 
      holder.text2 = (TextView) convertView 
        .findViewById(R.id.body); 
      holder.checkBox = (CheckBox) convertView.findViewById(R.id.checkbox); 

      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

      holder.checkBox.setOnClickListener(new OnClickListener() { 

      public void onClick(View v) { 
       // TODO Auto-generated method stub 

       if(((CheckBox)v).isChecked()){ 
        checks.set(position, 1); 
       } 
       else{ 
       checks.set(position, 0); 
       } 

      } 
     }); 


     return convertView; 
    } 

最后删除按钮点击:

 delete.setOnClickListener(new OnClickListener() { 

    public void onClick(View v) { 
    // TODO Auto-generated method stub 

      for(int i=0;i<checks.size();i++){ 

    if(checks.get(i)==1){ 
      //remove items from the list here for example from ArryList 
      checks.remove(i); 
      //similarly remove other items from the list from that particular postion 
      i--; 
     } 
    } 
    ((EfficientAdapter)lv.getAdapter()).notifyDataSetChanged(); 
    } 
} 

希望这能解决您的问题。

4

我我假设我有被选中的ID。 现在只需arrayList.remove(position);和 调用notifyDataSetChanged();

0

如果您使用模式CHOICE_MODE_MULTIPLE的列表视图,您应该可以使用类似于: listView.getCheckedItemPositions();

然后,如果您有列表项存储在某种列表或向量中,您应该能够轻松删除具有相同位置的项目,并更新列表视图。

Altough我所有的复选框+列表知识是基于这样的: Android list and checkbox

+0

他没有问如何创建多个选择列表视图。 – Richa

+0

我试图给出一个关于如何删除这些项目的想法,以防他正在使用multiselect-listview(他可以说是)。 – varesa

2

的人,你的代码缺少复选框和对象之间的关系,你也没有实现onCheckedchangeListener您转接器内... 。 这里是你需要http://www.vogella.de/articles/AndroidListView/article.html#listadvanced_interactive 或者我将它包起来吗

  1. 你需要创建一个类model.java代表细胞名单如下:

    public class Model { 
        private String title; 
        private String body; 
        private boolean isSelected; 
    
        public Model(String title, String body) { 
          this.title = title; 
          this.body = body; 
          this.isSelected = false; 
        } 
    
        // here you MUST create your set of setters and getters. 
    } 
    
  2. 修改您的适配器来扩展ArrayAdapter<Model>

  3. 修改适配器的构造是

    private Model[] model; 
    public EfficientAdapter(Context context, Model model) { 
    
        mInflater = LayoutInflater.from(context); 
        this.model = model; 
    
    } 
    
  4. ,那么你就需要添加onCheckedChangeListener在你的适配器里面的getView方法中,所以你的getView方法看起来是这样的:

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
        View view = null; 
        if (convertView == null) { 
         LayoutInflater inflator = context.getLayoutInflater(); 
    
         final ViewHolder viewHolder = new ViewHolder(); 
         viewHolder.text1 = (TextView) convertView.findViewById(R.id.title); 
         viewHolder.text2 = (TextView) convertView.findViewById(R.id.body); 
         viewHolder.checkBox = (CheckBox) convertView.findViewById(R.id.checkbox); 
         viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
    
          @Override 
          public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) { 
    
           Model element = (Model) viewHolder.checkbox.getTag(); 
    
           element.setSelected(buttonView.isChecked()); 
          } 
         }); 
         view.setTag(viewHolder); 
         viewHolder.checkbox.setTag(list[position]); 
        } else { 
         view = convertView; 
         ((ViewHolder) view.getTag()).checkbox.setTag(list[position]); 
        } 
    
        ViewHolder holder = (ViewHolder) view.getTag(); 
        holder.text1.setText(tempTitle[position]); 
        holder.text2.setText(tempBody[position]); 
        return view; 
    } 
    
  5. 然后在您的活动中创建模型数组并将其传递给适配器。

  6. 要做的最后一件事是从列表中删除所选项目:

    final ArrayList<Model> newModel = new ArrayList<Model>(); 
    
    for (int i = 0; i < model.length/*this is the original model*/; i++) { 
    
        if(model[i].isChecked()){ 
    
         // fill the array list ... 
         newModel.add(model[i]); 
        } 
    } 
    
  7. 就是这样,通过对newModel,并向适配器和休息适配器列表。可以通过填充模型,然后使用适配器调用notifyDataSetChanged()(其最初传递到阵列的原之一)也进行

步骤数7。

这就是所有,这就是我总是为我工作...希望这也可以帮助你。

0

我认为你的问题不需要任何大量的代码。你只需要一个概念。答案以上是做到这一点的最佳方式。

I am assuming i got ids which are selected. now simply arrayList.remove(position); 
and call notifyDataSetChanged(); 

方式列表视图子儿(复选框)可以使用setOnCheckChangesListener在底座适配器类directly.Now你只需要继续检查复选框的跟踪记录,并在其ArrayList.Now相应的位置,当你删除BTN然后点击从arraylist中删除元素并调用notifyDataSetChanged()

+0

你解决了吗?如果你有另一个疑问如何实施它,然后告诉我们 – Sameer

0

当您选择了复选框并按下删除按钮时,再次刷新列表视图。意味着您必须在删除项目后再次将适配器设置为列表视图。谢谢