【问题标题】:How to delete check box items from list如何从列表中删除复选框项目
【发布时间】:2012-02-19 11:09:37
【问题描述】:

我在列表中有 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

【问题讨论】:

  • @一个公平的玩家,请看我的代码。

标签: android list checkbox


【解决方案1】:

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

你应该做的是使用一个与列表项大小相同的ArrayList,并且每个项默认包含0。现在,在您的 Efficient Adapter 中,为每个选中的复选框分配 1 在 arrayList 中的特定位置。最后单击 delete 按钮,遍历 ArrayList 并从列表中删除所有那些在该 ArrayList 中的该位置包含 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
        } 

现在在你的 EffectiveAdapter 的 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();
  }
}

希望这能解决您的问题。

【讨论】:

    【解决方案2】:

    我假设我得到了被选中的 id。 现在只需 arrayList.remove(position);和 调用 notifyDataSetChanged();

    【讨论】:

      【解决方案3】:

      伙计,您的代码缺少复选框和对象之间的关系,而且您没有在适配器中实现 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&lt;Model&gt;

      3. 修改适配器的构造函数为

        private Model[] model;
        public EfficientAdapter(Context context, Model model) {
        
             mInflater = LayoutInflater.from(context);
             this.model = model;
        
        }
        
      4. 然后您需要在 getView 方法内的适配器内添加 onCheckedChangeListener,因此您的 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 传递给适配器并将适配器休息到列表中。

      第 7 步也可以通过填充模型(最初传递给数组的原始模型)然后使用适配器调用 notifyDataSetChanged() 来执行。

      仅此而已,这对我一直有效...希望这对您也有帮助。

      【讨论】:

        【解决方案4】:

        如果您使用模式为 CHOICE_MODE_MULTIPLE 的列表视图,您应该可以使用以下内容: listView.getCheckedItemPositions();

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

        尽管我所有的复选框 + 列表知识都基于此: Android list and checkbox

        【讨论】:

        • 他没有问如何创建多选列表视图。
        • 我试图给出一个关于如何删除这些项目的想法,以防他使用 multiselect-listview(他可能是)。
        【解决方案5】:

        我认为你的问题不需要任何大量的代码。你只需要一个概念。上面给出的答案是最好的方法。

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

        作为列表视图子子(CheckBox)可以直接在基础适配器类中使用setOnCheckChangesListener。现在您只需记录复选框及其在ArrayList中的相应位置。现在当您单击删除btn然后从arraylist中删除元素并调用 notifyDataSetChanged()

        【讨论】:

        • 你解决了吗?如果您还有其他疑问如何实施,请告诉我们
        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-04-15
          • 1970-01-01
          • 2017-06-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多