안드로이드/로또 앱
[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);
}
}
}