본문 바로가기
Android Studio

[Android Studio] Retrofit2 라이브러리를 이용해 RecyclerView 화면 처리하기

by dong_su 2024. 1. 4.

포스트맨에서 api 요청 시 필요한 것들을 확인한다. (httpmethod, url, 토큰 유무, 데이터 유무, 쿼리스트링 유무 등등)

 

public interface MemoApi {

    // 메모 생성 API
    @POST("/memo")
    Call<Res> addMemo(@Header("Authorization") String token, @Body Memo memo);

    // 내 메모리스트 가져오는 API
    @GET("/memo")
    Call<MemoList> getMemoList(@Header("Authorization") String token, @Query("offset") int offset, @Query("limit") int limit);
}

확인 후, api를 호출하기 위해 api 패키지 - MemoApi 인터페이스에서 함수를 만들어준다.

토큰(key와 value 형식)은 @Header에 작성

쿼리스트링 부분엔 두 변수가 있기 때문에 @Query(변수명)을 두번 작성한다.

 

model 패키지에 반환타입인 MemoList 클래스를 만들어 줘야 한다.

-> 응답 데이터를 받아와야 하기 때문

MemoList 클래스의 변수를 어떻게 처리할 지 포스트맨 응답결과를 참고 해서 작성한다.

 

// MemoList 클래스 부분

public class MemoList {
    public String result;
    public ArrayList<Memo> items;
    public int count;

    public MemoList(){

    }

    public MemoList(String result, ArrayList<Memo> items, int count) {
        this.result = result;
        this.items = items;
        this.count = count;
    }
}

앞서 만든 Memo 클래스와 유사하기 때문에, 새로운 클래스를 만들지 말고 

 

public class Memo {

	// 이전 Memo 변수
	public String title;
    public String date;
    public String content;
    
    // 바뀐 Memo 변수
    // ArrayList<Memo>를 이용하기 위해 응답 데이터중 필요한 변수 id를 추가한 상태
    public int id;
    public String title;
    public String date;
    public String content;
    
    // 아래는 생략

Memo 클래스를 위와 같이 수정한다.

 

그 후에는 그동안 했던 거와 같이,

어뎁터를 만들고 메인액티비티의 create()가 실행될 때 retrofit2 통신 후 어뎁터에 적용하면 된다.

 

MemoAdapter 코드

public class MemoAdapter extends RecyclerView.Adapter<MemoAdapter.ViewHolder>{
    Context context;
    ArrayList<Memo> memoArrayList;

    public MemoAdapter(Context context, ArrayList<Memo> memoArrayList) {
        this.context = context;
        this.memoArrayList = memoArrayList;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.memo_row, parent, false);

        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        Memo memo = memoArrayList.get(position);

        holder.txtTitle.setText(memo.title);
        // todo : 날짜는 ISO 포맷으로 오기 때문에 가공해서 화면에 표시할 것이다.
        holder.txtDate.setText(memo.date);
        holder.txtContent.setText(memo.content);
    }

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

    public class ViewHolder extends RecyclerView.ViewHolder {
        TextView txtTitle;
        TextView txtDate;
        TextView txtContent;
        ImageView imgDelete;
        CardView cardView;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);

            txtTitle = itemView.findViewById(R.id.txtTitle);
            txtDate = itemView.findViewById(R.id.txtDate);
            txtContent = itemView.findViewById(R.id.txtContent);
            imgDelete = itemView.findViewById(R.id.imgDelete);
            cardView = itemView.findViewById(R.id.cardView);

            cardView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                }
            });
        }
    }
}

 

메인액티비티 코드

getNetworkData();

adapter = new MemoAdapter(MainActivity.this, memoArrayList);
recyclerView.setAdapter(adapter);

private void getNetworkData() {
        Retrofit retrofit = NetworkClient.getRetrofitClient(MainActivity.this);

        MemoApi api = retrofit.create(MemoApi.class);

        SharedPreferences sp = getSharedPreferences(Config.PREFERENCE_NAME, MODE_PRIVATE);
        String token = sp.getString("token", "");
        token = "Bearer " + token;

        Call<MemoList> call = api.getMemoList(token, offset, limit);

        call.enqueue(new Callback<MemoList>() {
            @Override
            public void onResponse(Call<MemoList> call, Response<MemoList> response) {
                progressBar.setVisibility(View.GONE);
                
                if (response.isSuccessful()){
                    MemoList memoList = response.body();
                    memoArrayList.addAll(memoList.items);

                    return;
                } else if (response.code() == 500) {
                    Snackbar.make(btnAdd, "DB 오류", Snackbar.LENGTH_SHORT).show();
                    return;
                } else if (response.code() == 400) {
                    Snackbar.make(btnAdd, "메모가 존재하지 않습니다.", Snackbar.LENGTH_SHORT).show();
                    return;
                } else {
                    Snackbar.make(btnAdd, "잠시 후 이용하세요.", Snackbar.LENGTH_SHORT).show();
                    return;
                }

            }

            @Override
            public void onFailure(Call<MemoList> call, Throwable t) {
                progressBar.setVisibility(View.GONE);
                return;
            }
        });
    }