سلام دوستان
من پروژه TodoList رو خواستم با معماری MVVM و بدون RXJava پیاده سازی کنم به یک مشکل برخوردم
هنگام اضافه کردن اطلاعات به اطلاعات قبلی اضافه میشن
به عنوان مثال : در لیست من یک نام ردیف ورزش در دیتابیس ذخیره هست
حالا من میخوام یک ردیف به این لیست اضافه کنم مثلا خرید کردن
در آپدیت لیست در همون لحظه اطلاعات جدید اضافه میشن اماهمون اطلاعات قبلی هم اضافه میشن یعنی در لیست ۲ ردیف ورزش قرار میگیرد و ۱ ردیف خرید کردن((مانند عکس ضمیمه)) و اگه از برنامه برم بیرون و دوباره برگردم به برنامه اطلاعات کاملا درست نمایش داده میشود اما در همون لحظه مشکل دارد
ممنون میشم اشکال کارمو بگین خودم خیلی گشتم ولی..’’’’
سورس کد ها:
کلاس Dao :
@Dao
public interface DataDao {
@Insert
long insert(ListModel listModel);
@Update
int update(ListModel listModel);
@Delete
int delete(ListModel listModel);
@Query("DELETE FROM tbl_contact")
void deleteAll();
@Query("SELECT * FROM tbl_contact")
LiveData<List<ListModel>> getList();
@Query("SELECT * FROM tbl_contact WHERE name LIKE '%' || :key || '%'")
List<ListModel> search(String key);
}
: Repository کلاس
public class Repository {
DataDao dataDao;
LiveData<List<ListModel>> listLiveData;
public Repository(Application application) {
DataBase dataBase=DataBase.getDataBase(application);
dataDao=dataBase.getDataDao();
listLiveData=dataDao.getList();
}
public void insert(ListModel listModel){
dataDao.insert(listModel);
}
public LiveData<List<ListModel>> getListLiveData(){
return listLiveData;
}
}
: viewModel
public class ViewModel extends AndroidViewModel {
Repository repository;
LiveData<List<ListModel>> models;;
public ViewModel(@NonNull Application application) {
super(application);
repository=new Repository(application);
models=repository.getListLiveData();
}
public void insert(ListModel listModel){
repository.insert(listModel);
}
}
: کلاس ادپتر
public class Adapter extends RecyclerView.Adapter<Adapter.Holder> {
List<ListModel> listModels=new ArrayList<>();
@NonNull
@Override
public Holder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view= LayoutInflater.from(parent.getContext()).inflate(R.layout.page_item,parent,false);
return new Holder(view);
}
@Override
public void onBindViewHolder(@NonNull Holder holder, int position) {
ListModel model=listModels.get(position);
holder.name.setText(model.getName());
holder.number.setText(model.getNumber());
}
@Override
public int getItemCount() {
return listModels.size();
}
public class Holder extends RecyclerView.ViewHolder{
TextView name,number;
ImageView delete,edit,call,sms;
public Holder(@NonNull View itemView) {
super(itemView);
name=itemView.findViewById(R.id.txt_name);
number=itemView.findViewById(R.id.txt_number);
delete=itemView.findViewById(R.id.delete);
edit=itemView.findViewById(R.id.edit);
call=itemView.findViewById(R.id.call);
sms=itemView.findViewById(R.id.sms);
}
}
public void getItem(List<ListModel> listLiveData){
this.listModels.addAll(listLiveData);
notifyDataSetChanged();
}
}
: کلاس اضافه کردن آیتم جدید
public class Add_Edit_Contact_Activity extends AppCompatActivity {
ImageView close;
EditText addname;
Button add;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_add__edite__contact);
close=findViewById(R.id.close);
addname=findViewById(R.id.add_name);
add=findViewById(R.id.btn_add);
add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
saveContact(v);
}
});
}
private void saveContact(View view){
String name=addname.getText().toString();
if (name.trim().length()>0){
Intent intent=new Intent();
intent.putExtra(Put.name,name);
setResult(RESULT_OK,intent);
finish();
}else {
Snackbar snackbar=Snackbar.make(view,"Please Enter The Name",Snackbar.LENGTH_LONG);
snackbar.show();
}
}
}
: MainActivity
public class MainActivity extends AppCompatActivity{
FloatingActionButton actionButton;
RecyclerView recyclerView;
Adapter adapter;
DataDao dataDao;
ViewModel viewModel;
TextView clear_all;
int REQUEST_ADD=1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findView();
setItem();
}
private void findView() {
actionButton=findViewById(R.id.add);
recyclerView=findViewById(R.id.recy_item);
clear_all=findViewById(R.id.clear_all);
onClick();
}
private void setItem() {
dataDao=DataBase.getDataBase(this).getDataDao();
LiveData<List<ListModel>> listModels=dataDao.getList();
adapter=new Adapter();
viewModel= ViewModelProviders.of(this).get(ViewModel.class);
viewModel.getAll().observe(this, new Observer<List<ListModel>>() {
@Override
public void onChanged(List<ListModel> listModels) {
adapter.getItem(listModels);
recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this,RecyclerView.VERTICAL,false));
recyclerView.setAdapter(adapter);
}
});
clear_all.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
viewModel.deleteAll();
}
});
}
private void onClick() {
actionButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent(MainActivity.this, Add_Edit_Contact_Activity.class);
startActivityForResult(intent,REQUEST_ADD);
}
});
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode==REQUEST_ADD && resultCode==RESULT_OK && data!=null){
String name=data.getStringExtra(Put.name);
ListModel listModel=new ListModel(name);
viewModel.insert(listModel);
}
}