Удалить элемент из списка с помощью SQLite - PullRequest
0 голосов
/ 28 августа 2018

У меня странная проблема в моем ListView, и я не понимаю, почему это происходит.

В моем checklist, когда я выбираю 3 или более элементов, только последний и первый элемент удаляются, второй элемент не удаляется. Он остается выбранным, и мне нужно снова нажать эту кнопку сообщения.

Активность SendDataFragment

   btn_DataSend=(Button) getActivity().findViewById(R.id.trn_post_btn);
    btn_DataSend.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            StringBuffer responseText = new StringBuffer();
            responseText.append("The following were selected...\n");

            //get All info like custID, mStatus mTrnNo mCustID mCustName
            List<customerInfo> stateList = adapter.mCategories;

            for(int i=0;i<stateList.size();i++)
            {
                customerInfo state = stateList.get(i);
                if(state.ismStatus())
                {
                    //postData(state.getmTrnNo());
                    int c = i;
                    dbManager.delete_ShipmentDetails(state.getmCustID());
                    stateList.remove(i);
                }
            }
            adapter.notifyDataSetChanged();
           Toast.makeText(getActivity(), responseText, Toast.LENGTH_LONG).sho();
        }
    });

DBManager

 public void delete_ShipmentDetails(String id){
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        db.execSQL("delete from "+ DatabaseHelper.TBL_OE_SHIPMENT_H +" WHERE " +DatabaseHelper.OE_SHIPMENT_H_CUSTID+"="+id);
}

Снимки экрана моего приложения:

Before Remove Item After Remove Item

Ответы [ 3 ]

0 голосов
/ 28 августа 2018

Это потому, что вы перебираете список, изменяя его длину.

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

Iterator<Integer> it = stateList.iterator();
while (it.hasNext()) {
    customerInfo state = it.next();
    if(state.ismStatus()) {
        dbManager.delete_ShipmentDetails(state.getmCustID());
        it.remove();
    }
}
adapter.notifyDataSetChanged();
0 голосов
/ 28 августа 2018

Теперь я понял ясно, что я также сделал другой путь, просто измени здесь, как

       for(int i=0;i<stateList.size();i++)
                    {
                        customerInfo state = stateList.get(i);
                        if(state.ismStatus())
                        {
                            postData(state.getmTrnNo());
                            dbManager.delete_ShipmentDetails(state.getmCustID());
                            stateList.remove(i);
                            i--;
                        }
                    }
                    adapter.notifyDataSetChanged();
});
0 голосов
/ 28 августа 2018

Используйте loop в обратном порядке

 for(int i = stateList.size()-1; i >= 0; i--){
        customerInfo state = stateList.get(i);
        if(state.ismStatus())
        {
            //postData(state.getmTrnNo());
            int c = i;
            dbManager.delete_ShipmentDetails(state.getmCustID());
            stateList.remove(i);
            notifyItemRemoved(i);
        }
     }

        adapter.notifyDataSetChanged();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...