2015-06-03 49 views
0

我遵循了幾個stackoverflow線程,教程和我可以從文檔中收集的內容,但無法獲取在Android中工作的AplhabetIndexer。目標是建立索引ListView,用戶可以根據手機上的標準聯繫人應用程序使用右側的字母快速滾動。最終我會在列表中添加節標題,並使其可以作爲用戶類型進行篩選,但現在我只想獲得基本列表的工作方式。實現Android AlphabetIndexer但它沒有顯示

我可以加載列表並從光標中獲取我的所有結果,但我從來沒有將字母顯示在ListView的右側。我嘗試過設置適配器的不同組合,包括onCreateView中的空遊標,然後在onLoadFinished()回調中調用changeCursor(cursor),以及當前版本,該版本在onLoadFinished()回調中完全設置適配器。

有沒有人得到他們可以共享的設置和適配器代碼的完整工作版本?最好先使用創建適配器的方法,然後在onLoadFinished()回調中調用changeCursor(cursor)

我有什麼至今:

StoreListAdapter.java

public class StoreListAdapter extends SimpleCursorAdapter implements SectionIndexer { 

private AlphabetIndexer mAlphabetIndexer; 

public StoreListAdapter(Context context, int layout, Cursor cursor, String[] from, int[] to, int flags) { 
    super(context, layout, cursor, from, to, flags); 
    if(cursor != null){ 
     mAlphabetIndexer = new AlphabetIndexer(cursor, 
       cursor.getColumnIndex(StoreEntry.TABLE_ALIAS + StoreEntry.COLUMN_NAME), 
       "ABCDEFGHIJKLMNOPQRTSUVWXYZ"); 
     mAlphabetIndexer.setCursor(cursor); 
    } 
} 

@Override 
public void changeCursor(Cursor cursor) { 
    super.changeCursor(cursor); 
    if(cursor != null){ 
     mAlphabetIndexer = new AlphabetIndexer(cursor, 
       cursor.getColumnIndex(StoreEntry.TABLE_ALIAS + StoreEntry.COLUMN_NAME), 
       "ABCDEFGHIJKLMNOPQRTSUVWXYZ"); 
     mAlphabetIndexer.setCursor(cursor); 
    } 
} 

@Override 
public Object[] getSections() { 
    if(mAlphabetIndexer != null){ 
     return mAlphabetIndexer.getSections(); 
    }else{ 
     return null; 
    } 

} 

@Override 
public int getPositionForSection(int sectionIndex) { 
    if(mAlphabetIndexer != null){ 
     return mAlphabetIndexer.getPositionForSection(sectionIndex); 
    }else{ 
     return 0; 
    } 

} 

@Override 
public int getSectionForPosition(int position) { 
    if(mAlphabetIndexer != null){ 
     return mAlphabetIndexer.getSectionForPosition(position); 
    }else{ 
     return 0; 
    } 
} 

} 

StoreListFragment.java

public class StoreListFragment extends Fragment implements LoaderManager.LoaderCallbacks<Cursor> { 

private ListView mListView; 
private StoreListAdapter mAdapter; 

public static StoreListFragment newInstance() { 
    StoreListFragment fragment = new StoreListFragment(); 
    return fragment; 
} 

/** 
* Mandatory empty constructor for the fragment manager to instantiate the 
* fragment (e.g. upon screen orientation changes). 
*/ 
public StoreListFragment() { 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    getLoaderManager().initLoader(0, null, this); 
} 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_store_search, container, false); 
    mListView = (ListView) view.findViewById(R.id.search_result_list); 
    return view; 
} 

@Override 
public void onAttach(Activity activity) { 
    super.onAttach(activity); 

} 

@Override 
public void onDetach() { 
    super.onDetach(); 
} 

@Override 
public Loader<Cursor> onCreateLoader(int id, Bundle args) { 
    return new CursorLoader(
      getActivity(), // Parent activity context 
      StoreProvider.CONTENT_URI,  // Table to query 
      null,  // Projection to return 
      null,   // No selection clause 
      new String[]{getString(R.string.centre_id)},   // No selection arguments 
      null    // Default sort order 
    ); 
} 

@Override 
public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
    mListView.setFastScrollEnabled(true); 
    mListView.setScrollingCacheEnabled(true); 
    mAdapter = new StoreListAdapter(getActivity().getApplicationContext(), R.layout.store_list_item, data, new 
      String[]{StoreEntry.TABLE_ALIAS + StoreEntry.COLUMN_NAME}, new int[]{R.id.item_name}, CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER); 
    mListView.setAdapter(mAdapter); 
} 

@Override 
public void onLoaderReset(Loader<Cursor> loader) { 
    mAdapter.changeCursor(null); 
} 
} 

回答

1

其實,當我增加了更多的測試數據它開始工作。看起來如果你的搜索結果很小(我使用了大約20個左右),它就不會啓動。一旦我添加了大約100個左右的虛擬數據,它就開始工作。

2

確切的行爲可以在類FastScroller中找到,該類是AbsListView的幫助類。有一段代碼有沒有決定是否「列表很長」

final boolean longList = childCount > 0 && itemCount/childCount >= MIN_PAGES; 

MIN_PAGES與4.你有它,如果你的列表項數不至少4倍的兒童計(價值定義可見行)快速滾動,因此字母索引器不會出現。

相關問題