【问题标题】:SwipeListView stays in "swiped state" after deleting a rowSwipeListView 在删除一行后保持“滑动状态”
【发布时间】:2015-01-30 18:12:20
【问题描述】:

我正在为我的列表使用 SwipeListView 库。列表适配器使用 ViewHolder 模式,一切正常。我设置了向左滑动,在我的列表项视图下有一个后视图。在这个后视图上,我有一个文本视图“删除”。点击后,正在执行删除操作。适配器中的数据正在刷新。行被删除..但是“滑动状态”被设置在位置接近被删除的行的行上。我相信它的发生是因为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">
...

【问题讨论】:

  • 请发布您的代码。

标签: android listview convertview


【解决方案1】:

我不知道那个库,但我认为它会改变行项子项的可见性。

删除和刷新后,ListView 请求新行,将旧视图作为 convertViews 传递给您 - 其中之一是“滑动”视图。向下滚动列表后可能会观察到相同的行为,因为它还重用了不再可见的视图。

如果您可以说视图是在滑动之后,那么您可能可以在重用之前应用反向转换(或者只是膨胀新的,每页一行应该不会对性能非常不利)。

但是,如果您向下滚动并返回,此灵魂将不会保持滑动状态。如果您需要跟踪滑动位置,您应该考虑添加额外的视图类型(参见getViewType(position)getViewTypeCount())。

【讨论】:

  • 滚动不是问题,因为 SwipeListView 中有 setSwipeCloseAllItemsWhenMoveList() 方法。但是你指引我走上正确的轨道——我开始寻找反向转换,我找到了一个 closeAnimate() 方法,当我在 delete 方法之前调用它时它会做的事情。谢谢。
猜你喜欢
  • 1970-01-01
  • 2021-11-24
  • 1970-01-01
  • 1970-01-01
  • 2016-01-30
  • 1970-01-01
  • 2020-03-09
  • 2021-11-15
  • 2013-07-02
相关资源
最近更新 更多