1

Ich erstelle eine Android-Anwendung. In der Anwendung habe ich eine Login-Seite. Nach dem Login wird eine Benutzerliste angezeigt. Die Benutzerlistenaktivität ist HomeActivity.java, die zwei Fragmente enthält, die als UserListFragment.java und ChatFragment.java bezeichnet werden. Die Benutzerliste wird von firebase angezeigt.Searchview in actionbar in Fragment

Die UserListFragment.java enthält eine Aktionsleiste mit einem Suchmenü und einem Abmelde-Menü. Das Abmelde-Menü funktioniert gut, aber die Suche funktioniert nicht. Das Suchsymbol wird angezeigt, aber wenn ich etwas suche, zeigt es nichts, d. H. Keine Filter. Ich verwende Firebase, um die Benutzerliste anzuzeigen.

Ich will nicht die Suche in ChatFragment.java angezeigt werden

ich verschiedene verschiedene verschiedene Lösungen ausprobiert. Aber keiner hat für mich funktioniert.

Hier ist der Code.

UserListFragment.java

public class UsersListFragment extends Fragment { 
// TODO: Rename parameter arguments, choose names that match 
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER 
private static final String ARG_PARAM1 = "param1"; 
private static final String ARG_PARAM2 = "param2"; 
Activity activity; 
// TODO: Rename and change types of parameters 
private String mParam1; 
private String mParam2; 
private static final String TAG = "UsersListFragment"; 
private OnFragmentInteractionListener mListener; 
private ListView listView; 
private List<UserData> users; 
private CustomAdapter adapter; 
SharedPreferences.Editor preferenceEditor; 
Timer myTimer; 
View view; 
ActionBar actionBar; 
private static final String PREFRENCES_NAME = "setPreferences"; 
private ProgressDialog progressBar; 
String partnerKeyValue; 

// TODO: Rename and change types and number of parameters 
public static UsersListFragment newInstance(String param1, String param2) { 
    UsersListFragment fragment = new UsersListFragment(); 
    Bundle args = new Bundle(); 
    args.putString(ARG_PARAM1, param1); 
    args.putString(ARG_PARAM2, param2); 
    fragment.setArguments(args); 
    return fragment; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Global.getInstance().unreadMessageUsers.clear(); 
    progressBar = new ProgressDialog(getActivity()); 
    progressBar.setCancelable(false); 
    progressBar.setMessage("Loading..."); 
    progressBar.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
    progressBar.setProgress(0); 
    } 

@Override 
public void onCreateOptionsMenu(Menu menu,MenuInflater inflater) { 

    inflater.inflate(R.menu.menu_userlist,menu); 
    MenuItem item = menu.findItem(R.id.menuSearch); 

    SearchView searchView = (SearchView)item.getActionView(); 

    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
     @Override 
     public boolean onQueryTextSubmit(String query) { 
      return false; 
     } 

     @Override 
     public boolean onQueryTextChange(String newText) { 
      Log.i(TAG,newText); 
      adapter.getFilter().filter(newText); 
      return true; 
     } 
    }); 

    super.onCreateOptionsMenu(menu,inflater); 
} 


private void logoutUser(){ 
    Intent I = new Intent(getActivity(), LoginActivity.class); 
    startActivity(I); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    switch (item.getItemId()) { 
     case R.id.menuSearch : 
      return true; 

     case R.id.menuLogout : 
      logoutUser(); 
      return true; 

     default: 
      return super.onOptionsItemSelected(item); 
    } 

} 

menu_userlist.xml

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto"> 

<item android:id="@+id/menuSearch" 
    android:title="@string/search" 
    android:icon="@drawable/ic_search" 
    app:actionViewClass="android.widget.SearchView" 
    app:showAsAction="always"> 
</item> 

<item android:id="@+id/menuLogout" 
    android:title="@string/logout" 
    android:icon="@drawable/ic_logout" 
    app:showAsAction="always"> 
</item> 

CustomAdapter.java

@Override 
public Filter getFilter() { 
    Filter filter = new Filter() { 

     @SuppressWarnings("unchecked") 
     @Override 
     protected void publishResults(CharSequence constraint,FilterResults results) { 

      users = (List<UserData>) results.values; // has the filtered values 
      notifyDataSetChanged(); // notifies the data with new filtered values 
     } 

     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      FilterResults results = new Filter.FilterResults();  

      List<String> FilteredArrList = new ArrayList<String>(); 

       if (mOriginalValues != null) { 

       if (constraint == null || constraint.length() == 0) { 

        // set the Original result to return 
        results.count = mOriginalValues.size(); 
        results.values = mOriginalValues; 
       } else { 
        constraint = constraint.toString().toLowerCase(); 
        for (int i = 0; i < mOriginalValues.size(); i++) { 
         String data = mOriginalValues.get(i).toString(); 
         if (data.toLowerCase().contains(constraint.toString())) { 
          FilteredArrList.add(data); 
         } 
        } 
        // set the Filtered result to return 
        results.count = FilteredArrList.size(); 
        results.values = FilteredArrList; 
       } 
      } 

      return results; 
     } 
    }; 
    return filter; 
} 
} 
+0

Ist Ihre Filter-Methode zu arbeiten? Haben Sie den Wert der Rückgabevariable 'resultes' überprüft? – Dibzmania

+0

@Dibzmania my ** Ergebnisse ** Variable enthält diesen Wert **[email protected]** Jedes Mal, wenn ich ein Alphabet eintippe, wird ein Wert erreicht erzeugt für jedes Alphabet Ich gebe Suche wie oben ein. Ich weiß nicht, was es ist. – Rider

+0

@Dibzmania Ich denke, ich bekomme null Wert. Als ich versuchte, ** results.values ​​** zu drucken, bekam ich einen Ausnahmefehler von null. Wie kann ich es lösen? – Rider

Antwort

0

Ich habe mein Problem selbst gelöst. Es kann jemand anderem helfen. :)

CustomAdapter.java

@Override 
public Filter getFilter() { 
    Filter filter = new Filter() { 

     @SuppressWarnings("unchecked") 
     @Override 
     protected void publishResults(CharSequence constraint, 
             FilterResults results) { 
      clear(); 
      addAll((List<UserData>) results.values); 
      arrayList = (List<UserData>)results.values; 
      notifyDataSetChanged(); 
     } 


     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      FilterResults results = new FilterResults();  // Holds the results of a filtering operation in values 
      List<UserData> FilteredArrList = new ArrayList<UserData>(); 

      if (mOriginalValues == null) { 
       mOriginalValues = new ArrayList<UserData>(arrayList); 
      } 


      if (constraint == null || constraint.length() == 0) { 
       results.count = mOriginalValues.size(); 
       results.values = mOriginalValues; 
      } else { 
       constraint = constraint.toString().toLowerCase(); 


       for (int i = 0; i < mOriginalValues.size(); i++) { 
        String data = mOriginalValues.get(i).getName(); 

        if (data.toLowerCase().contains(constraint.toString())) { 
         FilteredArrList.add(mOriginalValues.get(i)); 
        } 
       } 
       // set the Filtered result to return 
       results.count = FilteredArrList.size(); 
       results.values = FilteredArrList; 
      } 

      return results; 
     } 

    }; 
    return filter; 
} 
1

Ändern Sie die folgende Codesegment -

@SuppressWarnings("unchecked") 
    @Override 
    protected void publishResults(CharSequence constraint,FilterResults results) { 
     clear(); 
     addAll((List<UserData>) results.values) 
     users = (List<UserData>) results.values; // has the filtered values 

     notifyDataSetChanged(); // notifies the data with new filtered values 
    } 

Diese meist das Problem lösen würde. aber es gibt viele Inkonsistenzen in Ihrem Quellcode. Sie erweitern ArrayAdpater, die bereits die Filterable Schnittstelle implementiert.

auch prüfen, warum Sie die folgenden Zustandsvariablen benötigen -

private List<UserData> messages; 
private List<UserData> users; 
private List<UserData> mOriginalValues; 

Bitte beachten Sie, dass Sie ArrayAdapter und Sie übergeben die Anfangsdaten in den Konstruktor gesetzt erweitern. Jede Änderung im Datensatz danach müssen Sie auf dem übergeordneten ArrayAdapter zurücksetzen. Nur die Zustandsvariablen in Ihrer Kindklasse zu ändern, wird nicht helfen.

+0

Der Code, den Sie zum Bearbeiten vorgeschlagen haben, führt zum Absturz der App. 'private List Nachrichten;' ' private List Benutzer;' ' private List mOriginalValues;' Benutzer und mOrigninalValues ​​Ich habe für die Filtermethode verwendet. Ich bin neu bei Android und habe daher den Code aus einer Quelle verwendet. Nachrichten, die ich für die Anzahl der ungelesenen Nachrichten verwende, muss ich neben dem Benutzernamen anzeigen. Wenn Sie mir einige Änderungen zur Verfügung stellen und mich leiten könnten, was sollte ich ändern? Es wird mir sehr hilfreich sein. Danke vielmals. :) – Rider

+0

Was ist der Absturz Stack Trace? Ich habe den Code nicht wirklich ausgeführt, also gibt es alle möglichen Möglichkeiten. Aber die Idee ist, die zugrunde liegenden Daten zu löschen und die neuen Daten hinzuzufügen. – Dibzmania

+0

java.lang.NullPointerException: Es wurde versucht, die Interface-Methode 'java.lang.Object [] java.util.Collection.toArray()' für einen Null-Objektverweis in dieser Zeile aufzurufen. addAll ((Liste ) results.values); – Rider

Verwandte Themen