【问题标题】:How to make the recyclerview uses an arraylist from a specific index如何使recyclerview使用来自特定索引的arraylist
【发布时间】:2018-01-13 20:28:07
【问题描述】:

我在片段中有recyclerview,并且数据来自网络请求。! 我想要的是忽略数据数组的前 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();
        }

【问题讨论】:

    标签: java android arrays arraylist android-recyclerview


    【解决方案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); 是没有用的。

    【讨论】:

    • 它在这条线上给了我这个java.lang.IndexOutOfBoundsException adapter = new HomeAdapter(list.subList(0, 2), getActivity());
    • 这意味着您的数组小于两个。确保通过记录或使用调试器正确检索您的 ArrayList。
    • InitRecyclerView 里面写着 0 在 onSuccess 里面是 20 !
    • 不要在onCreateView中调用initRecyclerView
    • 没关系,我找到解决办法了,看更新!
    【解决方案2】:

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

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

    【讨论】:

    • 我到底应该把这个放在哪里,getItemCount 在构造函数中返回一个崩溃和相同的结果?
    • 在您的 Adapter 类中实现 getItemCount。请粘贴您的适配器类和 logcat。
    • 没关系,我找到解决办法啦,看更新!
    【解决方案3】:

    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

    【讨论】:

    • 你是对的,我误用了subList,我在看到你的答案之前就知道了,但这是正确的答案。!
    猜你喜欢
    • 1970-01-01
    • 2017-04-24
    • 2020-05-06
    • 1970-01-01
    • 2019-01-11
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 2015-10-20
    相关资源
    最近更新 更多