SwipeListView 删除一行后停留在 "swiped state"
SwipeListView stays in "swiped state" after deleting a row
我正在为我的列表使用 SwipeListView 库。列表适配器使用 ViewHolder 模式,一切正常。我设置了向左滑动,在我的列表项视图下有一个后视图。在这个后视图上,我有一个文本视图 "Delete"。点击后,正在执行删除操作。正在刷新适配器中的数据。行已删除 ..但是 "swiped state" 被设置在位置接近被删除行的行上。我相信这是因为 "swiped state" 被 convertview 记住了。当我注释掉检查 convertview 是否为空时,问题消失了,但列表滚动性能是不可接受的。
有没有办法在删除操作后清除 convertview?或者还有其他解决方法吗?
我的 ViewHolder:
public static <T extends View> T get(View view, int id) {
SparseArray<View> viewHolder = (SparseArray<View>) view.getTag();
if (viewHolder == null) {
viewHolder = new SparseArray<View>();
view.setTag(viewHolder);
}
View childView = viewHolder.get(id);
if (childView == null) {
childView = view.findViewById(id);
viewHolder.put(id, childView);
}
return (T) childView;
}
我的适配器的 getView():
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = LayoutInflater.from(context)
.inflate(R.layout.level_item, parent, false);
}
...
...
del = ViewHolderNew.get(convertView, R.id.del);
del.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Level level = list.get(position);
long id = level.getId();
Level leveltoDelete = Level.load(Level.class, id);
new Delete().from(Recipient.class).where("level = ?", id).execute();
leveltoDelete.delete();
remove(level);
notifyDataSetInvalidated();
}
});
还有我的 xml 文件:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="0dp"
android:background="@color/white_background"
>
//item back layout
<LinearLayout
android:id="@+id/item_back"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/del"
android:layout_width="match_parent"
android:layout_height="180dp"
android:gravity="center_vertical|right"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:background="@color/delete_background"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:paddingRight="30dp"
android:textColor="@color/white_background"
android:text="Delete"
android:textAppearance="?android:attr/textAppearanceMedium" />
</LinearLayout>
//item front layout
<RelativeLayout
android:id="@+id/item_front"
android:layout_width="match_parent"
android:layout_height="match_parent">
...
我不知道那个库,但我认为它会改变行项的子项的可见性。
删除和刷新后,ListView 请求新行,将旧视图作为 convertViews 传递给您 - 其中之一是 "swiped" 视图。向下滚动列表后可能会观察到相同的行为,因为它还重用了不再可见的视图。
如果你能说视图是滑动后的,可能你可以在重用之前应用反向转换(或者只是膨胀新的,每页一行对性能来说应该不会太差)。
但是,如果您向下滚动并返回,此灵魂将不会保持滑动状态。如果您需要跟踪滑动位置,您应该考虑添加额外的视图类型(参见 getViewType(position)
和 getViewTypeCount()
)。
我正在为我的列表使用 SwipeListView 库。列表适配器使用 ViewHolder 模式,一切正常。我设置了向左滑动,在我的列表项视图下有一个后视图。在这个后视图上,我有一个文本视图 "Delete"。点击后,正在执行删除操作。正在刷新适配器中的数据。行已删除 ..但是 "swiped state" 被设置在位置接近被删除行的行上。我相信这是因为 "swiped state" 被 convertview 记住了。当我注释掉检查 convertview 是否为空时,问题消失了,但列表滚动性能是不可接受的。 有没有办法在删除操作后清除 convertview?或者还有其他解决方法吗?
我的 ViewHolder:
public static <T extends View> T get(View view, int id) {
SparseArray<View> viewHolder = (SparseArray<View>) view.getTag();
if (viewHolder == null) {
viewHolder = new SparseArray<View>();
view.setTag(viewHolder);
}
View childView = viewHolder.get(id);
if (childView == null) {
childView = view.findViewById(id);
viewHolder.put(id, childView);
}
return (T) childView;
}
我的适配器的 getView():
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = LayoutInflater.from(context)
.inflate(R.layout.level_item, parent, false);
}
...
...
del = ViewHolderNew.get(convertView, R.id.del);
del.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Level level = list.get(position);
long id = level.getId();
Level leveltoDelete = Level.load(Level.class, id);
new Delete().from(Recipient.class).where("level = ?", id).execute();
leveltoDelete.delete();
remove(level);
notifyDataSetInvalidated();
}
});
还有我的 xml 文件:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="0dp"
android:background="@color/white_background"
>
//item back layout
<LinearLayout
android:id="@+id/item_back"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/del"
android:layout_width="match_parent"
android:layout_height="180dp"
android:gravity="center_vertical|right"
android:layout_marginTop="10dp"
android:layout_marginBottom="10dp"
android:background="@color/delete_background"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:paddingRight="30dp"
android:textColor="@color/white_background"
android:text="Delete"
android:textAppearance="?android:attr/textAppearanceMedium" />
</LinearLayout>
//item front layout
<RelativeLayout
android:id="@+id/item_front"
android:layout_width="match_parent"
android:layout_height="match_parent">
...
我不知道那个库,但我认为它会改变行项的子项的可见性。
删除和刷新后,ListView 请求新行,将旧视图作为 convertViews 传递给您 - 其中之一是 "swiped" 视图。向下滚动列表后可能会观察到相同的行为,因为它还重用了不再可见的视图。
如果你能说视图是滑动后的,可能你可以在重用之前应用反向转换(或者只是膨胀新的,每页一行对性能来说应该不会太差)。
但是,如果您向下滚动并返回,此灵魂将不会保持滑动状态。如果您需要跟踪滑动位置,您应该考虑添加额外的视图类型(参见 getViewType(position)
和 getViewTypeCount()
)。