2017-08-06 55 views
0

我有一個片段中的recyclerview,並且通過web請求發送數據。 我想要的是忽略數據數組的前3項,我只是希望它從索引3開始。如何使recyclerview使用來自特定索引的數組列表

我認爲這將解決使用homeData.sublist(0,2),但我不知道究竟在哪裏把這條線..!我嘗試了幾個地方,但沒有工作..!?

我的片段

public class HomeFragment extends BaseFragment { 

    private RecyclerView recyclerView; 
    ArrayList<Home.HomeItem> homeData; 
    private HomeAdapter adapter; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.fragment_home, container, false); 
    InitRecyclerView(); 
    GetData(); 
    return rootView; 
    } 

    private void GetData() { 

     WebRequests.HomeRequest(new OnRequestResults() { 
     @Override 
     public void OnSuccess(Object o) { 

      ArrayList<Home.HomeItem> homeList = (ArrayList<Home.HomeItem>) o; 
      homeList.subList(0, 2); // tried here, but it didn't work 

      homeData.clear(); 
      homeData.addAll(homeList); 
      adapter.notifyDataSetChanged(); 
     } 
} 

    private void InitRecyclerView() { 

    homeData = new ArrayList<>(); 
    recyclerView.setHasFixedSize(true); 
    LayoutManager mLayoutManager = new LinearLayoutManager(getActivity()); 
    recyclerView.setLayoutManager(mLayoutManager); 

    homeList.subList(0, 2); // tried here, it gives carsh `IndexOutofBound..` 

    adapter = new HomeAdapter(homeData, getActivity()); 
    recyclerView.clearOnScrollListeners(); 
    recyclerView.setAdapter(adapter); 
    } 
} 

我的適配器

//code 

@Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 

    data.subList(0, 2); //noting changes here too 

    holder.title.setText(data.get(position).getTitle()); 
    Picasso.with(context) 
      .load(data.get(position) 
      .getImgUrl).placeholder(R.drawable.logo) 
      .into(holder.pic); 
    } 

    //code 

更新------------------------ -------------------------------------------

我是使用.subList錯誤,我必須在參數裏面的新列表中指定開始和結束,我在添加限制,我想刪除哪些是完全愚蠢的!

我還在onSuccess中添加了這一行!

@Override 
     public void OnSuccess(Object o) { 
      ArrayList<Home.HomeItem> home = (ArrayList<Home.HomeItem>) o; 
      homeData.clear(); 
      homeData.addAll(home.subList(3,home.size())); //here 
      adapter.notifyDataSetChanged(); 
     } 

回答

1

1-如果你想SKIP前3 elelemts,那麼你的範圍是錯誤的。 (0,2)將讓你前3個元素,它應該是(2,則爲list.size() - 1)

2-調用此行homeList.subList(...)不會改變列表本身,它會返回一個列表你需要使用。 所以代碼可能看起來像這樣。

homeData.clear(); 
if(homeList.size() >= 2){ // make sure array has at least 3 elements, (which is going to be skipped) 
    homeData.addAll(homeList.subList(2, homeList.size())); 
} 

注:我不知道fromIndex(2)如果你仍然可以看到列表中的第三個項目,然後用3,在這兩個IF語句和子列表()

+0

你是對的我濫用'subList',在我看到你的答案之前我想到了,但這是正確的答案。 –

1

試試這段代碼。

private void initRecyclerView(ArrayList<Home.HomeItem> list) { 
    recyclerView.setHasFixedSize(true); 
    LayoutManager mLayoutManager = new LinearLayoutManager(getActivity()); 
    recyclerView.setLayoutManager(mLayoutManager); 

    adapter = new HomeAdapter(list.subList(0, 2), getActivity()); 
    recyclerView.setAdapter(adapter); 
    } 




private void GetData() { 
     WebRequests.HomeRequest(new OnRequestResults() { 
     @Override 
     public void OnSuccess(Object o) { 

      ArrayList<Home.HomeItem> homeList = (ArrayList<Home.HomeItem>) o; 

      initRecyclerView(homeList); 
     } 
} 

List subList(int fromIndex, int toIndex)返回修改後的列表,但不修改原始列表。所以你打電話homeList.subList(0, 2);是不可能做的事情。

+0

它給了我這個'這條線上的java.lang.IndexOutOfBoundsException''adapter = new HomeAdapter(list.subList(0,2),getActivity()); ' –

+0

這意味着你的數組小於2。 確保您的ArrayList通過記錄或使用調試器被正確檢索。 – humazed

+0

在'InitRecyclerView'裏面,它在'onSuccess'裏面寫着0就是20! –

1

subList方法返回一個新的List。所以如果你想使用這種方法,你應該這樣做: data = data.subList(0,2);

你也可以保持你的列表和操縱你的適配器顯示來自特定索引的項目。您應該執行getItemCount並返回data.size() - 3並在您的onBindViewHolder中,從position - 3獲取數據。

+0

我到底在哪裏,'getItemCount'返回一個崩潰,並在構造函數內部相同? –

+0

在你的Adapter類中實現'getItemCount'。 請粘貼您的適配器類和logcat。 –

+0

沒關係,我找到了解決辦法,看看更新! –

相關問題