Android: как удалить последний элемент списка и список - PullRequest
0 голосов
/ 04 августа 2011

У меня есть действие, которое расширяет ListActivity. Он имеет много вещей, но среди них он показывает статьи, которые пользователь приобрел с помощью адаптера. Ну, у меня есть метод, который пользователь может удалить элементы из списка. Проблема в том, что есть только один предмет. Если я пытаюсь удалить последний, приложение вылетает. Вот мой код:

public class Ventas extends ListActivity {

......

lv = getListView();

......

 protected void confirmRemoval(final int arg2) {
    // TODO Auto-generated method stub
    AlertDialog alertDialog = new AlertDialog.Builder(this).create();
    alertDialog.setTitle(getResources().getString(R.string.ventas));
    alertDialog.setMessage(getResources().getString(R.string.confirmacion2));
    alertDialog.setButton("Si",
            new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    dialog.dismiss();
                    if(adapter2.mEvents.size()>=1){
                    adapter2.mEvents.remove(arg2);
                    } else {

                        //doesn't work
                        /*adapter2=null;
                        adapter2.notifyDataSetInvalidated();
                        lv.setVisibility(View.GONE);*/
                    }

                }
            });
    alertDialog.setButton2("No", new DialogInterface.OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int which) {
            // TODO Auto-generated method stub
            dialog.dismiss();
        }
    });

    alertDialog.show();


}

вот адаптер и обертка:

private class EventAdapter2 extends BaseAdapter {

    public ArrayList<Articulo> mEvents = null;

    public EventAdapter2(Context c, ArrayList<Articulo> clientes) {
        mContext = c;
        mEvents = clientes;
    }

    public int getCount() {
        return mEvents.size();
    }

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

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

    public View getView(int position, View convertView, ViewGroup parent) {
        EventEntryView2 btv;
        if (convertView == null) {
            btv = new EventEntryView2(mContext, mEvents.get(position));

        } else {
            btv = (EventEntryView2) convertView;
            String title1 = mEvents.get(position).getCantidad() + "";

            if (title1 != null) {
                btv.setText1Title(title1);
            }

            String title2 = mEvents.get(position).getDescripcion();

            if (title2 != null) {
                btv.setText2Title(title2);
            }

            String title3 = mEvents.get(position).getpVenta() + "0";

            if (title3 != null) {
                btv.setText3Title(title3);
            }

            String title4 = (mEvents.get(position).getCantidad() * mEvents
                    .get(position).getpVenta()) + "0";

            if (title4 != null) {
                btv.setText4Title(title4);
            }

        }

        return btv;

    }

    private Context mContext;

}

private class EventEntryView2 extends LinearLayout {

    private TextView text1;
    private TextView text2;
    private TextView text3;
    private TextView text4;
    private View inflatedView;

    public EventEntryView2(Context context, Articulo resp) {
        super(context);
        this.setOrientation(VERTICAL);

        inflatedView = View.inflate(context, R.layout.results, null);
        text1 = (TextView) inflatedView.findViewById(R.id.textView1);
        text2 = (TextView) inflatedView.findViewById(R.id.textView2);
        text3 = (TextView) inflatedView.findViewById(R.id.textView3);
        text4 = (TextView) inflatedView.findViewById(R.id.textView4);

        String t = resp.getCantidad() + "";
        text1.setText(t);

        String t1 = resp.getDescripcion();
        text2.setText(t1);

        String t2 = resp.getpVenta() + "0";
        text3.setText(t2);

        String t3 = (resp.getCantidad() * resp.getpVenta()) + "0";
        text4.setText(t3);

        addView(inflatedView, new LinearLayout.LayoutParams(
                LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));

    }

    public void setText4Title(String title4) {
        text4.setText(title4);
    }

    public void setText3Title(String title3) {
        text3.setText(title3);
    }

    public void setText2Title(String title2) {
        text2.setText(title2);
    }

    public void setText1Title(String title1) {
        text1.setText(title1);

    }
}

Как вы можете видеть, когда у меня остался только один элемент, я попытался установить для адаптера значение null или adapter.notifyDataSetInvaliadted или даже сделать список невидимым, ничего не работает. Что происходит, когда я нажимаю кнопку ОК, ничего не меняется, а когда я нажимаю второй раз, все это вылетает

Что бы я хотел, чтобы listView исчез, когда адаптер пуст, но у меня нет идей, возможно ли это вообще? Есть идеи?

EDIT: Спасибо всем за ответы, но проблема была в том, что я изменял список изнутри внутреннего анонимного класса. На самом деле все довольно просто, создайте метод и вызовите его из диалога, когда массив будет пуст, список автоматически исчезнет:

 protected void removeFromList(int arg2) {  
    adapter2.mEvents.remove(arg2);
    adapter2.notifyDataSetChanged();
  }

Ответы [ 4 ]

1 голос
/ 04 августа 2011

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

youradapter.notifyDataSetChanged();

и все, что вы делаете для одного элемента, который был

adapter2 = null;
adapter2.notifyDataSetInavlidated();

, это, очевидно, будетсбой, потому что объект adapter2 был нулевым, так как нулевой объект уведомляет свои данные

0 голосов
/ 04 августа 2011

Для setVisibility для работы:

  1. Вы создаете свой main.xml
  2. Добавьте к нему ListView

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res/sherif.android.deedz" 
        android:orientation="vertical" android:layout_width="match_parent"
        android:layout_height="match_parent">
    <ListView android:layout_width="match_parent"
    android:layout_height="match_parent" android:id="@+id/myListView"
    android:divider="#ffa500" android:dividerHeight="1px"
    android:background="@drawable/somedrawable_xml"        
    android:choiceMode="singleChoice"></ListView>
    </ListView>
    

Теперь вы можете сделать это GONE

Если вам нужны все детали этого: отметьте мой ответ

0 голосов
/ 04 августа 2011

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

0 голосов
/ 04 августа 2011

Попробуйте позвонить lv.invalidate() после remove() и посмотрите, имеет ли это значение.

...