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);
}
}
ЗАКЛЮЧЕНИЕ: вы создаете один вид списка и добавляете его в диспетчер окон. но вы удаляете другое представление из оконного менеджера, в этом проблема.