我的回收站视图带有搜索栏,我在互联网上遵循代码,但是当我在搜索栏中插入一个值时,我正在搅动空白页,并且所有数据都将被隐藏,即使删除了从栏输入它将保持空白,直到我再按一次并重新设置布局。 知道为什么吗?
请找到代码:-
//the adapater//
package com.example.boc.PhoneNumbers;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.example.boc.R;
import com.example.boc.iFILES.IMainActivity;
import com.example.boc.models.Note;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
public class NoteRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements Filterable {
private static final String TAG = "NoteRecyclerViewAdapter";
private ArrayList<Note> mNotes ;
private ArrayList<Note> mNotes2 ;
private IMainActivity mIMainActivity;
private Context mContext;
private int mSelectedNoteIndex;
public NoteRecyclerViewAdapter(Context context, ArrayList<Note> notes) {
this.mNotes = notes;
mNotes2 = new ArrayList<>( notes );
mContext = context;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
RecyclerView.ViewHolder holder;
View view = LayoutInflater.from(parent.getContext()).inflate(
R.layout.layout_note_list_item, parent, false);
holder = new ViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
if(holder instanceof ViewHolder){
((ViewHolder)holder).title.setText(mNotes.get(position).getTitle());
SimpleDateFormat spf = new SimpleDateFormat("MMM dd, yyyy");
String date = spf.format(mNotes.get(position).getTimestamp());
((ViewHolder)holder).timestamp.setText(date);
}
}
@Override
public int getItemCount() {
return mNotes.size();
}
public void updateNote(Note note){
mNotes.get(mSelectedNoteIndex).setTitle(note.getTitle());
mNotes.get(mSelectedNoteIndex).setContent(note.getContent());
notifyDataSetChanged();
}
public void removeNote(Note note){
mNotes.remove(note);
notifyDataSetChanged();
}
@Override
public Filter getFilter()
{
return adapterfilter;
}
private Filter adapterfilter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
ArrayList<Note> filteredlist = new ArrayList<>( );
if (constraint ==null || constraint.length() ==0){
filteredlist.addAll( mNotes2 );
}
else {
String filterpattren =constraint.toString().toLowerCase().trim();
for ( Note item : mNotes2){
if (item.getTitle().toLowerCase().contains( filterpattren )){
filteredlist.add(item);
}
}
}
FilterResults results = new FilterResults();
results.values=filteredlist;
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
mNotes.clear();
mNotes.addAll((ArrayList) results.values );
notifyDataSetChanged();
}
};
@Override
public void onAttachedToRecyclerView(@NonNull RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
mIMainActivity = (IMainActivity) mContext;
}
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
TextView title, timestamp;
public ViewHolder(View itemView) {
super(itemView);
title = itemView.findViewById(R.id.title);
timestamp = itemView.findViewById(R.id.timestamp);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View view) {
mSelectedNoteIndex = getAdapterPosition();
mIMainActivity.onNoteSelected(mNotes.get(mSelectedNoteIndex));
}
}
}
//活动类//
package com.example.boc.main;
import android.content.Intent;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.example.boc.PhoneNumbers.NewNoteDialog;
import com.example.boc.PhoneNumbers.NoteRecyclerViewAdapter;
import com.example.boc.PhoneNumbers.ViewNoteDialog;
import com.example.boc.R;
import com.example.boc.iFILES.IMainActivity;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar;
import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.widget.SearchView;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.firestore.CollectionReference;
import com.google.firebase.firestore.DocumentReference;
import com.google.firebase.firestore.DocumentSnapshot;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.Query;
import com.google.firebase.firestore.QueryDocumentSnapshot;
import com.google.firebase.firestore.QuerySnapshot;
import java.util.ArrayList;
import java.util.zip.Inflater;
import com.example.boc.models.Note;
public class phone_nombers_Activity extends AppCompatActivity implements
View.OnClickListener,
IMainActivity,
SwipeRefreshLayout.OnRefreshListener
{
private static final String TAG = "MainActivity";
//Firebase
private FirebaseAuth.AuthStateListener mAuthListener;
//widgets
private FloatingActionButton mFab;
private RecyclerView mRecyclerView;
private SwipeRefreshLayout mSwipeRefreshLayout;
//vars
private View mParentLayout;
private ArrayList<Note> mNotes = new ArrayList<>();
private NoteRecyclerViewAdapter mNoteRecyclerViewAdapter;
private DocumentSnapshot mLastQueriedDocument;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView( R.layout.activity_phone_nombers_);
mFab = findViewById(R.id.fab);
mParentLayout = findViewById(android.R.id.content);
mRecyclerView = findViewById(R.id.recycler_view);
mSwipeRefreshLayout = findViewById(R.id.swipe_refresh_layout);
mFab.setOnClickListener(this);
mSwipeRefreshLayout.setOnRefreshListener(this);
setupFirebaseAuth();
initRecyclerView();
getNotes();
}
@Override
public boolean onCreatOptionsMenu (Menu menu){
getMenuInflater().inflate(R.menu.toolbar,menu );
return true;
}
@Override
public void deleteNote(final Note note){
FirebaseFirestore db = FirebaseFirestore.getInstance();
DocumentReference noteRef = db
.collection("notes").document(note.getNote_id());
noteRef.delete().addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if(task.isSuccessful()){
makeSnackBarMessage("Deleted note");
mNoteRecyclerViewAdapter.removeNote(note);
}
else{
makeSnackBarMessage("Failed. Check log.");
}
}
});
}
@Override
public void onRefresh() {
getNotes();
mSwipeRefreshLayout.setRefreshing(false);
}
private void getNotes(){
FirebaseFirestore db = FirebaseFirestore.getInstance();
CollectionReference notesCollectionRef = db
.collection("notes");
Query notesQuery = null;
if(mLastQueriedDocument != null){
notesQuery = notesCollectionRef
.orderBy("timestamp", Query.Direction.ASCENDING)
.startAfter(mLastQueriedDocument);
}
else{
notesQuery = notesCollectionRef
.orderBy("timestamp", Query.Direction.ASCENDING);
}
notesQuery.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if(task.isSuccessful()){
for(QueryDocumentSnapshot document: task.getResult()){
Note note = document.toObject(Note.class);
mNotes.add(note);
// Log.d(TAG, "onComplete: got a new note. Position: " + (mNotes.size() - 1));
}
if(task.getResult().size() != 0){
mLastQueriedDocument = task.getResult().getDocuments()
.get(task.getResult().size() -1);
}
mNoteRecyclerViewAdapter.notifyDataSetChanged();
}
else{
makeSnackBarMessage("Query Failed. Check Logs.");
}
}
});
}
private void initRecyclerView(){
if(mNoteRecyclerViewAdapter == null){
mNoteRecyclerViewAdapter = new NoteRecyclerViewAdapter(this, mNotes);
}
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mRecyclerView.setAdapter(mNoteRecyclerViewAdapter);
}
@Override
public void updateNote(final Note note){
FirebaseFirestore db = FirebaseFirestore.getInstance();
DocumentReference noteRef = db
.collection("notes")
.document(note.getNote_id());
noteRef.update(
"title", note.getTitle(),
"content", note.getContent()
).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if(task.isSuccessful()){
makeSnackBarMessage("Updated note");
mNoteRecyclerViewAdapter.updateNote(note);
}
else{
makeSnackBarMessage("Failed. Check log.");
}
}
});
}
@Override
public void onNoteSelected(Note note) {
ViewNoteDialog dialog = ViewNoteDialog.newInstance(note);
dialog.show(getSupportFragmentManager(), getString(R.string.dialog_view_note));
}
@Override
public void createNewNote(String title, String content) {
FirebaseFirestore db = FirebaseFirestore.getInstance();
String userId = FirebaseAuth.getInstance().getCurrentUser().getUid();
DocumentReference newNoteRef = db
.collection("notes")
.document();
Note note = new Note();
note.setTitle(title);
note.setContent(content);
note.setNote_id(newNoteRef.getId());
note.setUser_id(userId);
newNoteRef.set(note).addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if(task.isSuccessful()){
makeSnackBarMessage("Created new note");
getNotes();
}
else{
makeSnackBarMessage("Failed. Check log.");
}
}
});
}
private void makeSnackBarMessage(String message){
Snackbar.make(mParentLayout, message, Snackbar.LENGTH_SHORT).show();
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.fab:{
//create a new note
NewNoteDialog dialog = new NewNoteDialog();
dialog.show(getSupportFragmentManager(), getString(R.string.dialog_new_note));
break;
}
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater =getMenuInflater();
inflater.inflate( R.menu.toolbar , menu );
MenuItem searchitem =menu.findItem( R.id.action_search );
SearchView searchView = (SearchView) searchitem.getActionView();
searchView.setImeOptions( EditorInfo.IME_ACTION_DONE);
searchView.setOnQueryTextListener( new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
mNoteRecyclerViewAdapter.getFilter().filter( newText );
return false;
}
} );
return true;
}
private void signOut(){
Log.d(TAG, "signOut: signing out");
FirebaseAuth.getInstance().signOut();
}
/*
----------------------------- Firebase setup ---------------------------------
*/
private void setupFirebaseAuth(){
Log.d(TAG, "setupFirebaseAuth: started.");
mAuthListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
FirebaseUser user = firebaseAuth.getCurrentUser();
if (user != null) {
Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid());
} else {
Log.d(TAG, "onAuthStateChanged:signed_out");
Intent intent = new Intent(phone_nombers_Activity.this, login.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
finish();
}
}
};
}
@Override
public void onStart() {
super.onStart();
FirebaseAuth.getInstance().addAuthStateListener(mAuthListener);
}
@Override
public void onStop() {
super.onStop();
if (mAuthListener != null) {
FirebaseAuth.getInstance().removeAuthStateListener(mAuthListener);
}
}
}