마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

안드로이드 스튜디오 리싸이클러뷰 아이템개수 반환하기

0 추천

#1프래그먼트에서 입력한 값을 어뎁터와 db를 이용해 #2프래그먼트에서 리싸이클러뷰에 조회하고 #3프래그먼트에서 얼마나 누적 입력횟수를 보여주려고 합니다.

TestAdapter adapter;
TextView korea_practicenumber_textVIew;
OnDatabaseCallback callback;
@Override
public void onAttach(Context context) {
    super.onAttach(context);

    callback = (OnDatabaseCallback) getActivity();

}

private HomeViewModel homeViewModel;

public View onCreateView(@NonNull LayoutInflater inflater,
                         ViewGroup container, Bundle savedInstanceState) {
    homeViewModel =
            new ViewModelProvider(this).get(HomeViewModel.class);
    View root = inflater.inflate(R.layout.fragment_home, container, false);

    korea_practicenumber_textVIew = root.findViewById(R.id.korea_practicenumber_textVIew);
    adapter = new TestAdapter();
    int countKor = adapter.getItemCount();

    korea_practicenumber_textVIew.setText(countKor+ " ");
    return root;
}

여기 코드는 #3에 해당하는 프래그먼트입니다. korea_practicenumber_textView에 db를 이용해 적립된 리싸이클러뷰 아이템 개수를 setText하고 싶은데 계속해서 0값만 반환됩니다.

이 방법이 아니라면

db에서 cursor.getCount()를 해야할까요? 

 

--이 코드는 db 코드중 조회하는 함수부분입니다--

 public ArrayList<TestInfo> selectAll() {
        ArrayList<TestInfo> result = new ArrayList<TestInfo>();

        try {
            Cursor cursor = db.rawQuery("select YEAR, MONTH, AGE, GRADE, SCORE from " + TABLE_TEST_INFO, null);
            for (int i = 0; i < cursor.getCount(); i++) {
                cursor.moveToNext();
                String year = cursor.getString(0);
                String month = cursor.getString(1);
                String age = cursor.getString(2);
                String grade = cursor.getString(3);
                String score = cursor.getString(4);

                TestInfo info = new TestInfo(year, month, age, grade, score);
                result.add(info);
            }
            int count_kor = cursor.getCount();

        } catch(Exception ex) {
        }
        return result;
    }

 

이런식으로 cursor.getCount()를 했다면 #3프래그먼트에서 이 정수값을 어떻게 반환받을까요?

쿠롱 (250 포인트) 님이 2021년 12월 13일 질문

1개의 답변

+1 추천

selectAll에서 리턴하는 데이터가 List이므로 List.size()하시면 아이템 갯수를 알 수 있지 않나요?

https://docs.oracle.com/javase/8/docs/api/java/util/List.html#size--

 그리고 TestAdapter에는 setItems메소드를 만들어서 DB에서 읽어온 아이템을 업데이트 하게 만들거나 생성자에 아이템을 넘겨줄 수 있도록 해주시면 될 것 같은데요.

public View onCreateView(@NonNull LayoutInflater inflater,
                         ViewGroup container, Bundle savedInstanceState) {
    ...
    ArrayList<Testnfo> testnfoList = homeViewModel.selectAll();
    adapter = new TestAdapter();
    adapter.setItems(testnfoList);
    int countKor = testnfoList.size();

    korea_practicenumber_textVIew.setText(countKor+ " 회");
    return root;
}

 

그런데 DB, 파일, 네트워크 등의 작업은 위처럼 메인쓰레드에서 하는 건 권장하지 않습니다. 백그라운드 쓰레드에서 처리하도록 하는게 좋습니다. 그리고 ViewModel를 사용한다면 바로 selectAll을 바로 호출하는 것 보다는 LiveData를 통해서 데이터를 전달받는 것이 더 좋은 방법입니다. 어차피 백그라운드 쓰레드에서 DB를 읽게되면 그렇게 처리하셔야 할 겁니다.

 

public HomeViewModel extends ViewModel {

     private MutableLiveData<List<TestInfo>> testInfoListLiveData = new MutableLiveData();
     public LiveData<List<TestInfo>> getTestInfo() {
          return testInfoListLiveData;
     }

     public List<TestInfo> getAllTestInfo() {
          testInfoListLiveData.postValue(selectAll());
     }
}


// Fragment
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
     homeViewModel.getTestInfo().observie(getViewLifecycleOwner(), new Observer<List<TestInfo>>() {
           @Override
            public void onChanged(@Nullable final List<TestInfo> testInfoList) {
                testAdapter.setitems(testInfoList);
                korea_practicenumber_textVIew.setText(testInfoList.size() + " 회");
            }
     });

    homeViewModel.getAllTestInfo();
}

저는 주로 코틀린 Coroutine을 사용하기 때문에, 자바에서는 사용할 수가 없습니다.  자바에서는 RoomDB를 사용해서 LiveData를 리턴받거나 Rxjava를 사용하거나 하는 형태로 변경하셔야 합니다. 사실 DB처리는 Room을 사용하는게 여러가지 면에서 훨씬 좋습니다.

spark (139,480 포인트) 님이 2021년 12월 13일 답변
spark님이 2021년 12월 13일 수정
...