Zeg*_*hra 5 android visibility android-recyclerview cardview
我只想在我的回收站中列出不喜欢的项目。我在 MainActivity 的 rv 中有一个完整的项目列表(这里没有设置可见性)。我可以通过单击图像按钮为每个项目设置喜欢或不喜欢。MainActivity 显示了显示图像按钮喜欢与否的项目(卡片视图)的完整列表。如果项目被喜欢,这将作为单独的条目存储在 firebase db 中,在 Likes with item key (firebase key .push) 下,而不是在 Items 下。(在 firebase db 中,我有用户、项目、喜欢)。
这是我的子活动代码 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);
}
Run Code Online (Sandbox Code Playgroud)
我寻找了许多解决方案,例如 onBindViewHolder、notifyDataChanged、将边距设置为 0、将 xml 中的布局大小设置为 wrap_content。我能得到的最好的方法是使用 mRecyclerView.getAdapter().notifyItemRemoved(position); 让不喜欢的项目没有空间,但是向后滚动列表会使整个 rv 变得混乱(重复条目、空格、无序列表)。
我不知道如何在新活动中仅从 MainActivity rv 的完整项目列表中列出不喜欢的项目?我上面的代码只显示不喜欢的项目,但直到我滚动到列表末尾,如果我向后滚动,rv 就会搞砸。我在 onBindViewHolder 中记录了视图的位置(18 项),首先它按顺序计算所有项(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>
Run Code Online (Sandbox Code Playgroud)
(不知道如何添加图片)当不喜欢的列表出现时,它会显示第一项(cardview 占据全屏),当我开始滚动列表时(从 1. 可见项到下一个可见项)如果有space(item1 vis and next vis item is 4),重新排列,我可以看到下一个可见 item(item4) 移动到 1.visible item,然后列表的其余部分排列得很好,直到我开始向后滚动,然后它用空格和双项重新排列 rv。该列表来回循环直到两端(这是完整项目列表的长度,而不仅仅是不喜欢的项目),但可见项目变得一团糟。
我找到了过滤整个数据库的解决方案。在我的问题中,我只想在单独的活动中获取喜欢/不喜欢的项目,尽管我之前的代码显示了过滤的项目,但有间隙。在下面的代码中,我更改了 DatabaseReferences(具有完整项目列表的 mDatabase -节点和具有项目 uid 和用户 uid 的 mDatabaseItemsLiked -节点)。
这只给出了只有数字作为 likeItems 的空卡,但为了从 mDatabase(完整列表)中获取名称,我使用了 dataSnapshot.getValue(Item.class).getItemName()。
firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<Item,
MainActivity.ItemViewHolder>(
Item.class,
R.layout.list_item,
MainActivity.ItemViewHolder.class,
mDatabaseItemsLiked
) {
@Override
protected void populateViewHolder(final MainActivity.ItemViewHolder
viewHolder, final Item model, final int position) {
final String itemKey = getRef(position).getKey();
mDatabase.child(itemKey).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
viewHolder.itemNameSetup(dataSnapshot.getValue(Item.class).getItemName());
viewHolder.mView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent itemSheetIntent = new Intent(LikedItemsActivity.this, ItemSheetActivity.class);
adatlapIntent.putExtra("item_key", itemKey);
startActivity(itemSheetIntent);
}
});
Run Code Online (Sandbox Code Playgroud)
这对我来说没有任何问题。我希望它是网络高效的。
| 归档时间: |
|
| 查看次数: |
5570 次 |
| 最近记录: |