Как я могу показать два значения в одном RecycleView?

#android

#Android

Вопрос:

У меня есть таблица бейсбольной команды и баскетбольной команды. Я хочу вывести данные из каждой из этих двух таблиц и показать их в одном RecycleView.

Итак, я собирался указать viewType, но произошла ошибка.

Таблица содержит данные от игроков с одинаковыми именами, поэтому результаты безоговорочно берутся из каждой таблицы.

Я попытался поместить результаты двух таблиц в один список, затем поместить список в адаптер, чтобы показать его в RecycleView.

У меня возникла ошибка при попытке поместить результаты двух таблиц в один список.

Что мне делать?

Это MainActivity.

 public class MainActivity extends AppCompatActivity {

    RecyclerView recyclerView;
    SearchView searchView;
    ApiInterface apiInterface;
    Adapter adapter;
    List list = new ArrayList();
    List<BaseBallInfo> baseBallInfoList;
    List<BasketBallInfo> basketBallInfoList;
    RecyclerView.LayoutManager layoutManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        layoutManager = new LinearLayoutManager(this);

        recyclerView = findViewById(R.id.recyclerview);

        recyclerView.setLayoutManager(layoutManager);
        recyclerView.setHasFixedSize(true);
        searchView = findViewById(R.id.searchView);
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                search(query);
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                return false;
            }
        });
    }

    private void search(final String name) {
        apiInterface = ApiClient.getApiClient().create(ApiInterface.class);
        Call<List<BaseBallInfo>> call = apiInterface.getBaseBallInfo(name);
        call.enqueue(new Callback<List<BaseBallInfo>>() {
            @Override
            public void onResponse(Call<List<BaseBallInfo>> call, Response<List<BaseBallInfo>> response) {
                baseBallInfoList = response.body();
                list.add(baseBallInfoList);
            }

            @Override
            public void onFailure(Call<List<BaseBallInfo>> call, Throwable t) {
                Log.e("ErrorMessage", t.toString());
            }
        });

        Call<List<BasketBallInfo>> call2 = apiInterface.getBasketBallInfo(name);
        call2.enqueue(new Callback<List<BasketBallInfo>>() {
            @Override
            public void onResponse(Call<List<BasketBallInfo>> call, Response<List<BasketBallInfo>> response) {
                basketBallInfoList = response.body();
                list.add(basketBallInfoList);
            }

            @Override
            public void onFailure(Call<List<BasketBallInfo>> call, Throwable t) {
                Log.e("ErrorMessage", t.toString());
            }
        });

        adapter = new Adapter(MainActivity.this, list);
        recyclerView.setAdapter(adapter);
        adapter.notifyDataSetChanged();
    }
}
  

Это адаптер.

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

    private Context context;
    private List list;

    public Adapter(Context context, List list) {
        this.context = context;
        this.list = list;
    }

    @Override
    public int getItemViewType(int position) {
        if(list.get(position) instanceof BaseBallInfo) {
            return 0;
        }

        return 1;
    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        if(viewType == 0) {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_baseball, parent, false);
            BaseBallViewHolder holder = new BaseBallViewHolder(view);
            return holder;
        } else {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_basketball, parent, false);
            BasketBallViewHolder holder = new BasketBallViewHolder(view);
            return holder;
        }
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
        if(this.getItemViewType(position) == 0) {
            BaseBallInfo baseBallInfo = (BaseBallInfo)list.get(position);
            BaseBallViewHolder holder = (BaseBallViewHolder) viewHolder;
            holder.nameTextView.setText(baseBallInfo.getName());
            holder.battingTextView.setText(baseBallInfo.getBatting_avg());
        } else if(this.getItemViewType(position) == 1) {
            BasketBallInfo basketBallInfo = (BasketBallInfo)list.get(position);
            BasketBallViewHolder holder = (BasketBallViewHolder) viewHolder;
            holder.name2TextView.setText(basketBallInfo.getName());
            holder.positionTextView.setText(basketBallInfo.getPos());
        } else {
            Toast.makeText(context, "No Result", Toast.LENGTH_SHORT).show();
        }
    }

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

    public static class BaseBallViewHolder extends RecyclerView.ViewHolder {

        TextView nameTextView, battingTextView;

        public BaseBallViewHolder(@NonNull View itemView) {
            super(itemView);
            nameTextView = itemView.findViewById(R.id.nameTextView);
            battingTextView = itemView.findViewById(R.id.battingTextView);
        }
    }

    public static class BasketBallViewHolder extends RecyclerView.ViewHolder {

        TextView name2TextView, positionTextView;

        public BasketBallViewHolder(@NonNull View itemView) {
            super(itemView);
            name2TextView = itemView.findViewById(R.id.name2TextView);
            positionTextView = itemView.findViewById(R.id.positionTextView);
        }
    }
}
  

Это журнал ошибок.

 E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.recyclerviewprac01, PID: 10185
    java.lang.ClassCastException: java.util.ArrayList cannot be cast to com.example.recyclerviewprac01.BasketBallInfo
        at com.example.recyclerviewprac01.Adapter.onBindViewHolder(Adapter.java:57)
        at androidx.recyclerview.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:7065)
        at androidx.recyclerview.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:7107)
        at androidx.recyclerview.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:6012)
        at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6279)
        at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6118)
        at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6114)
        at androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2303)
        at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1627)
        at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1587)
        at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:665)
        at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:4134)
        at androidx.recyclerview.widget.RecyclerView.onMeasure(RecyclerView.java:3540)
        at android.view.View.measure(View.java:24966)
        at androidx.constraintlayout.widget.ConstraintLayout.internalMeasureChildren(ConstraintLayout.java:1227)
        at androidx.constraintlayout.widget.ConstraintLayout.onMeasure(ConstraintLayout.java:1572)
        at android.view.View.measure(View.java:24966)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:7139)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
        at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:143)
        at android.view.View.measure(View.java:24966)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:7139)
        at androidx.appcompat.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:403)
        at android.view.View.measure(View.java:24966)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:7139)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
        at android.view.View.measure(View.java:24966)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:7139)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1535)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:825)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:704)
        at android.view.View.measure(View.java:24966)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:7139)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
        at com.android.internal.policy.DecorView.onMeasure(DecorView.java:992)
        at android.view.View.measure(View.java:24966)
        at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:3301)
        at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:2028)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2330)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1888)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:8511)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:949)
        at android.view.Choreographer.doCallbacks(Choreographer.java:761)
        at android.view.Choreographer.doFrame(Choreographer.java:696)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:935)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7050)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:494)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965)
  

Пожалуйста, помогите мне.

Ответ №1:

Я не пробовал и не решал это, но я думаю, что проблема в:

в упражнении вы добавляете списки ‘BaseBallInfo’ и ‘BasketBallInfo’, которые вы получаете с помощью сетевой операции (у вас есть Response<List> в качестве ответа, поэтому это СПИСОК, а не ОТДЕЛЬНЫЙ ОБЪЕКТ).

Затем вы передаете этот список (то есть список списков) адаптеру. Затем вы пытаетесь получить элемент из этого списка и преобразовать его в ‘BaseBallInfo’ или ‘BasketBallInfo’, но если вы выполняете list.get (position), у вас есть список элементов ‘BaseBallInfo’ или ‘BasketBallInfo’, а не один элемент.

Я не совсем понял, что вы хотите в качестве конечного результата, но если весь код верен, вам следует преобразовать ‘list’ в действие в список объектов (‘BaseBallInfo’ или ‘BasketBallInfo’) вместо списка списка объектов.

Попробуйте сделать ‘list.addAll (…);’ вместо ‘list.add ()’ в обратном вызове сетевого ответа. Вам нужно, чтобы «список» был списком объектов, а не списком списков объектов.

Надеюсь, это полезно и решает, приятного кодирования и дня