2014-01-23 14 views
6

Meine App verwendet den Modus "Vollbildmodus im Querformat" und die Navigationsleiste. Ich verwende listView in meiner App zusammen mit einem edittext. Die edittext ist die Suchleiste, die die listview suchen wird. Sowohl die listview als auch die edittext sind in der Navigationsleiste. Wenn jedoch kein Listenelement mit dem gesuchten Wort übereinstimmt, wird listview leer.ListView-Element nicht gefunden

Also wie kann ich eine "Artikel nicht gefunden" Nachricht anstelle der leeren listview?

Ich suchte viel im Internet und fand eine Methode setEmptyView();, aber ich konnte es nicht verstehen und daher funktioniert es nicht. Bitte hilf mir! Vielleicht wird diese Frage hier schon gestellt, aber bitte geben Sie mir eine einfache Erklärung.

Hier ist mein Code:

MainActivity.java

public class MainActivity extends FragmentActivity { 
final String[] data = {"Hydrogen","Helium","Lithium","Beryllium","Boron","Carbon","Nitrogen","Oxygen","Flourine","Noen","Sodium","Magnesium","Aluminium","Silicon","Phosphorous","Sulphur","Chlorine","Argon","Potassium","Calcium","Scandium","Titanium","Vanadium","Chromium","Manganese","Iron","Cobalt","Nickel","Copper","Zinc","Gallium","Germanium","Arsenic","Selenium","Bromine","Krypton","Rubidium","Strontium","Yttrium","Zirconium","Niobium","Molybdenum","Technetium","Ruthenium","Rhodium","Palladium","Silver","Cadmium","Indium","Tin","Antimony","Tellurium"}; 
ArrayAdapter<String> adapter; 

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

    adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, data); 
    final EditText searchBar = (EditText) findViewById(R.id.searchbar); 
    final DrawerLayout drawer = (DrawerLayout)findViewById(R.id.drawer_layout); 
    final ListView navList = (ListView) findViewById(R.id.left_drawer); 
    final LinearLayout linearLayout = (LinearLayout)findViewById(R.id.left_drawer_layout); 
    navList.setAdapter(adapter); 

    searchBar.addTextChangedListener(new TextWatcher() { 

     @Override 
     public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) { 

      MainActivity.this.adapter.getFilter().filter(cs); 
     } 

     @Override 
     public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, 
             int arg3) { 

     } 

     @Override 
     public void afterTextChanged(Editable arg0) { 
     } 
    }); 

    //the code below will automatically close the keyboard when the user will touch the listview 

    navList.setOnScrollListener(new AbsListView.OnScrollListener() { 
     public void onScrollStateChanged(AbsListView view, int scrollState) { 

      InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
      imm.hideSoftInputFromWindow(navList.getWindowToken(), 0); 
     } 

     public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
     } 
    }); 


    } 

} 

mainactivity.xml

<android.support.v4.widget.DrawerLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/drawer_layout" 
android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<FrameLayout 
    android:id="@+id/content_frame" 
    android:layout_width="match_parent" 
    android:background="#000000" 
    android:layout_height="match_parent" > 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     android:text="Swipe from the left to open the drawer" 
     android:id="@+id/textView" 
     android:layout_gravity="center" /> 
</FrameLayout> 

<LinearLayout 
    android:id="@+id/left_drawer_layout" 
    android:layout_height="fill_parent" 
    android:layout_width="240dp" 
    android:background="#111" 
    android:orientation="vertical" 
    android:layout_gravity="start" > 

    <EditText 
     android:id="@+id/searchbar" 
     android:layout_width="230dp" 
     android:layout_height="40dp" 
     android:textColor="#bfc2d1" 
     android:singleLine="true" 
     android:padding="10dp" 
     android:background="@drawable/search_bar" 
     android:layout_marginLeft="3dp" 
     android:layout_marginRight="3dp" 
     android:imeOptions="flagNoExtractUi" 
     android:hint=" search" > 
    </EditText> 

    <TextView 
     android:id="@+id/notfound" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     style="@android:style/TextAppearance.Medium" 
     android:gravity="center"> 
    </TextView> 

    <ListView android:id="@+id/left_drawer" 
     android:layout_width="match_parent" 
     android:layout_height="fill_parent" 
     android:choiceMode="singleChoice" 
     android:divider="@android:color/transparent" 
     android:dividerHeight="0dp" 
     android:background="#111"/> 
</LinearLayout> 

</android.support.v4.widget.DrawerLayout> 
+0

Denken Sie neu auf dieser Seite sind und wenn Sie 14 sind, haben Sie eine detaillierte Frage gepostet . Groß! Übrigens, Sie haben gerade den Layout-Code vergessen. –

+0

Vielen Dank für Ihre schnelle Antwort. Soll ich die Xml-Datei posten? –

+0

Ja post it so kann besser vorschlagen! –

Antwort

3

Ja Sie setEmptyView erwähnt haben() richtig, sollten Sie es verwenden, wenn Sie leere Nachricht anzeigen möchten, wann immer ListView leer wird.

Jetzt ist hier ein XML-Layout und Code zeigt, wie setEmptyView genau zu verwenden.

<LinearLayout 
    android:id="@+id/LinearLayout1" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_below="@+id/layoutTitlebar" > 

    <ListView 
     android:id="@+id/listViewFriends" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="@color/friendBGColor" 
     android:cacheColorHint="#00000000" > 
    </ListView> 

    <TextView 
     android:id="@+id/empty" 
     style="@android:style/TextAppearance.Large" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:gravity="center" 
     android:text="@string/strNoRecordsFound" > 
    </TextView> 

</LinearLayout> 

Nun müssen Sie diese leer gesetzt (dh Textview) an die Listview unter Verwendung:

ListView listViewFriends = (ListView) findViewById(R.id.listViewFriends); 
// set your adapter here 
// set your click listener here 
// or whatever else 
listViewFriends.setEmptyView(findViewById(R.id.empty)); 
+0

@ user3227476 ausprobiertem vollen Code zu erhalten? –

+0

@ user3227476 Sie haben die leere Ansicht noch nicht erstellt und haben sie noch nicht auf ListView gesetzt. –

+0

@ChinmayDabke so habe ich dich auch genau, du hast mich zum Narren gemacht, indem du geschrieben hast, dass du neu auf dieser Seite bist und 14 Jahre alt bist. Dank dafür. Akzeptiere die Antwort jetzt! –

1

Diese Methode ist alles, was Sie brauchen,

http://developer.android.com/reference/android/widget/AdapterView.html#setEmptyView(android.view.View)

Denken Sie daran, dass es eine Ansicht akzeptiert, also müssen Sie das Layout aufblähen und jeden/alle Text ausfüllen, den Sie dort selbst haben.

EDIT:

Nehmen wir an, Sie haben ein Layout "empty_text" wie folgt benannt:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 

    <TextView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:text="There are no entries in this list" 
     android:gravity="center"/> 
</LinearLayout> 

Hinweis: I in der Zeichenfolge beispielsweise Zwecke verbrannt, die IDE Warnung beachten und einen String Bezeichner verwenden für I18n willen

Nun würden Sie diesen Code verwenden sie alle arbeiten mit dem Listview zu machen:

LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
View emptyTextView = inflater.inflate(R.layout.empty_text, null, false); 
listView.setEmptyView(emptyTextView); 

In diesem Code wird davon ausgegangen, dass Sie innerhalb einer Aktivität ausgeführt werden, aber nur für den Fall, dass Sie nicht beabsichtigen, ihn in eine Aktivität einzufügen, funktioniert jede Context Instanz.

Das sollte es sein.

+0

Eigentlich lese ich die Dokumente, aber es ist so kompliziert. Kannst du mir bitte mit dem Code helfen? –

+1

Haben Sie die Frage vollständig gelesen? Ich bezweifle es, weil er bereits etwas über 'setEmptyView() 'erwähnt hat. –

+0

Kannst du mir bitte mit dem Code helfen? –

0

Dann verwendet Ihr Listenansicht automatisch diese Ansicht, wenn der Adapter leer ist.

Detaillierte Lösung:

Layout:

<ListView 
android:id="@+id/listViewFriends" 
android:layout_height="match_parent" 
android:layout_width="match_parent" 
android:background="@color/friendBGColor" 
android:cacheColorHint="#00000000"> 
</ListView> 

<TextView 
android:id="@+id/empty" 
android:text="@string/strNoRecordsFound" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
style="@android:style/TextAppearance.Large" 
android:gravity="center"> 
</TextView> 
</LinearLayout> 

Klasse File:

ListView listViewFriends = (ListView) findViewById(R.id.listViewFriends); 
listViewFriends.setEmptyView(findViewById(R.id.empty)); 

Source