【发布时间】:2018-02-26 20:01:17
【问题描述】:
我只想在我的回收站视图中列出不喜欢的项目。我在 MainActivity 的 rv 中有完整的项目列表(此处未设置可见性)。我可以通过单击图像按钮来设置喜欢或不喜欢的每个项目。 MainActivity 显示显示图像按钮喜欢与否的项目(卡片视图)的完整列表。如果 item 被喜欢,它会作为单独的条目存储在 firebase db 中,在带有 item 键(firebase key .push)的 Likes 下,而不是在 Items 下。 (在 firebase 数据库中,我有用户、项目、喜欢)。
这是我的子活动代码 DislikedItemsActivity,我想通过使用 setVisibility(View.GONE) 仅显示不喜欢的项目来显示喜欢的项目。这仍然保留了 View.GONE 项目之间的空间(尽管这些卡片视图是空的)。
mRecyclerView = (RecyclerView) findViewById(R.id.rvItemList);
mRecyclerView .setHasFixedSize(true);
final LinearLayoutManager linearLayoutManager = new
LinearLayoutManager(this);
linearLayoutManager.setReverseLayout(true);
linearLayoutManager.setStackFromEnd(true);
mRecyclerView.setLayoutManager(linearLayoutManager);
final FirebaseRecyclerAdapter<Item, MainActivity.ItemViewHolder>
firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Item,
MainActivity.ItemViewHolder>(
Item.class,
R.layout.list_item,
MainActivity.ItemViewHolder.class,
mDatabase
) {
@Override
protected void populateViewHolder(final MainActivity.ItemViewHolder viewHolder, final Item model, final int position) {
final String itemKey = getRef(position).getKey();
mDatabaseItemsLiked.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
// if item is not liked, thus no user set in db ( I want to see only items that are liked in my recyclerview)
if (!dataSnapshot.child(itemKey).hasChild(mAuth.getCurrentUser().getUid())) {
viewHolder.mView.setVisibility(View.VISIBLE);
viewHolder.itemNameSetup(model.getItemName());
viewHolder.mView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent itemSheetIntent = new Intent(DislikedItemsActivity.this, ItemSheetActivity.class);
adatlapIntent.putExtra("item_key", itemKey);
startActivity(itemSheetIntent);
}
});
} else {
viewHolder.mView.setVisibility(View.GONE);
mRecyclerView.getAdapter().notifyItemRemoved(position); //this puts together the visible items, but when scrolling, it gets messed up
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.e(TAG, databaseError.toString());
}
});
}
@Override
public void onBindViewHolder(MainActivity.TermekViewHolder viewHolder, int position) {
super.onBindViewHolder(viewHolder, position);
}
};
mRecyclerView.setAdapter(firebaseRecyclerAdapter);
}
我寻找了许多解决方案,例如 onBindViewHolder、notifyDataChanged、将边距设置为 0、将 xml 中的布局大小设置为 wrap_content。我能得到的最好的方法是使用 mRecyclerView.getAdapter().notifyItemRemoved(position); 让不喜欢的项目没有空格,但是向后滚动列表整个 rv 会变得混乱(重复条目、空格、无序列表)。
我不知道如何在新活动中仅列出 MainActivity rv 的完整项目列表中不喜欢的项目?我上面的代码只显示不喜欢的项目,但只有在我滚动到列表末尾之前,如果我向后滚动,rv 就会搞砸。我在 onBindViewHolder 中记录了视图 (18items) 的位置,首先它按顺序计算所有项目 (17,16,15,14...0),但是从列表末尾滚动到向后,位置从 0 跳到 4 就像 7 次(总是改变多少次)然后项目 5,6 相同,直到项目 17(它们的所有位置在滚动期间显示在 onBindViewHolder 7 或 8 次,即 5,5,5,5,6,6,6 ,6) 并且仅用于向后滚动和向后移动期间 rv 仅显示不喜欢的项目或空视图或不喜欢的项目的重复条目。
我的 xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:background="@drawable/hatter"
tools:context="com.example.user.itemlist.ItemsLikedActivity">
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/rvItemList"
>
</android.support.v7.widget.RecyclerView>
(不知道如何添加图片)当不喜欢的列表出现时,它显示第一个项目(cardview占据全屏),当我开始滚动列表时(从1.可见项目到下一个可见项目)如果有空格(item1 vis 和 next vis item 是 4),重新排列,我可以看到下一个可见项目(item4)移动到 1.可见项目,然后列表的其余部分安排得很好,直到我开始向后滚动,然后它用空格和双重输入重新排列 rv。该列表来回移动直到两端(这是完整项目列表的长度,而不仅仅是不喜欢的项目),但可见项目都被弄乱了。
【问题讨论】:
-
显示你的 xml 文件
-
也分享截图
-
你真的不应该在 RecyclerView 的每一行中进行网络调用。您应该将数据下载到另一个类中,然后在下载后将其传递给适配器。或者过滤您已有的列表,然后将其传递给适配器。这样,您根本不需要将可见性设置为 GONE。
-
更新了 xml 和截图描述
-
对不起,我不明白你的建议-billynomates。我怎么知道其他用户是否喜欢我的项目,除非我从 db.xml 下载它。我正在使用firebase的离线功能并且应用程序离线工作,因此不喜欢或从喜欢变为不喜欢的项目出现在ItemsNotLikedActivity中(最初我写了ItemsLikedActivity,但它实际上是ItemsNotLiked)。它也会离线更改状态。滚动弄乱了列表。
标签: android android-recyclerview visibility cardview