RecyclerView 질문

조회수 848회

하나의 RecyclerView에 2개의 DB에서 가져오는 데이터를 동시에 보여주고싶습니다. 이미지 이미지

이렇게 2개의 테이블이 있는데 야구팀과 농구팀에 들어간 선수들의 이름은 동명이인으로 같습니다. 안드로이드에서 선수 이름을 검색했을 때 야구팀은 이름과 타율을 보여주고싶고 농구팀은 이름과 포지션을 보여주고싶습니다.

이미지

이런식의 결과를 원했는데 안 나오네요. ViewType을 지정해주면 된다는건 알아냈는데 이렇게 지정을 하는게 맞는지는 잘 모르겠네요.

밑에는 MainActivity입니다.

public class MainActivity extends AppCompatActivity {

    RecyclerView recyclerView;
    SearchView searchView;
    ApiInterface apiInterface;
    Adapter adapter;
    List<BaseBallInfo> baseBallInfoList;
    List<BasketBallInfo> basketBallInfoList;

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

        recyclerView = findViewById(R.id.recyclerview);
        searchView = findViewById(R.id.searchView);
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String s) {
                search(s);
                return false;
            }

            @Override
            public boolean onQueryTextChange(String s) {

                return false;
            }
        });
    }

    private void search(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();
                adapter = new Adapter(MainActivity.this, baseBallInfoList);
                recyclerView.setAdapter(adapter);
                adapter.notifyDataSetChanged();
            }

            @Override
            public void onFailure(Call<List<BaseBallInfo>> call, Throwable t) {
                Log.e("MainActivity", 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();
                adapter = new Adapter(MainActivity.this, basketBallInfoList);
                recyclerView.setAdapter(adapter);
                adapter.notifyDataSetChanged();
            }

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

밑에는 RecyclerView의 Adapter입니다.

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(this.getItemViewType(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 {
            BasketBallInfo basketBallInfo = (BasketBallInfo)list.get(position);
            BasketBallViewHolder holder = (BasketBallViewHolder) viewHolder;
            holder.name2TextView.setText(basketBallInfo.getName());
            holder.positionTextView.setText(basketBallInfo.getPos());
        }
    }

    @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);
        }
    }
}

중간 언어로 php를 사용하는 중인데 php 결과는 잘 나옵니다. 도와주세요.

  • (•́ ✖ •̀)
    알 수 없는 사용자

1 답변

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)