Android добавить ListView в WindowManager, не может удалить последний элемент

Я хочу отобразить список в диспетчере окон.

Добавив просмотр списка в оконный менеджер. У меня есть вид наложения на экране, тогда при добавлении, редактировании, удалении элемента я буду работать только с адаптером и методом notifydatasetchanged().

Но у меня возникает проблема, когда удаляю последний элемент, я вижу журнал, удаляющий успех, но ЭТОТ ПУНКТ ПОСТОЯННО ОТОБРАЖАЕТСЯ В DESKTOP, хотя я удаляю Listview из оконного менеджера, я не знаю, почему это так?

вот мой код:

Добавить просмотр списка:

 private void addNotificationView(final Context context) {
        if (windowManager == null)
            windowManager = (WindowManager) context
                    .getSystemService(Context.WINDOW_SERVICE);

        // NotificationView[messageNumber] =
        // LayoutInflater.from(context).inflate(
        // R.layout.fr_alert, null);
        lv = new ListView(context);
        if (messageNumber == 0) {
            lv.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
                    LayoutParams.WRAP_CONTENT));
            lv.requestLayout();
            lv.setBackgroundColor(Color.BLACK);
            data.add(messageNumber + " <(^OO^)>");
            adapter = new NotifyView(context, data);
            lv.setAdapter(adapter);
        } else {
            data.add(messageNumber + " <(^OO^)>");
            adapter.notifyDataSetChanged();
        }
        params = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.MATCH_PARENT,
                WindowManager.LayoutParams.WRAP_CONTENT,
                WindowManager.LayoutParams.TYPE_PHONE,
                WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
                PixelFormat.TRANSPARENT);

        params.gravity = Gravity.TOP;
        // | Gravity.FILL_HORIZONTAL;
        params.x = 0;
        params.y = 0;
        // Logger.error("y asix: " + (messageNumber * notifyHeight));
        //
        ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE))
                .addView(lv, params);
        messageNumber++;
        Logger.error("Added View");
    }

адаптер:

        @Override
        public android.view.View getView(final int pos,
                android.view.View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub
            if (convertView == null)
                convertView = LayoutInflater.from(mContext).inflate(
                        R.layout.fr_alert, parent, false);

            LinearLayout lnl = (LinearLayout) convertView
                    .findViewById(R.id.bgTextContent);
            lnl.setBackgroundColor(Color.parseColor("#000000"));
            lnl.setAlpha((float) 0.9);
            TextView tv = (TextView) convertView.findViewById(R.id.tvContent);
            tv.setText("<(^OO^)> " + data.get(pos));
            tv.setTextColor(Color.WHITE);
            TextView tvDelete = (TextView) convertView
                    .findViewById(R.id.tvDelete);

            tvDelete.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View arg0) {
                    // TODO Auto-generated method stub
                    if (adapter.getCount() != 1) {
                        data.remove(pos);
                        adapter.notifyDataSetChanged();
                    } else {
                        // adapter = null;
                        messageNumber = 0;
                        destroynotification(mContext);
                    }
                }
            });
            return convertView;
        }

Затем, когда размер адаптера = 0. Я удаляю просмотр списка, но это тоже не беспокоит:(

private void destroynotification(Context context) {
        if (lv != null) {
            ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE))
                    .removeView(lv);
            Logger.error("Removed View, mess number = " + messageNumber);
        }
    }

Пожалуйста, смотрите изображение, я нажал, чтобы удалить последний элемент, журнал показывает, что метод destroyNotication() вызывается. Но этот пункт все еще отображается здесь:(.

1 ответ

Решение

Здесь вы создаете новый просмотр списка каждый раз,

 lv = new ListView(context);
        if (messageNumber == 0) {
            lv.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
                    LayoutParams.WRAP_CONTENT));
            lv.requestLayout();
            lv.setBackgroundColor(Color.BLACK);
            data.add(messageNumber + " <(^OO^)>");
            adapter = new NotifyView(context, data);
            lv.setAdapter(adapter);
        } else {
            data.add(messageNumber + " <(^OO^)>");
            adapter.notifyDataSetChanged();
        }

изменить на это:

    if (messageNumber == 0) {
lv = new ListView(context);
            lv.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,
                    LayoutParams.WRAP_CONTENT));
            lv.requestLayout();
            lv.setBackgroundColor(Color.BLACK);
            data.add(messageNumber + " <(^OO^)>");
            adapter = new NotifyView(context, data);
            lv.setAdapter(adapter);
        } else {
            data.add(messageNumber + " <(^OO^)>");
            adapter.notifyDataSetChanged();
        }

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

private void destroynotification(Context context) {
        if (lv != null) {
            ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE))
                    .removeView(lv);
            Logger.error("Removed View, mess number = " + messageNumber);
        }
    }

ЗАКЛЮЧЕНИЕ: вы создаете один вид списка и добавляете его в диспетчер окон. но вы удаляете другое представление из оконного менеджера, в этом проблема.

Другие вопросы по тегам