如何使recyclerview使用特定索引

时间:2017-08-06 11:27:04

标签: java android arrays arraylist android-recyclerview

我在片段中有recyclelerview,并且数据来自网络请求。 我想要的是忽略数据数组的前3项,我只想让它从索引3开始。!

我认为可以使用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();
        }

3 个答案:

答案 0 :(得分: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);是不可能的。

答案 1 :(得分:1)

subList方法返回新的List。所以如果你想使用那个方法,你应该这样做: data = data.subList(0,2);

您还可以保留列表并操纵适配器以显示特定索引中的项目。您应该实施getItemCount并返回data.size() - 3,并在onBindViewHolder中,从position - 3获取数据。

答案 2 :(得分:1)

1-如果您想要 SKIP 前3个元素,那么您的范围是错误的。 (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语句和subList()中使用3