Navigationdrawer 视图在打开时不刷新
Navigationdrawer view not refreshed when open
我有一个包含通知列表的应用程序。
通知列在导航抽屉中。
(即当用户点击汉堡包图标时,打开的通知列表被打开)。
导航抽屉本身是 swipeRefreshLayout 中的列表视图,就像您在以下代码中看到的那样(用户必须将其下拉以刷新通知):
<LinearLayout
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:gravity="bottom|center"
android:orientation="vertical">
<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/swipe_container"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/left_drawer"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="#ffffff"
android:choiceMode="singleChoice"
android:divider="@android:color/darker_gray"
android:dividerHeight="0dp" />
</android.support.v4.widget.SwipeRefreshLayout>
</LinearLayout>
到目前为止,一切都按预期进行。
现在我必须实施场景来上传离线创建的通知。
在我的服务中,我发送了一个更新广播消息,它由导航抽屉使用以下代码检索(仍然需要稍微清理一下):
private static BroadcastReceiver messageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String message = intent.getStringExtra("message");
//TODO make message for notification service
if(!LocationService.REFRESH_LOCATION_ACTION_MESSAGE.equals(message)) {
Log.i(TAG, "Got message: " + message);
notifications.clear();
notifications.addAll(intent.getParcelableArrayListExtra(NotificationService.NOTIFICATION_LIST_ARGUMENT));
try {
Collections.sort(notifications, new NotificationComparator());
} catch(Exception e){
Log.e(TAG, Log.getStackTraceString(e));
}
Log.d(TAG, "got notifications: " + notifications);
adapter.notifyDataSetChanged();
swipeLayout.setRefreshing(false);
}
}
};
这部分代码应在创建通知时刷新视图(或发送,如果它是离线创建的)。
当我现在发送离线创建的通知并在打开导航抽屉之前稍等片刻时,视图已更新并且通知被标记为已发送。
所以这工作正常。
现在问题:
当我发送一个离线创建的通知并在通知发送后直接打开导航抽屉时,列表视图没有更新并且通知仍然标记为未发送(但是当我打开通知时,它被标记为发送)。
是同步问题还是我做错了什么?
开不开应该没什么区别吧?
您应该通过这种方式更新导航抽屉中的列表视图
public void updateView(int index) {
if (mDrawerList != null) {
View v = mDrawerList.getChildAt(index -
mDrawerList.getFirstVisiblePosition());
if (v == null)
return;
ListView lv= (TextView) v.findViewById(R.id.left_drawer); //update your data here
}
}
我有一个包含通知列表的应用程序。 通知列在导航抽屉中。 (即当用户点击汉堡包图标时,打开的通知列表被打开)。 导航抽屉本身是 swipeRefreshLayout 中的列表视图,就像您在以下代码中看到的那样(用户必须将其下拉以刷新通知):
<LinearLayout
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:gravity="bottom|center"
android:orientation="vertical">
<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/swipe_container"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/left_drawer"
android:layout_width="240dp"
android:layout_height="match_parent"
android:layout_gravity="start"
android:background="#ffffff"
android:choiceMode="singleChoice"
android:divider="@android:color/darker_gray"
android:dividerHeight="0dp" />
</android.support.v4.widget.SwipeRefreshLayout>
</LinearLayout>
到目前为止,一切都按预期进行。 现在我必须实施场景来上传离线创建的通知。 在我的服务中,我发送了一个更新广播消息,它由导航抽屉使用以下代码检索(仍然需要稍微清理一下):
private static BroadcastReceiver messageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String message = intent.getStringExtra("message");
//TODO make message for notification service
if(!LocationService.REFRESH_LOCATION_ACTION_MESSAGE.equals(message)) {
Log.i(TAG, "Got message: " + message);
notifications.clear();
notifications.addAll(intent.getParcelableArrayListExtra(NotificationService.NOTIFICATION_LIST_ARGUMENT));
try {
Collections.sort(notifications, new NotificationComparator());
} catch(Exception e){
Log.e(TAG, Log.getStackTraceString(e));
}
Log.d(TAG, "got notifications: " + notifications);
adapter.notifyDataSetChanged();
swipeLayout.setRefreshing(false);
}
}
};
这部分代码应在创建通知时刷新视图(或发送,如果它是离线创建的)。
当我现在发送离线创建的通知并在打开导航抽屉之前稍等片刻时,视图已更新并且通知被标记为已发送。 所以这工作正常。
现在问题: 当我发送一个离线创建的通知并在通知发送后直接打开导航抽屉时,列表视图没有更新并且通知仍然标记为未发送(但是当我打开通知时,它被标记为发送)。
是同步问题还是我做错了什么? 开不开应该没什么区别吧?
您应该通过这种方式更新导航抽屉中的列表视图
public void updateView(int index) {
if (mDrawerList != null) {
View v = mDrawerList.getChildAt(index -
mDrawerList.getFirstVisiblePosition());
if (v == null)
return;
ListView lv= (TextView) v.findViewById(R.id.left_drawer); //update your data here
}
}