Fragment使ってる画面でRoomが動いたので、今後のためにまとめメモしているの②です
■ ■ ■
リポジトリは「model」フォルダを作って、そこに入れました
ViewModelは、BottomNavigationで自動作成されたViewModelを使うことにしました
ListView用のAdaptreは、どこの階層に作るべきかわからなかったので、とりあえず、MainActivityと同じ階層に置いてみました。
ファイル構成は悩みます。
まあ、個人プロジェクトなんで、わかりづらいのもぶっちゃけアリですがw
■ ■ ■
■Repositoryファイル作成
「model」フォルダ配下「BuylistRepository.java」
※id指定でDeleteしようとした名残が残ってます
public class BuylistRepository {
private BuylistDao mBuylistDao;
private LiveData<List<Buylist>> mAllBuylists;
//コンストラクタ
public BuylistRepository(Application application) {
AppDatabase db = AppDatabase.getDatabase(application);
mBuylistDao = db.buyListDao();
mAllBuylists = mBuylistDao.getAlphabetizedBuylists();
}
public LiveData<List<Buylist>> getAllBuylists() {
return mAllBuylists;
}
public void insert(Buylist buylist) {
AppDatabase.databaseWriteExecutor.execute(() -> {
mBuylistDao.insert(buylist);
});
}
public void delete(int id) {
AppDatabase.databaseWriteExecutor.execute(() -> {
mBuylistDao.delete(id);
});
}
public void deleteChk() {
AppDatabase.databaseWriteExecutor.execute(() -> {
mBuylistDao.deleteChk();
});
}
public void update(int id, boolean isChecked) {
AppDatabase.databaseWriteExecutor.execute(() -> {
mBuylistDao.update(id, isChecked);
});
}
}
private BuylistDao mBuylistDao;
private LiveData<List<Buylist>> mAllBuylists;
//コンストラクタ
public BuylistRepository(Application application) {
AppDatabase db = AppDatabase.getDatabase(application);
mBuylistDao = db.buyListDao();
mAllBuylists = mBuylistDao.getAlphabetizedBuylists();
}
public LiveData<List<Buylist>> getAllBuylists() {
return mAllBuylists;
}
public void insert(Buylist buylist) {
AppDatabase.databaseWriteExecutor.execute(() -> {
mBuylistDao.insert(buylist);
});
}
public void delete(int id) {
AppDatabase.databaseWriteExecutor.execute(() -> {
mBuylistDao.delete(id);
});
}
public void deleteChk() {
AppDatabase.databaseWriteExecutor.execute(() -> {
mBuylistDao.deleteChk();
});
}
public void update(int id, boolean isChecked) {
AppDatabase.databaseWriteExecutor.execute(() -> {
mBuylistDao.update(id, isChecked);
});
}
}
■ViewModelファイル修正
「ui\list」配下の「ListViewModel.java」
※赤字の部分は、自動作成されてたもともとのコードです
※extendsが「ViewModel」から「AndroidViewModel」に変わりました
public class ListViewModel extends AndroidViewModel {
private BuylistRepository mRepository;
private final LiveData<List<Buylist>> mAllBuylists;
private final MutableLiveData<String> mText;
public ListViewModel(Application application) {
super(application);
mRepository = new BuylistRepository(application);
mAllBuylists = mRepository.getAllBuylists();
mText = new MutableLiveData<>();
mText.setValue("This is list fragment");
}
LiveData<List<Buylist>> getAllBuylists() {
return mAllBuylists;
}
//リポジトリに追加の処理を依頼する
void insert(Buylist buylist) {
mRepository.insert(buylist);
}
//リポジトリに削除の処理を依頼する
void delete(int id) {
mRepository.delete(id);
}
//リポジトリにチェック済み削除の処理を依頼する
void deleteChk() {
mRepository.deleteChk();
}
//リポジトリに更新の処理を依頼する
void update(int id, boolean isChecked) {
mRepository.update(id, isChecked);
}
public LiveData<String> getText() {
return mText;
}
}
private BuylistRepository mRepository;
private final LiveData<List<Buylist>> mAllBuylists;
private final MutableLiveData<String> mText;
public ListViewModel(Application application) {
super(application);
mRepository = new BuylistRepository(application);
mAllBuylists = mRepository.getAllBuylists();
mText = new MutableLiveData<>();
mText.setValue("This is list fragment");
}
LiveData<List<Buylist>> getAllBuylists() {
return mAllBuylists;
}
//リポジトリに追加の処理を依頼する
void insert(Buylist buylist) {
mRepository.insert(buylist);
}
//リポジトリに削除の処理を依頼する
void delete(int id) {
mRepository.delete(id);
}
//リポジトリにチェック済み削除の処理を依頼する
void deleteChk() {
mRepository.deleteChk();
}
//リポジトリに更新の処理を依頼する
void update(int id, boolean isChecked) {
mRepository.update(id, isChecked);
}
public LiveData<String> getText() {
return mText;
}
}
■XMLにListView作成
ListViewで表示する1行の構成を「list_item.xml」ファイルに作成
※赤字の部分はクリックした行数取得するために必要
※更新するデータのidの保持方法が思いつかなかったので、行末に表示するために「txtId」作成
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:padding="4dp"
android:descendantFocusability="blocksDescendants">
<CheckBox
android:id="@+id/check_box"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="4dp"
android:layout_weight="1"
android:clickable="false"
android:focusable="false"
android:focusableInTouchMode="false"
android:text="買い物項目" />
<TextView
android:id="@+id/txtId"
android:layout_width="30dp"
android:layout_height="wrap_content"
android:text="(99)" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:padding="4dp"
android:descendantFocusability="blocksDescendants">
<CheckBox
android:id="@+id/check_box"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="4dp"
android:layout_weight="1"
android:clickable="false"
android:focusable="false"
android:focusableInTouchMode="false"
android:text="買い物項目" />
<TextView
android:id="@+id/txtId"
android:layout_width="30dp"
android:layout_height="wrap_content"
android:text="(99)" />
</LinearLayout>
「fragment_list.xml」ファイルにもListView追加
<LinearLayout
android:layout_width="200dp"
android:layout_height="match_parent"
android:orientation="vertical">
<ListView
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
android:layout_width="200dp"
android:layout_height="match_parent"
android:orientation="vertical">
<ListView
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
ついでに「fragment_list.xml」ファイルにも新規登録用のTextEditやボタン追加したXML(参考用)
<EditText
android:id="@+id/NewWordEdit"
android:layout_width="160dp"
android:layout_height="wrap_content"
android:ems="20"
android:inputType="text"
android:text="" />
<Button
android:id="@+id/btnAdd"
android:layout_width="160dp"
android:layout_height="100dp"
android:text="リスト追加" />
<Button
android:id="@+id/btnDelete"
android:layout_width="160dp"
android:layout_height="100dp"
android:layout_marginTop="6dp"
android:text="買い物おわり" />
android:id="@+id/NewWordEdit"
android:layout_width="160dp"
android:layout_height="wrap_content"
android:ems="20"
android:inputType="text"
android:text="" />
<Button
android:id="@+id/btnAdd"
android:layout_width="160dp"
android:layout_height="100dp"
android:text="リスト追加" />
<Button
android:id="@+id/btnDelete"
android:layout_width="160dp"
android:layout_height="100dp"
android:layout_marginTop="6dp"
android:text="買い物おわり" />
まとめ③に続く