2016-06-09 56 views
0

過濾我有MainActivity延伸AppCompatActivity並且它包含我的菜單項,和3個標籤延伸片段各自含有我的列表視圖。如何在我的工具欄中使用Searchview過濾列表視圖?我已經全面搜索,發現使用EditText來過濾listview或實際使用searchview,但不是在具有片段的SimpleCursorAdapter中。我不想實施那種。我如何實現一個過濾器來過濾listview(在三個diff選項卡片段中使用SimpleCursorAdapter)作爲用戶將文本輸入到searchview中?simplecursoradapter列表視圖工具欄與例如搜索查看

這裏是我的MainActivity

public class MainActivity extends AppCompatActivity { 

Toolbar toolbar; 
ViewPager pager; 
ViewPagerAdapter adapter; 
SlidingTabLayout tabs; 
CharSequence Titles[]={"All","Index","Favourite"}; 
int Numboftabs =3; 

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

    // Creating The Toolbar and setting it as the Toolbar for the activity 
    toolbar = (Toolbar) findViewById(R.id.tool_bar); 
    setSupportActionBar(toolbar); 
    // Creating The ViewPagerAdapter and Passing Fragment Manager, Titles fot the Tabs and Number Of Tabs. 
    adapter = new ViewPagerAdapter(getSupportFragmentManager(), Titles, Numboftabs); 
    // Assigning ViewPager View and setting the adapter 
    pager = (ViewPager) findViewById(R.id.pager); 
    if (pager != null) { 
     pager.setAdapter(adapter); 
    } 
    // Assigning the Sliding Tab Layout View 
    tabs = (SlidingTabLayout) findViewById(R.id.tabs); 
    if (tabs != null) { 
     tabs.setDistributeEvenly(true); // To make the Tabs Fixed set this true, This makes the tabs Space Evenly in Available width 
    } 
    // Setting Custom Color for the Scroll bar indicator of the Tab View 
    tabs.setCustomTabColorizer(new SlidingTabLayout.TabColorizer() { 
     @Override 
     public int getIndicatorColor(int position) { 
      return getResources().getColor(R.color.tabsScrollColor); 
     } 
    }); 
    tabs.setViewPager(pager); 
} 
public boolean onCreateOptionsMenu(Menu menu) { 
getMenuInflater().inflate(R.menu.menu_main, menu); 
SearchManager SManager = (SearchManager)  getSystemService(Context.SEARCH_SERVICE); 
MenuItem searchMenuItem = menu.findItem(R.id.action_search); 
android.support.v7.widget.SearchView searchViewAction = (android.support.v7.widget.SearchView) MenuItemCompat.getActionView(searchMenuItem);  searchViewAction.setSearchableInfo(SManager.getSearchableInfo(getComponentName())); 
searchViewAction.setIconifiedByDefault(true); 
return true; 
} 

這裏是我的TAB1片段

public class Tab1 extends Fragment { 
ListView listView; 
Cursor cursor; 
SimpleCursorAdapter listAdapter; 

@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    View v =inflater.inflate(R.layout.tab_1,container,false); 

    listView = (ListView) v.findViewById(R.id.listview); 

    DatabaseHelper dbhelper = new DatabaseHelper(this.getContext()); 
    String selectQuery = "SELECT * FROM " + DatabaseContract.SongBook.TABLE_NAME; 
    final SQLiteDatabase db = dbhelper.getWritableDatabase(); 
    cursor = db.rawQuery(selectQuery, null); 
    String[] fromColumns = {DatabaseContract.SongBook._ID, DatabaseContract.SongBook.KEY_TITLE}; 
    int[] toView = {R.id.song_id, R.id.song_title}; 

    listAdapter = new SimpleCursorAdapter(this.getContext(),   R.layout.songs_ltem_layout, cursor, fromColumns, toView,0); 
    listAdapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() { 
     @Override 
public boolean setViewValue(View view, Cursor aCursor, int columnIndex) { 
      if (columnIndex == 0) { 
       String id = aCursor.getString(columnIndex); 
       TextView textView = (TextView) view; 
       textView.setText(String.format("%02d",  Integer.parseInt(id))); 
       return true; 
      } 
      return false; 
     } 
    }); 
    listView.setAdapter(listAdapter); 
} 
} 

XML文件

<menu 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" 
tools:context="com.katchoua.fgm_hymns.MainActivity"> 
<item android:id="@+id/action_search" 
    android:title="Search" 
    android:icon="@drawable/search" 
    app:showAsAction="collapseActionView|always" 
    app:actionViewClass="android.support.v7.widget.SearchView" 
    android:layout_width="wrap_content" /> 
</menu> 

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:background="@color/white" 
android:layout_height="match_parent"> 

<ListView 
    android:id="@+id/listview" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:padding="10dp" 
    android:textAppearance="?android:attr/textAppearanceMedium" 
    android:layout_centerVertical="true" 
    android:layout_centerHorizontal="true" /> 

</RelativeLayout> 

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="horizontal" 
android:layout_width="match_parent" 
android:background="@color/white" 
android:layout_height="match_parent"> 
<TextView 
android:id="@+id/song_id" 
android:textSize="20sp" 
android:textColor="@color/colorAccent" 
android:layout_width="wrap_content" 
android:layout_height="match_parent" 
android:gravity="left"/> 
<ImageView 
    android:layout_width="30dip" 
    android:src="@drawable/musicno" 
    android:layout_height="30dip" /> 
<TextView 
    android:id="@+id/song_title" 
    android:textStyle="bold" 
    android:layout_width="0dip" 
    android:textSize="20sp" 
    android:singleLine="true" 
    android:fadingEdge="horizontal" 
    android:layout_weight="1" 
    android:gravity="center_vertical" 
    android:layout_height="match_parent" /> 
</LinearLayout> 

我希望當用戶開始輸入一個字符時,根據他/她是哪個製表符分割,應該根據輸入的文本動態過濾listview,並在關閉searchview時返回原始列表視圖。 感謝您的幫助

+1

第一:'公衆靜態ListView listView; public static Cursor cursor;'糟糕的主意......也是你不關閉遊標......但是回到主題:做一個新的查詢,在適配器中交換遊標,關閉舊遊標,就是這樣 – Selvin

+0

是的,我明白了。首先,listview和cursor沒有聲明爲靜態的,我試圖在他們之外使用它們,然後再聲明它們。任何地方,這不是我現在的問題,因爲我將刪除聲明爲靜態... – katchoua

回答

0

我想出瞭如何在用戶立即搜索時使用SearchView動態過濾listview。 片段:具有列表視圖,我這樣做: 所有進口可能沒有必要讓你因爲我只是把它剪了我的整個項目,因此可以忽略一些

package com.xxx.yourpackagename.xxxx;  

import android.app.SearchManager; 
import android.content.Context; 
import android.content.Intent; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.support.v4.app.Fragment; 
import android.support.v4.view.MenuItemCompat; 
import android.support.v4.widget.SimpleCursorAdapter; 
import android.support.v7.widget.SearchView; 
import android.view.ContextMenu; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.view.View; 

/** 
* A simple {@link Fragment} subclass. 
*/ 
public class Tab1 extends Fragment { 

ListView listView; 
Cursor cursor; 
View v; 
SimpleCursorAdapter listAdapter; 
private SQLiteDatabase db; 
String[] fromColumns = {DatabaseContract.SongBook._ID, DatabaseContract.SongBook.KEY_TITLE}; 
int[] toView = {R.id.song_id, R.id.song_title}; 
DatabaseHelper dbhelper; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
    v = inflater.inflate(R.layout.tab_1, container, false); 
    setHasOptionsMenu(true); 
    listView = (ListView) v.findViewById(R.id.listview); 
    registerForContextMenu(listView); 
    dbhelper = new DatabaseHelper(this.getContext()); 
    String selectQuery = "SELECT * FROM " + DatabaseContract.SongBook.TABLE_NAME; 
    db = dbhelper.getWritableDatabase(); 
    cursor = db.rawQuery(selectQuery, null); 

    listAdapter = new SimpleCursorAdapter(this.getContext(), R.layout.song_item_layout, cursor, fromColumns, toView, 0); 
    listAdapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() { 
     @Override 
     public boolean setViewValue(View view, Cursor aCursor, int columnIndex) { 
      if (columnIndex == 0) { 
       String id = aCursor.getString(columnIndex); 
       TextView textView = (TextView) view; 
       textView.setText(String.format("%03d", Integer.parseInt(id))); 
       return true; 
      } 
      return false; 
     } 
    }); 

    listView.setAdapter(listAdapter); 
    listAdapter.notifyDataSetChanged(); 
    listView.setChoiceMode(AbsListView.CHOICE_MODE_MULTIPLE); 
    listView.setTextFilterEnabled(true); 

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      if (cursor.moveToPosition(position)) { 
       Intent intent = new Intent(Tab1.this.getActivity(), SongLyricsActivity.class); 

       String title = "", content = "", favourite = "", songID = ""; 
       songID = Integer.toString(cursor.getInt(0)); 

       songID = String.format("%04d", Integer.parseInt(songID)); 
       title = cursor.getString(1); 
       content = cursor.getString(2); 
       favourite = Integer.toString(cursor.getInt(3)); 

       intent.putExtra(DatabaseContract.SongBook._ID, songID); 
       intent.putExtra(DatabaseContract.SongBook.KEY_TITLE, title); 
       intent.putExtra(DatabaseContract.SongBook.KEY_CONTENT, content); 
       intent.putExtra(DatabaseContract.SongBook.KEY_IS_FAVORITE, favourite); 
       Tab1.this.getActivity().startActivity(intent); 
      } 
      //cursor.close(); 
     } 
    }); 

    db.close(); 
    return v; 
} 

@Override 
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
    super.onCreateOptionsMenu(menu, inflater); 
    getActivity().getMenuInflater().inflate(R.menu.main, menu); 

    MenuItem menuItem = menu.findItem(R.id.action_search); 
    SearchView searchView = (SearchView) MenuItemCompat.getActionView(menuItem); 
    searchView.setIconified(true); 
    // Associate searchable configuration with the SearchView 
    SearchManager SManager = (SearchManager) getActivity().getSystemService(Context.SEARCH_SERVICE); 
    MenuItem searchMenuItem = menu.findItem(R.id.action_search); 
    android.support.v7.widget.SearchView searchViewAction = (android.support.v7.widget.SearchView) MenuItemCompat.getActionView(searchMenuItem); 
    searchViewAction.setSearchableInfo(SManager.getSearchableInfo(getActivity().getComponentName())); 
    searchViewAction.setIconifiedByDefault(true); 
    searchView.setSubmitButtonEnabled(true); 

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

     @Override 
     public boolean onQueryTextChange(String newText) { 
      //listAdapter.getFilter().filter(newText); 
      try { 

      db = dbhelper.getReadableDatabase(); 
      // String mQuery = "SELECT * FROM " + DatabaseContract.SongBook.TABLE_NAME+" WHERE _ID LIKE '%"+newText+ "%'"; 
      String[] selectionArgs; 
      selectionArgs= new String[] {"%"+ newText + "%", "%"+ newText + "%" }; 
      cursor = db.rawQuery("SELECT * FROM " + DatabaseContract.SongBook.TABLE_NAME+" WHERE _ID LIKE ? OR title LIKE ?", selectionArgs); 
      SimpleCursorAdapter searchAdapter = new SimpleCursorAdapter(getContext(), R.layout.song_item_layout, cursor, fromColumns, toView, 0); 

       listView.setAdapter(searchAdapter); 
       TextView text = (TextView) v.findViewById(R.id.empty); 
       text.setText("No Match found! \n Make sure you type in exact song number or song title...:)!"); 
       listView.setEmptyView(text); 

      }catch (Exception e){ 
       e.printStackTrace(); 
      } 
      return true; 
     } 
    }); 

    } 
} 

此執行搜索從數據庫的列表視圖中填充id或標題。 這就是爲我工作,如果我錯了任何地方,糾正我,如果沒有,享受和upvote答案讓其他人從中受益...感謝和歡呼... :)