안드로이드/로또 앱

[Android Studio] Java Recylerview 뷰페이징

채야미 2023. 1. 3. 14:23

일반 리사이클러 뷰와 동일하나, 중간에

recyclerView.addOnScrollListener를 추가해 주고 

리사이클러뷰에 마지막 아이템에 도달했을때 어댑터에 아이템을 추가해주는 기능을 구현하면 된다.

아래 코드에서는 10개씩 불러오는 것으로 했다.

1.

WinningHistoryActivity
package org.techtown.lottoworld.winningHistory;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;

import org.techtown.lottoworld.DataAdapter;
import org.techtown.lottoworld.NumberQuery;
import org.techtown.lottoworld.R;

import java.sql.SQLException;
import java.util.List;

public class WinningHistoryActivity extends AppCompatActivity {
    static public List<NumberQuery> numberQueryList;
    int pages; // 전체 페이지 수
    int totalItem;
    int page = 0; // 현재 페이지

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_winning_history);
        RecyclerView recyclerView = findViewById(R.id.recyclerView_ph);

	//아이템을 DB에서 읽어오는 부분
        getNumberQueryList();

        LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
        recyclerView.setLayoutManager(layoutManager);
	//Adapter를 선언
        WinningNumAdapter adapter = new WinningNumAdapter();

        totalItem = numberQueryList.size();


        if (totalItem % 10 == 0) { // 전체 페이지 계산 10개씩 페이징하는 경우
            pages = totalItem / 10;
        } else {
            pages = totalItem / 10 + 1;
        }
	// 먼저 아이템을 추가해주는 부분
        addNumItem(adapter);
	// 리사이클러 뷰에 어뎁터 등록
        recyclerView.setAdapter(adapter);
	// 리사이클러뷰에 스크롤을 하면 마지막 아이템이 왔을때 아이템을 추가
        recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
            }

            @Override
            public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);

                int lastPosition = ((LinearLayoutManager) recyclerView.getLayoutManager()).findLastCompletelyVisibleItemPosition();
                int totalCount = recyclerView.getAdapter().getItemCount();

                if (lastPosition == totalCount - 1) {
                    //아이템을 추가하고 다시 새로 고침
                    addNumItem(adapter);
                    adapter.notifyDataSetChanged();
                }
            }
        });
    }
    
	// 아이템을 읽어오는 메소드
    public int getNumberQueryList() {
        int round = 0;
        try {
            DataAdapter mDbAdapter = new DataAdapter(getApplicationContext());
            mDbAdapter.open();

            // db에 있는 값들을 model을 적용해서 넣는다.
            numberQueryList = mDbAdapter.getWinningData();
            // db 닫기
            mDbAdapter.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return round;
    }

    public void addNumItem(WinningNumAdapter adapter) {

        int start = page * 10;
        int end;

        if (totalItem < (page + 1) * 10) {
            end = totalItem;
        } else {
            end = (page + 1) * 10;
        }

        for (int i = start; i < end; i++) {
            adapter.addItem(numberQueryList.get(i));
        }
        page++;

    }
}

 

2.

WinningNumAdapter
package org.techtown.lottoworld.winningHistory;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import org.techtown.lottoworld.NumberQuery;
import org.techtown.lottoworld.R;

import java.util.ArrayList;

public class WinningNumAdapter extends RecyclerView.Adapter<WinningNumAdapter.ViewHolder>{
    ArrayList<NumberQuery> items = new ArrayList<NumberQuery>();

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());
        View itemView = inflater.inflate(R.layout.winning_num_item, parent,false);

        return new ViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        NumberQuery item = items.get(position);
        holder.setItem(item);
    }

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


    public void addItem(NumberQuery item) {
        items.add(item);
    }

    public void setItems(ArrayList<NumberQuery> items) {
        this.items = items;
    }

    public NumberQuery getItem(int position) {
        return items.get(position);
    }

    public void setItem(int position, NumberQuery item) {
        items.set(position, item);
    }
    static class ViewHolder extends RecyclerView.ViewHolder{

        TextView round;
        TextView winningNums;
        TextView bonusNum;
        TextView statics;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            round = itemView.findViewById(R.id.round);
            winningNums = itemView.findViewById(R.id.winningNums);
            bonusNum = itemView.findViewById(R.id.bonusNum);
            statics = itemView.findViewById(R.id.statics);

        }
        public void setItem(NumberQuery item) {
            String roundT = item.getRound() + "회 당첨번호";
            String staticT = "총합:" + item.getTotal() + " 짝홀:" + item.getEven() + "/" +  (6 - item.getEven());


            round.setText(roundT);
            winningNums.setText(item.numberString());
            bonusNum.setText(Integer.toString(item.getNums()[6]));

            statics.setText(staticT);
        }


    }
}