#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 ()’ в обратном вызове сетевого ответа. Вам нужно, чтобы «список» был списком объектов, а не списком списков объектов.
Надеюсь, это полезно и решает, приятного кодирования и дня