首页 > 解决方案 > 片段中的 Firebase firestore 回收视图。如何在幻灯片上进行删除

问题描述

我正在使用 Firebase firestore 和 firebase Auth 开展我的学校项目。这有点像看板应用程序。

我的意图是在滑动时从数据库中添加删除文档,并在左右滑动时将文档移动到另一个目录。我的主要活动(TestActivity)是选项卡,所以我希望删除或移动取决于方向和实际选项卡。每个选项卡都有自己的回收视图。你知道:要做,进行中,完成。

我尝试遵循代码流程:https ://www.youtube.com/watch?v= ub6mNHWGVHw&list=PLrnPJCHvNZuAXdWxOzsN5rgG2M4uJ8bH1 但我的项目需要片段,并且使用它们,他的“NoteAdapter”不起作用。我找到了本教程:https ://www.youtube.com/watch?v=FFHuYcB3YnU 并使用它将适配器放置在正确的片段中。

一切正常,直到我想对 firebase 文档做点什么。这根本不起作用,或者我只是不知道在哪里放置它:

    new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0,
                ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT) {
            @Override
            public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
                return false;
            }
            @Override
            public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
                adapter.deleteItem(viewHolder.getAdapterPosition());
            }
        }).attachToRecyclerView(recyclerView);
  public void deleteItem(int position) {
        getSnapshots().getSnapshot(position).getReference().delete();
    }

我第一次使用firebase和fragments。

这是我的一些代码:TestActivity(我的主,我还有一个带有用户信息和注销按钮的抽屉,但是这个按钮也不起作用):

    public class TestActivity extends AppCompatActivity  implements NavigationView.OnNavigationItemSelectedListener {

private TabLayout tabLayout;
private ViewPager viewPager;
private SectionsPagerAdapter adapter;


    private DrawerLayout drawer;
    FirebaseAuth mAuth;
    FirebaseUser currentUser;





    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);

        Toolbar toolbar = findViewById(R.id.toolbar); // toolbar staje sie action bar
        setSupportActionBar(toolbar);

        drawer = findViewById(R.id.drawer_layout);
     
        NavigationView navigationView = (NavigationView)findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);

        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.addDrawerListener(toggle);
        toggle.syncState();


        mAuth = FirebaseAuth.getInstance();
        currentUser = mAuth.getCurrentUser();
        updateNavHeader();


        viewPager = findViewById(R.id.view_pager);
        tabLayout = findViewById(R.id.tabs);
        adapter = new SectionsPagerAdapter(getSupportFragmentManager());

        adapter.AddFragment(new TodoFragment(), "To Do");
        adapter.AddFragment(new InprogressFragment(), "In Progress");

        adapter.AddFragment(new DoneFragment(), "Done");

        viewPager.setAdapter(adapter);
        tabLayout.setupWithViewPager(viewPager);


        FloatingActionButton fab = findViewById(R.id.add_todo);

        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Add new item", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
                 updateUI();
                }
        });
   }



    @Override
    public void onBackPressed() {
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }
 // po zalogowaniu dane w drawer sie zmienia
    public void updateNavHeader() {
        
        NavigationView navigationView =(NavigationView) findViewById(R.id.nav_view);
        View headerView = navigationView.getHeaderView(0);
        TextView navUserName = headerView.findViewById(R.id.nav_username);
        TextView navUserEmail = headerView.findViewById(R.id.nav_useremail);
        ImageView userAvatar = headerView.findViewById(R.id.nav_useravatar);
        navUserName.setText(currentUser.getDisplayName());
        navUserEmail.setText(currentUser.getEmail());
       
        if (currentUser.getPhotoUrl() != null) {
            Glide.with(this).load(currentUser.getPhotoUrl()).into(userAvatar);
        } else {
            Glide.with(this).load(R.drawable.userphoto).into(userAvatar);
        }
    }

 
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {

   
        if (item.getItemId() == R.id.nav_signout) {
            FirebaseAuth.getInstance().signOut();
            Intent loginActivity = new Intent(getApplicationContext(), LoginActivity.class);
            startActivity(loginActivity);
            finish();
        }
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }
    private void updateUI() {
        Intent NewActivity = new Intent(getApplicationContext(), NewActivity.class);
        startActivity(NewActivity);
        finish();
    }
}

待办事项:

public class TodoFragment extends Fragment {

private View v;
private RecyclerView recyclerView;
FirebaseFirestore db = FirebaseFirestore.getInstance();
CollectionReference TodoRef= db.collection("ToDo");

FirebaseAuth mAuth;
String Uemail;

public TodoFragment() {
    // Required empty public constructor
}


public static TodoFragment newInstance() {
    TodoFragment fragment = new TodoFragment();
    Bundle args = new Bundle();

    fragment.setArguments(args);
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

}

@Override
public void onStart() {
    super.onStart();
    Query q =TodoRef.whereEqualTo("email", Uemail);
    FirestoreRecyclerOptions options=new FirestoreRecyclerOptions.Builder<Item>().setQuery(q, Item.class).build();
    FirestoreRecyclerAdapter<Item, ItemViewHolder>adapter= new FirestoreRecyclerAdapter<Item, ItemViewHolder>(options) {
        @Override
        protected void onBindViewHolder(@NonNull ItemViewHolder itemViewHolder, int i, @NonNull Item item) {
            itemViewHolder.textViewItem.setText(item.getTextitem());

        }


        @NonNull
        @Override
        public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);
            ItemViewHolder viewHolder = new ItemViewHolder(v);
            return viewHolder;
        }
    };
    recyclerView.setAdapter(adapter);
    adapter.startListening();

    }

public static class ItemViewHolder extends RecyclerView.ViewHolder{

    TextView textViewItem;

public ItemViewHolder(@NonNull View itemView) {
    super(itemView);
   textViewItem = itemView.findViewById(R.id.item_text);

}
}

    @Override
  

  public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        v=inflater.inflate(R.layout.fragment_todo, container, false);
       recyclerView = v.findViewById(R.id.recycler_view_todo);
    recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        mAuth=FirebaseAuth.getInstance();
        Uemail= mAuth.getCurrentUser().getEmail();
        return v;
    }

}

我的物品类别:

    public class Item {
    private String textitem;
    private String email;
    public Item(){
        //needed
    }

   public Item(String textitem, String email) {
       this.email=email;
       this.textitem=textitem;
   }

    public String getTextitem() {
        return textitem;
    }

    public void setTextitem(String textitem) {
        this.textitem = textitem;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getEmail() {
        return email;
    }
}

还有我的部分寻呼机适配器:

   public SectionsPagerAdapter( FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        return fragments.get(position);
    }

    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {
        return titles.get(position);
    }

    @Override
    public int getCount() {
        return titles.size();
    }
    public void AddFragment(Fragment fragment, String title ){
        fragments.add(fragment);
        titles.add(title);
    }
}

我尽力自己找到解决方案,但显然失败了。

编辑:我终于找到了如何处理它。我再次将适配器移动到独立类,但片段和适配器几乎没有变化。

我现在的适配器:(在 Firestore 中移动和删除文档)

public class ItemAdapter extends FirestoreRecyclerAdapter<Item, ItemAdapter.NoteHolder> {
public ItemAdapter(@NonNull FirestoreRecyclerOptions<Item> options) {
    super(options);
}


@Override
protected void onBindViewHolder(@NonNull NoteHolder holder, int position, @NonNull Item model) {
    holder.textViewTitle.setText(model.getTextitem());

}
@NonNull
@Override
public NoteHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item,
            parent, false);
    return new NoteHolder(v);
}
public void deleteItem(int position) {
    getSnapshots().getSnapshot(position).getReference().delete();
    Log.d("Firestore", "DocumentSnapshot successfully deleted!");
}
public void moveItem(int position, CollectionReference ColRef) {

    DocumentReference from= getSnapshots().getSnapshot(position).getReference();
    DocumentReference to =ColRef.document();
    moveFirestoreDocument( from,  to);

}

public void moveFirestoreDocument(final DocumentReference fromPath, final DocumentReference toPath) {
    fromPath.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
        @Override
        public void onComplete(@NonNull Task<DocumentSnapshot> task) {
            if (task.isSuccessful()) {
                DocumentSnapshot document = task.getResult();
                if (document != null) {
                    toPath.set(document.getData())
                            .addOnSuccessListener(new OnSuccessListener<Void>() {
                                @Override
                                public void onSuccess(Void aVoid) {
                                    Log.d("Firestore", "DocumentSnapshot successfully written!");
                                    fromPath.delete()
                                            .addOnSuccessListener(new OnSuccessListener<Void>() {
                                                @Override
                                                public void onSuccess(Void aVoid) {
                                                    Log.d("Firestore", "DocumentSnapshot successfully deleted!");
                                                }
                                            })
                                            .addOnFailureListener(new OnFailureListener() {
                                                @Override
                                                public void onFailure(@NonNull Exception e) {
                                                    Log.w("Firestore", "Error deleting document", e);
                                                }
                                            });
                                }
                            })
                            .addOnFailureListener(new OnFailureListener() {
                                @Override
                                public void onFailure(@NonNull Exception e) {
                                    Log.w("Firestore", "Error writing document", e);
                                }
                            });
                } else {
                    Log.d("Firestore", "No such document");
                }
            } else {
                Log.d("Firestore", "get failed with ", task.getException());
            }
        }
    });
}
class NoteHolder extends RecyclerView.ViewHolder {
    TextView textViewTitle;

    public NoteHolder(View itemView) {
        super(itemView);
        textViewTitle = itemView.findViewById(R.id.item_text);

    }
}

}

我的片段现在看起来像这样:

public class TodoFragment extends Fragment {

private View v;
private RecyclerView recyclerView;
FirebaseFirestore db = FirebaseFirestore.getInstance();
CollectionReference TodoRef = db.collection("ToDo");
CollectionReference InProgRef = db.collection("InProgress");

ItemAdapter adapter;
FirebaseAuth mAuth;
String Uemail;

public TodoFragment() {

}


public static TodoFragment newInstance() {
    TodoFragment fragment = new TodoFragment();
    Bundle args = new Bundle();

    fragment.setArguments(args);
    return fragment;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    v=inflater.inflate(R.layout.fragment_todo, container, false);
   recyclerView = v.findViewById(R.id.recycler_view_todo);
    recyclerView.setHasFixedSize(true);

recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));

    mAuth=FirebaseAuth.getInstance();
    Uemail= mAuth.getCurrentUser().getEmail();

    setUpRecyclerView(recyclerView);
    return v;
}


private void setUpRecyclerView(RecyclerView recyclerView) {
    Query q =TodoRef.whereEqualTo("email", Uemail);
    FirestoreRecyclerOptions<Item> options = new FirestoreRecyclerOptions.Builder<Item>()
            .setQuery(q, Item.class)
            .build();
    adapter = new ItemAdapter(options);


    recyclerView.setAdapter(adapter);
    new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(0,
            ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT|ItemTouchHelper.UP) {
        @Override
        public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
            return false;
        }
        @Override
        public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {


            int right = 8;
            if(direction==right){
               
                adapter.moveItem(viewHolder.getAdapterPosition(),InProgRef);
            }else{
               
                adapter.deleteItem(viewHolder.getAdapterPosition());
            }

        }
    }).attachToRecyclerView(recyclerView);
}

@Override
public void onStart() {
    super.onStart();
    adapter.startListening();
}
@Override
public void onStop() {
    super.onStop();
    adapter.stopListening();
}

总结一下:setUpRecyclerView 函数需要获取正确的 Recycler View 作为参数,没有它总是有 NullPointer 异常。我在充气机中也犯了错误的布局

希望它对某人有用。

标签: javaandroid-studiofirebase-realtime-databasegoogle-cloud-firestore

解决方案


推荐阅读