Проблема в удалении выбранного содержимого ListView - PullRequest
2 голосов
/ 17 июня 2011

Я пытаюсь удалить выбранный элемент из ListView, и проблема заключается в том, что когда я удаляю выбранное содержимое и обновляю адаптер, положение оставшегося содержимого изменяется, поэтому из-за этого в какой-то момент повторного удаления содержимого снова дает IndexOutOfBoundsException. Может кто-нибудь сказать мне, как решить эту проблему?

Вот мой код для удаления выбранного элемента.

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

    View view = null;
    if (convertView == null) {
        LayoutInflater inflator = mActivity.getLayoutInflater();
        view = inflator.inflate(R.layout.main, null);

        final ViewHolder viewholder = new ViewHolder();
        viewholder.tvTitle = (TextView) view.findViewById(R.id.txttitle);
        viewholder.imgdelete = (ImageButton) view.findViewById(R.id.imgdelete);


        viewholder.imgdelete.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                    list.remove(position);
                    notifyDataSetChanged();
            }
        });
        view.setTag(viewholder);
    }
    else
    {
        view  = convertView;
    }

    ViewHolder viewholder = (ViewHolder) view.getTag();
    viewholder.tvTitle.setText(list.get(position).getmTitle());

            return view;
}

Вот моя ошибка Logcat

     06-17 13:01:41.715: ERROR/AndroidRuntime(4284): FATAL EXCEPTION: main
06-17 13:01:41.715: ERROR/AndroidRuntime(4284): java.lang.IndexOutOfBoundsException: Invalid index 5, size is 5
06-17 13:01:41.715: ERROR/AndroidRuntime(4284):     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:257)
06-17 13:01:41.715: ERROR/AndroidRuntime(4284):     at java.util.ArrayList.remove(ArrayList.java:406)
06-17 13:01:41.715: ERROR/AndroidRuntime(4284):     at com.list.AdapterClass$1.onClick(AdapterClass.java:66)
06-17 13:01:41.715: ERROR/AndroidRuntime(4284):     at android.view.View.performClick(View.java:2408)
06-17 13:01:41.715: ERROR/AndroidRuntime(4284):     at android.view.View$PerformClick.run(View.java:8816)
06-17 13:01:41.715: ERROR/AndroidRuntime(4284):     at android.os.Handler.handleCallback(Handler.java:587)
06-17 13:01:41.715: ERROR/AndroidRuntime(4284):     at android.os.Handler.dispatchMessage(Handler.java:92)
06-17 13:01:41.715: ERROR/AndroidRuntime(4284):     at android.os.Looper.loop(Looper.java:123)
06-17 13:01:41.715: ERROR/AndroidRuntime(4284):     at android.app.ActivityThread.main(ActivityThread.java:4627)
06-17 13:01:41.715: ERROR/AndroidRuntime(4284):     at java.lang.reflect.Method.invokeNative(Native Method)
06-17 13:01:41.715: ERROR/AndroidRuntime(4284):     at java.lang.reflect.Method.invoke(Method.java:521)
06-17 13:01:41.715: ERROR/AndroidRuntime(4284):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
06-17 13:01:41.715: ERROR/AndroidRuntime(4284):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
06-17 13:01:41.715: ERROR/AndroidRuntime(4284):     at dalvik.system.NativeStart.main(Native Method)

Ответы [ 7 ]

3 голосов
/ 18 июня 2011

Попробуйте использовать BaseAdapter вместо ArrayAdapter.Потому что BaseAdapter лучше всего подходит для работы с пользовательскими представлениями.

Вот пример кода ..

public class AdapterClass extends BaseAdapter{

        List<MyModelClass> list;
        Activity mActivity;

        public AdapterClass(Activity context,List<MyModelClass> objects)
        {
                this.list = objects;
                this.mActivity = context;
        }

        static class ViewHolder{
                protected TextView tvTitle;
                protected ImageButton imgdelete;
        }
        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {


                final ViewHolder viewholder;
                if (convertView == null) 
                {
                        viewholder = new ViewHolder();
                        LayoutInflater inflator = mActivity.getLayoutInflater();
                        convertView = inflator.inflate(R.layout.mainn, null);
                        viewholder.tvTitle = (TextView) convertView.findViewById(R.id.txttitle);
                        viewholder.imgdelete = (ImageButton) convertView.findViewById(R.id.imgdelete);
                        convertView.setTag(viewholder);
                }
                else
                {
                    viewholder = (ViewHolder)convertView.getTag();
                }
                    viewholder.imgdelete.setOnClickListener(new OnClickListener() {

                            @Override
                            public void onClick(View v) {

                                    System.out.println("position - " + position + " size - "+ list.size());
                                    list.remove(position);
                                    notifyDataSetChanged();
                                    Toast.makeText(mActivity, "deleted", Toast.LENGTH_LONG).show();
                            }
                    });

                viewholder.tvTitle.setText(list.get(position).getmTitle());
                return convertView;
        }
        @Override
        public int getCount() {
            return list.size();
        }
        @Override
        public Object getItem(int position) {
            return position;
        }
        @Override
        public long getItemId(int position) {
            return position;
        }
}
1 голос
/ 17 июня 2011

Для удаления выбранного списка ...

1) удалить notifyDataSetChanged();

2) поставить аргумент самой позиции в list.remove(position);

OR

выполните следующие действия:

1) установите флажок в виде списка. определенно у вас есть список динамически и отображается в виде адаптера.

2) в публичном представлении getView () holder.checkBox.setOnCheckedChangeListener (new OnCheckedChangeListener () {

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

                String updateall;
                DBConnect sts1 = new DBConnect(getApplicationContext(), "your database name");


                if(holder.checkBox.isChecked()){

                    updateall = "UPDATE Sever_Contain SET setcheck = 'true' WHERE id ="+cupos;
                    System.out.println(updateall);              

                }else{

                    updateall = "UPDATE Sever_Contain SET setcheck = 'false' WHERE id ="+cupos;
                    System.out.println(updateall);
                }
                    sts1.execNonQuery(updateall);                   
                    System.out.println(map);
                    sts1.close();
            }
        });

3) при удалении клика просто добавь: del.setOnClickListener (new OnClickListener () {

        @Override
        public void onClick(View v) {
            String deleteall = "DELETE from Sever_Contain where setcheck='true'";
            if(sts.isOpen()==false)
                sts.openDataBase();

                sts.execNonQuery(deleteall);                    
                sts.close();

        }
    });

4) откуда вы начинаете это намерение создать метод onResume () для его обновления.

Это вам поможет.

0 голосов
/ 17 июня 2011

Попробуйте:

 viewholder.imgdelete.setTag(position);
    viewholder.imgdelete.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

                list.remove((Integer)v.getTag());
                notifyDataSetChanged();
        }
    });

Вы должны удалить последнее ключевое слово из параметра позиции.

0 голосов
/ 17 июня 2011

Что мне делать, когда мне нужно удалить элемент из списка, это: в щелчке по списку просто удалить элемент из массива строк (используя который я заполняю список), а затем вызвать что-то вроде этого:

listview.setAdapter(new ArrayAdapter<String>(this,R.layout.listviewactivity ,your_string_array));

работает как талисман, и нет необходимости обрабатывать какие-либо индексы вне ограниченного исключения ... надеюсь, это поможет:)

0 голосов
/ 17 июня 2011

Я пережил ту же проблему несколько дней назад и задал тот же вопрос. Вот ссылка на этот вопрос. Это вам определенно поможет.

0 голосов
/ 17 июня 2011

Используйте понятие Handler здесь. Step1 Объявить константу закрытый статический последний байт UPDATE_LIST = 100;

Step2 Вызов обработчика нажатием кнопки

viewholder.imgdelete.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                    Message msg = new Message();
                msg.what = UPDATE_LIST;
                msg.arg1 = position
                updateListHandler.sendMessage(msg);
            }
        });

Step3 Определить обработчик

private Handler updateListHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case UPDATE_LIST:
            int position = msg.arg1;
                list.remove(position);
                arrayAdapter.notifyDataSetChanged();
                break;

            }
            ;
        };
    };

См. Мой ответ в Как разделить и загрузить ListView на несколько частей?

Спасибо Дипак

0 голосов
/ 17 июня 2011

вы используете обработчик, чтобы обновить просмотр списка

private Handler handler=new Handler()
{
        public void handleMessage(Message msg) {
        ArrayAdapter aa=new ArrayAdapter<String>(nextScreen.this,android.R.layout.test_list_item,mArray);
        list.setAdapter(aa);
        aa.notifyDataSetChanged();
        list.invalidate();              
}

};

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

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