پروژه TodoList با معماری MVVM بدون RXJava

پرسیده شده
فعالیت 983 روز پیش
دیده شده 394 بار
0

سلام دوستان

من پروژه 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);

        }

    }
فایل پیوست

مهدی رستمی پور
مهدی رستمی پور

26 مرداد 00

0
حذف شده

نام گذاری تابع تون خوب نیست.

کد زیر رو

public void getItem(List<ListModel> listLiveData){
        this.listModels.addAll(listLiveData);
        notifyDataSetChanged();
    }

با کد زیر جابجا کنید و نام متد هم مناسب انتخاب کنید

public void getItem(List<ListModel> listLiveData){
        this.listModels = listLiveData
        notifyDataSetChanged();
    }
فایل پیوست

میلاد عزیززاده گلنگشی

توسط

میلاد عزیززاده گلنگشی

27 مرداد 00

0
حذف شده

سلام وقت بخیر

اگه با خارج و وارد شدن به اپلیکیشن مشکل حل میشه بنابراین مشکل از آداپتر هست دقت کنید شما وقتی هر دیتایی به دیتابیس وارد میکنید چون از لایو دیتا استفاده کردین به ویو مدل اطلاع داده میشه و ویو مدل هم اونا رو به جایی که observe شده پاس میده یعنی ویو و ویو هم در نهایت اونا رو در آداپتر خودش نمایش میده شما نباید اطلاعات دریافتی از لایو دیتا رو اد کنید به recycler view باید اطلاعات رو روی آداپتر ست کنید و dataSetChanged رو کال کنید

فایل پیوست

میلاد عزیززاده گلنگشی

توسط

میلاد عزیززاده گلنگشی

26 مرداد 00

حذف شده
سلام خب سورس کد ادپتر که در پرسش گذاشتم همین کار رو در آخرین تابع انجام دادم
مهدی رستمی پور

26 مرداد 00

حذف شده
الان مشکلتون حل نشده؟
حذف شده
خیر بدون معماری که کاملا درست انجام دادم اما میخوام با معماری MVVM پیاده سازی کنم این مشکل نمیدونم از کجاست پیش میاد
مهدی رستمی پور

27 مرداد 00

حذف شده
کد اصلاح شده رو فرستادم براتون در صورت برطرف شدن مشکل اطلاع دهید