Как удалить несколько записей из списка, установив флажок в Android

У меня есть список с флажком, который загружает данные из внешней базы данных. Когда я устанавливаю какой-либо конкретный флажок и нажимаю «Удалить», он удаляет это конкретное значение. Но моя проблема в том, что когда я устанавливаю более одного флажка и нажимаю «Удалить», он удаляет только последнее проверенное значение, а не все проверенное значение.

Итак, что я делаю неправильно в своем коде. может кто подскажет пожалуйста. Ниже мой код. Заранее спасибо.

Адаптер пользовательского класса

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();
                }
            });

    List_ClassModel rowItem = (List_ClassModel) getItem(position);
    holder.mTextView.setText(rowItem.getClassName());
    return convertView;
}

@Override
public int getCount() {
    return rowItems.size();
}

@Override
public Object getItem(int position) {
    return rowItems.get(position);
}

@Override
public long getItemId(int position) {
    return rowItems.indexOf(getItem(position));
}

public void clear() {
}
}

Удалить продукт

class DeleteProduct extends AsyncTask<String, String, String> {

    /**
     * Before starting background thread Show Progress Dialog
     * */

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(Classes_Ext_DB.this);
        pDialog.setMessage("Deleting Class... Please wait...");
        pDialog.setIndeterminate(false);
        pDialog.setCancelable(true);
        pDialog.show();
    }

    /**
     * Deleting product
     * */
    protected String doInBackground(String... args) {

        // Check for success tag
        int success;
        try {
            List_ClassModel mlList_ClassModel = Code.arrayClasses
                    .get(Code.classDel);
            // Building Parameters
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            params.add(new BasicNameValuePair("ID", ""
                    + mlList_ClassModel.getClass_ID()));

            // getting product details by making HTTP request
            JSONObject json = jParser.makeHttpRequest(url_delete_class,
                    "POST", params);
            // check your log for json response
            Log.d("Delete Product", json.toString());
            // json success tag
            success = json.getInt(TAG_SUCCESS);
            if (success == 1) {
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * After completing background task Dismiss the progress dialog
     * **/
    protected void onPostExecute(String file_url) {
        pDialog.dismiss();
        Code.arrayClasses.remove(Code.classDel);
        mCustom_ClassAdapter.notifyDataSetChanged();
    }
}

Изменить

public static int pm = 0;
public static int dropboxlogout = 0;
public static int currentDel;
public static int classDel;

person InnocentKiller    schedule 11.01.2014    source источник


Ответы (2)


Глядя на структуру вашего кода, я думаю, что его можно использовать для удаления только одного элемента.

Вот что происходит: когда вы отмечаете элемент x, этот элемент сохраняется для удаления. Затем, когда вы проверяете элемент y, предыдущий идентификатор перезаписывается идентификатором нового. Итак, когда вы делаете запрос к серверу, у вас есть только последний проверенный элемент.

Что вы можете сделать: создать ArrayList. Всякий раз, когда какой-либо элемент отмечен, добавьте его в ArrayList. Таким образом, вы можете хранить столько элементов, сколько хотите для удаления. Наконец, делая запрос на сервер, пройдите через ArrayList, чтобы получить идентификаторы всех элементов и отправить их на сервер в нужном формате.

person Swayam    schedule 11.01.2014

В нижеприведенном прослушивателе вы сохраняете элемент, который хотите удалить, в общедоступной статической переменной, определенной в классе Code. Каждый раз, когда вы устанавливаете или снимаете флажок (да, снимаете флажок, потому что вы не проверяете переменную isChecked), переменная classDel перезаписывается. Таким образом, вы удаляете только последний элемент, с которым взаимодействовали.

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

Что вы хотите сделать, так это создать список массивов и соответствующим образом изменить его. Вот пример кода для этого:

holder.mCheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
    @Override
    public void onCheckedChanged(CompoundButton buttonView,
                        boolean isChecked) {
        if(isChecked){ // checked an item, add it to the list
           Code.arrayList.add(buttonView.getTag());
        } else { // unchecked an item, remove it from the list
           Code.arrayList.remove(buttonView.getTag())
        }
    }
});

И в вашей асинхронной задаче пройдитесь по этому списку и удалите все элементы.

protected void onPostExecute(String file_url) {
    pDialog.dismiss();
    for(int item : Code.arrayList)
       Code.arrayClasses.remove(item);
    mCustom_ClassAdapter.notifyDataSetChanged();
}
person ayorhan    schedule 11.01.2014
comment
Если я использую этот код выше, то что я должен передать здесь List_ClassModel mlList_ClassModel = Code.arrayClasses.get(Code.classDel); потому что, если я передам Code.arrayList, он покажет ошибку. - person InnocentKiller; 11.01.2014
comment
Я не знаю, что у вас есть или чем вы занимаетесь на уроке кода. Вы должны соответствующим образом обновить этот класс. - person ayorhan; 11.01.2014
comment
Я только что объявил classDel как переменную int в классе Code. общедоступный статический интервал classDel; - person InnocentKiller; 11.01.2014
comment
вам нужно сделать это arraylist - person ayorhan; 11.01.2014
comment
Но если я это сделаю, я получаю ошибку в этом утверждении. List_ClassModel mlList_ClassModel = Code.arrayClasses .get(Code.arrayList); - person InnocentKiller; 11.01.2014
comment
Затем измените этот метод и любой другой связанный с ним метод. - person ayorhan; 11.01.2014
comment
Если вы поделитесь классом Code, я могу вам помочь. - person ayorhan; 11.01.2014
comment
Это не весь класс, это просто набор переменных. - person ayorhan; 11.01.2014