2017-08-14 55 views
0

我跟着this樣本顯示在Android應用程序 YouTube視頻,我被困在實施中有一個搜索欄。我如何實現搜索欄的邏輯?我試圖實現可搜索接口,但在設置部分失敗。搜索Youtube的播放列表中的Android應用

這是適配器:

public class PlaylistCardAdapter extends RecyclerView.Adapter<PlaylistCardAdapter.ViewHolder> { 
    ....... 

public static class ViewHolder extends RecyclerView.ViewHolder { 


public PlaylistCardAdapter(PlaylistVideos playlistVideos, YouTubeRecyclerViewFragment.LastItemReachedListener lastItemReachedListener) { 
    mPlaylistVideos = playlistVideos; 
    mListener = lastItemReachedListener; 
} 

// Create new views (invoked by the layout manager) 
@Override 
public PlaylistCardAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    // inflate a card layout 
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.youtube_video_card, parent, false); 
    // populate the viewholder 
    ViewHolder vh = new ViewHolder(v); 
    return vh; 
} 

// Replace the contents of a view (invoked by the layout manager) 
@Override 
public void onBindViewHolder(final ViewHolder holder, final int position) { 
    if (mPlaylistVideos.size() == 0) { 
     return; 
    } 

    final Video video = mPlaylistVideos.get(position); 
    final VideoSnippet videoSnippet = video.getSnippet(); 

    holder.mTitleText.setText(videoSnippet.getTitle()); 

    if (mListener != null) { 
     // get the next playlist page if we're at the end of the current page and we have another page to get 
     final String nextPageToken = mPlaylistVideos.getNextPageToken(); 
     if (!isEmpty(nextPageToken) && position == mPlaylistVideos.size() - 1) { 
      holder.itemView.post(new Runnable() { 
       @Override 
       public void run() { 
        mListener.onLastItem(position, nextPageToken); 
       } 
      }); 
     } 
    } 
} 

@Override 
public int getItemCount() { 
    return mPlaylistVideos.size(); 
} 

private boolean isEmpty(String s) { 
    if (s == null || s.length() == 0) { 
     return true; 
    } 
    return false; 
} 

這是鏈接到片段類 - link

+0

搜索應該如何工作?過濾ArrayList? – Juan

+0

建議的提示:我沒有真正關注過這個項目。但要小心你在應用程序中捆綁的api鍵。應用程序中的任何東西都可以被反向設計。 – Juan

+0

是的,我想在本地取得播放列表視頻。我怎樣才能做到這一點? – Noob

回答

0

該解決方案由具有在適配器播放列表的兩個拷貝的。一個是傳遞給適配器的完整原始列表,另一個是將從應用搜索中選擇結果的項目的列表。

第二個名單是當用戶提交搜索,並且也將在回收站視圖中顯示的一個將要更新的一個。

在下面的例子:

Xxxxx將是你的情況下,播放列表項。

originalData保持項目的完整列表。

setData()被調用以用新的項目列表更新RecyclerView。

setSearchText()是所謂的文本傳遞給過濾回收視圖中的項目。
這可以用完整的文本被稱爲搜索,或每次用戶輸入到例如一個EditText時釋放的關鍵。

refreshData()調用applySearch()進行篩選,然後使用找到的項目更新屏幕上的RecyclerView。

public class XxxxxsRecyclerAdapter extends RecyclerView.Adapter<XxxxxsRecyclerAdapter.ViewHolder> { 

    private ArrayList<Xxxxx> data; 
    private ArrayList<Xxxxx> originalData; 
    private Context context; 
    private String searchText; 

    public XxxxxsRecyclerAdapter(Context context, ArrayList<Xxxxx> data) { 
     super(); 
     this.context = context; 
     this.data = data; 
     this.originalData = new ArrayList<>(); 
     if(this.data != null) { 
      this.originalData.addAll(this.data); 
     } 
    } 

    public void setData(ArrayList<Xxxxx> data) { 
     this.data = data; 
     this.originalData.clear(); 
     if (data != null) { 
      this.originalData.addAll(this.data); 
     } 
     refreshData(); 
    } 

    public void setSearchText(String searchText){ 
     this.searchText = searchText; 
     refreshData(); 
    } 


    private void applySearch(){ 
     if(data != null) { 
      if (searchText != null && !searchText.equals("")) { 
       ArrayList<Xxxxx> tmp = new ArrayList<>(); 
       tmp.addAll(data); 
       data.clear(); 
       for (Xxxxx xxxxx : tmp) { 
        if (xxxxx.getNombre().toUpperCase().contains(searchText.toUpperCase())) { 
         data.add(xxxxx); 
        } 
       } 
      } 
     } 
    } 

    private void refreshData(){ 
     this.applySearch(); 
     this.notifyDataSetChanged(); 
    } 

    ... 

} 
+0

謝謝!這是我正在尋找的 – Noob