【问题标题】:How to use two arrayList in one adapter Android studio Java?如何在一个适配器Android Studio Java中使用两个arrayList?
【发布时间】:2021-05-27 19:32:41
【问题描述】:

我知道之前有人问过这个问题,但我无法理解并将其集成到我的代码中。我有 2 个数组列表。一个用于 api 数据,另一个用于数据库数据。数据库的数组列表在单独时工作成功。但是当我添加 API 的数组列表时,我得到了这个异常 java.lang.IndexOutOfBoundsException:索引:0,大小:0

这是片段文件;

RecyclerView cuzdan_rc;
private ArrayList<CuzdanModel> cuzdanModels;
CuzdanAdapter adapter;

private VeriTabani vt;
CoinMarketApi api;




private List<Datum> cuzdanList =null;

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.varliklarim_fragment_layout, container, false);
    vt = new VeriTabani(getActivity());
    cuzdan_rc=rootView.findViewById(R.id.cuzdan_recycler_view);
    api = ApiClient.getClient().create(CoinMarketApi.class);
    CoinList();
    RecyclerBagla(rootView);


    return rootView;
}
private void RecyclerBagla(View rootView) {
    cuzdan_rc=rootView.findViewById(R.id.cuzdan_recycler_view);
    cuzdanList = new ArrayList<>();
    cuzdanModels = new CuzdanDao().Cuzdan(vt);
    adapter = new CuzdanAdapter(getActivity(),cuzdanModels,cuzdanList);

    cuzdan_rc.setAdapter(adapter);
    cuzdan_rc.setLayoutManager(new LinearLayoutManager(getActivity()));


}
public void CoinList() {
    Call<CryptoModel> call = api.coinMarketListCall("500");


    call.enqueue(new Callback<CryptoModel>() {

        @Override
        public void onResponse(Call<CryptoModel> call, Response<CryptoModel> response) {

            CryptoModel list = response.body();

            cuzdanList.clear();
            cuzdanList.addAll(list.getData());
         

            adapter.notifyDataSetChanged();
        }

        @Override
        public void onFailure(Call<CryptoModel> call, Throwable t) {
             Toast.makeText(getActivity(), "onFailure", Toast.LENGTH_SHORT).show();
            Log.d("XXXX", t.getLocalizedMessage());
            call.cancel();
        }
    });

}

这是 Adaptar 类;

public class CuzdanAdapter extends RecyclerView.Adapter<CuzdanAdapter.CardTasarimTutucu> {

private Context context;
private List<CuzdanModel> cuzdanList;
private List<Datum> mData;
public CuzdanAdapter(Context context, List<CuzdanModel> cuzdanList,List<Datum> mData) {
    this.context = context;
    this.cuzdanList = cuzdanList;
    this.mData=mData;
}

@NonNull
@Override
public CardTasarimTutucu onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.cuzdan_rc_tasarim, parent, false);
    return new CardTasarimTutucu(view);
}

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

    Datum datum = mData.get(position);

    CuzdanModel cuzdan = cuzdanList.get(position);
    holder.textViewCoinDegeriAdapter.setText(String.valueOf(datum.getQuote().getUSD().getPrice()));
    holder.textViewCoinAdi.setText(cuzdan.getCoin_adi());

    holder.textViewAlisFiyatiAdapter.setText(String.format("%.3f",cuzdan.getCoin_alis_fiyati()));
    holder.textViewCoinAdediAdapter.setText(String.format("%.3f",cuzdan.getCoin_alis_adeti()));

}

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

public class CardTasarimTutucu extends RecyclerView.ViewHolder {
    private TextView textViewCoinAdi, textViewCoinDegisimAdapter,
            textViewCoinAdediAdapter, textViewCoinDegeriAdapter, textViewAlisFiyatiAdapter;
    private CardView cuzdan_cardView;

    public CardTasarimTutucu(@NonNull View itemView) {
        super(itemView);
        textViewCoinAdi = itemView.findViewById(R.id.textViewCoinAdiAdapter);
        textViewCoinDegisimAdapter = itemView.findViewById(R.id.textViewCoinDegisimAdapter);
        textViewCoinAdediAdapter = itemView.findViewById(R.id.textViewCoinAdediAdapter);
        textViewCoinDegeriAdapter = itemView.findViewById(R.id.textViewCoinDegeriAdapter);
        textViewAlisFiyatiAdapter = itemView.findViewById(R.id.textViewAlisFiyatiAdapter);
        cuzdan_cardView = itemView.findViewById(R.id.cuzdan_cardView);


    }
}


}

为什么它不起作用?我需要你的帮助。

【问题讨论】:

  • 不知道你想做什么。我没有看到 2 个列表。请告诉我们你从哪里得到这个数组越界异常。
  • 请在设置适配器之前验证 cuzdanModels 是否包含数据。
  • @DavidWasser 数组在适配器中定义。错误如下CuzdanAdapter.onBindViewHolder(CuzdanAdapter.java:38) CuzdanAdapter.onBindViewHolder(CuzdanAdapter.java:17) java 38 指向这一行 ''Datum datum = mData.get(position);'' 和 java 17 指向这一行“公共类 CuzdanAdapter 扩展 RecyclerView.Adapter
  • @hafiza 我已经在另一个片段中使用 cuzdanModels 并且它正在工作。

标签: java android android-recyclerview android-adapter


【解决方案1】:

您可以像这样创建和初始化适配器:

cuzdanList = new ArrayList<>();
cuzdanModels = new CuzdanDao().Cuzdan(vt);
adapter = new CuzdanAdapter(getActivity(),cuzdanModels,cuzdanList);

此时cuzdanList 为空。显然,您需要在 cuzdanList 中拥有与在 cuzdanModels 中完全相同数量的项目,而这并没有发生。崩溃时,List&lt;cuzdanModels&gt; 有多个元素,List&lt;Datum&gt; 仍然为空。

您在适配器中将List&lt;CuzdanModel&gt; 称为cuzdanList 并将List&lt;Datum&gt; 称为mData,但使用cuzdanList 作为List&lt;Datum&gt; 调用适配器构造函数可能是您的问题的一部分.

【讨论】:

  • 对不起先生,我不明白你的意思。你能给我什么建议?我的双手被束缚,什么也做不了。
  • 我不知道“我的双手被束缚”是什么意思。这是你的代码,你可以做任何你想做的事情。无论如何,您需要确保传递给适配器的 2 个列表具有相同数量的元素。他们没有 一个列表的元素超过零,而另一个列表为空。通过填写两个列表来修复它。要么修复 getItemCount() 方法,使其仅返回两个列表中的最小项目数:return Math.min(cuzdanList.size(), mData.size())
  • 请不要生我的气。我知道这是我的代码,但我无法为所欲为。因为不幸的是我的知识不足。例如,我永远不会想到使用您使用的方法。因为我什至不知道有这样的方法。无论如何,非常感谢您,先生。你的建议解决了这个问题。我很感激。
  • 很高兴您能够解决问题。如果我的回答有帮助,您应该通过单击答案旁边的绿色复选标记“接受”它。欢迎来到 Stackoverflow 社区。​​span>
【解决方案2】:

java.lang.IndexOutOfBoundsException 表示您正在尝试从列表(或数组或其他集合)中获取元素,但列表中没有它。更具体地说,Size: 0 表示您的列表有 0 个元素,因此它是空的,Index: 0 表示您正在尝试获取第一个元素。但是列表是空的,所以没有第一个元素,所以你得到了异常。

您补充说异常发生在第 38 行,即'Datum datum = mData.get(position);。似乎那时position 为0,而mData 为空。查看您的代码,我在Adapter 类中没有找到任何将某些内容放入mData 的行,您只需在CuzdanAdapter 构造函数中对其进行初始化。这在adapter = new CuzdanAdapter(getActivity(),cuzdanModels,cuzdanList); 行调用,其中cuzdanList 在前两行空创建。在片段文件中,您在cuzdanList 中放入任何内容的唯一位置是cuzdanList.addAll(list.getData()); 行。但如果响应为空,则不会添加任何元素,稍后您会得到 IndexOutOfBoundsException。

【讨论】:

  • 我明白您的意思,先生。但它仍然不起作用。我删除了“cuzdanList = new ArrayList();”命令,但什么也没发生。我认为问题比我所知道的要大。我无法解决它。不管怎样,谢谢你的回答
猜你喜欢
  • 1970-01-01
  • 2017-07-15
  • 1970-01-01
  • 1970-01-01
  • 2011-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多