کار نکردن notifyItemtInserted

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

سلام..

موقعی که تسکی رو اد میکنم و با استفاده از اینترفیس هندلش میکنم همه چیز خوب پیش میره و هم داخل دیتابیس ذخیره میشه هم داخل لیست تسک هام توی ریسایکلر ویو، اما توی متد addTask موقعی که notifyItemInserted رو فراخونی میکنم، اتفاقی نمیوفته و آیتم رو نمایش نمیده، روی حالت دیباگم تست کردم، موقتی که این متد صدا زدهه میشه، متد  onbindeViewHolde هم داخل ادپتر صدا زده نمیشه..

بعضیا گفته بودن که متد setHasStableids مقدارشو true بزار درست میشه.. ولی حل نشد..

ممنون میشم کمکم کنین..

 

public void addTask(Task task) {
    tasks.add(0, task);
    notifyItemInserted(0);
}

 

@Override
public void onNewTask(Task task) {
    long taskId = taskDao.addTask(task);
    if (taskId != -1) {
        task.setId(taskId);
        myDayAdapter.addTask(task);
    }else {
        Log.e(TAG, "onNewTask: Error!");
    }
}

 

package com.example.tdo.Adapter;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.example.tdo.Model.Task;
import com.example.tdo.R;

import java.util.ArrayList;
import java.util.List;

public class MyDayAdapter extends RecyclerView.Adapter<MyDayAdapter.MyDayViewHolder> {
    private List<Task> tasks = new ArrayList<>();

    @NonNull
    @Override
    public MyDayViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_myday, parent, false);
        return new MyDayViewHolder(view);
    }

    public void addTask(Task task) {
        tasks.add(0, task);
        notifyItemInserted(0);
    }

    public void addItems(List<Task> tasks){
        this.tasks.addAll(tasks);
        notifyDataSetChanged();
    }

    @Override
    public void onBindViewHolder(@NonNull MyDayViewHolder holder, int position) {
        holder.onBind(tasks.get(position));
    }

    @Override
    public int getItemCount() {
        return tasks.size();
    }

    public class MyDayViewHolder extends RecyclerView.ViewHolder {

        private CheckBox checkBox;
        private TextView title;
        private TextView description;

        public MyDayViewHolder(@NonNull View itemView) {
            super(itemView);
            checkBox = itemView.findViewById(R.id.item_checkbox);
            title = itemView.findViewById(R.id.item_Title);
            description = itemView.findViewById(R.id.item_description);

            itemView.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    return false;
                }
            });
        }

        public void onBind(Task task){
            checkBox.setChecked(task.isCompleted());
            title.setText(task.getTitle());
            description.setText(task.getDescription());
        }
    }
}
فایل پیوست

0
حذف شده

سلام وقت بخیر ابولفضل جان

فرمت ارسال کدتون نا خوانا هست ممنون میشم از این به بعد با فرمت php ارسال کنید

مشکل :

public class TaskAdapter extends RecyclerView.Adapter<TaskAdapter.TaskViewHolder> {
    private List<Task> tasks = new ArrayList<>();
    private TaskItemEventListener eventListener;

    public TaskAdapter(TaskItemEventListener eventListener) {

        this.eventListener = eventListener;
    }

فیلد اینترفیس رو bind و اضافه نکردید.

موفق باشید

فایل پیوست

پوریا شفیعی

توسط

پوریا شفیعی

24 مهر 99

0
حذف شده

شرمنده.. چشم حتما

پوریاجان منظور منو اشتباه فهمیدین.. موقعی که من تسکی رو توی ریسایکل اد میکنم notifyItemInserted کار نمیکنه.. اون اینترفیسی که شما میگی بگیرمش توی کانستراکتور مال قسمت دیگه ایه..

دوباره کدهارو میزارم ببینید..

package com.example.tdo.Adapter;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CheckBox;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.example.tdo.Model.Task;
import com.example.tdo.R;
import com.example.tdo.View.Fragment.DialogATMyDay;
import com.example.tdo.View.Fragment.DialogCTMyDay;

import java.util.ArrayList;
import java.util.List;

public class MyDayAdapter extends RecyclerView.Adapter<MyDayAdapter.MyDayViewHolder> {
    private List<Task> tasks = new ArrayList<>();
    private DialogATMyDay.AddNewTask addNewTask;
    private DialogCTMyDay.RemoveQ removeQ;

    @NonNull
    @Override
    public MyDayViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_myday, parent, false);
        return new MyDayViewHolder(view);
    }

    public void addTask(Task task) {
        tasks.add(0, task);
        notifyItemInserted(0);
    }

    public void addItems(List<Task> tasks){
        this.tasks.addAll(tasks);
        notifyDataSetChanged();
    }

    public void deleteItems(){
        this.tasks.clear();
        notifyDataSetChanged();
    }

    @Override
    public void onBindViewHolder(@NonNull MyDayViewHolder holder, int position) {
        holder.onBind(tasks.get(position));
    }

    @Override
    public int getItemCount() {
        return tasks.size();
    }

    public class MyDayViewHolder extends RecyclerView.ViewHolder {

        private CheckBox checkBox;
        private TextView title;
        private TextView description;

        public MyDayViewHolder(@NonNull View itemView) {
            super(itemView);
            checkBox = itemView.findViewById(R.id.item_checkbox);
            title = itemView.findViewById(R.id.item_Title);
            description = itemView.findViewById(R.id.item_description);

            itemView.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {
                    return false;
                }
            });
        }

        public void onBind(Task task){
            checkBox.setChecked(task.isCompleted());
            title.setText(task.getTitle());
            description.setText(task.getDescription());
        }
    }
}

اینم یه دیالوگ هستش که اگه روی Create کلیک شه باید یه تسک ایجاد کنه و نمایشش بده

package com.example.tdo.View.Fragment;

import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AlertDialog;
import androidx.fragment.app.DialogFragment;

import com.example.tdo.Model.Task;
import com.example.tdo.R;
import com.google.android.material.button.MaterialButton;
import com.google.android.material.textfield.TextInputEditText;
import com.google.android.material.textfield.TextInputLayout;

public class DialogATMyDay extends DialogFragment {
    private AddNewTask callback;
    @Override
    public void onAttach(@NonNull Context context) {
        super.onAttach(context);
        callback= (AddNewTask) context;
    }

    @NonNull
    @Override
    public Dialog onCreateDialog(@Nullable Bundle savedInstanceState) {
        AlertDialog.Builder builder = new AlertDialog.Builder(getContext());
        View view = LayoutInflater.from(getContext()).inflate(R.layout.item_dialogadd, null, false);
        builder.setView(view);
        final TextInputEditText etAddTask = view.findViewById(R.id.dialog_etAddTask);
        final TextInputLayout etlAddTask = view.findViewById(R.id.dialog_etlTask);
        MaterialButton btnCreate = view.findViewById(R.id.dialog_BtnCreate);
        MaterialButton btnCancel = view.findViewById(R.id.dialog_BtnCancel);
        btnCreate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (etAddTask.length() > 0) {
                    Task task=new Task();
                    task.setTitle(etAddTask.getText().toString());
                    task.setCompleted(false);
                    task.setImportant(false);
                    callback.onNewTask(task);
                    dismiss();
                } else {
                    etlAddTask.setError("The field should not be empty");
                }
            }
        });
        btnCancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dismiss();
            }
        });
        return builder.create();
    }

    public interface AddNewTask {
        void onNewTask(Task task);
    }

}

من چک کردم، هیچ کدوم از متد های notify کار نمیکنه برام.. 

فایل پیوست

ابوالفضل رضایی

توسط

ابوالفضل رضایی

24 مهر 99

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

24 مهر 99

0
حذف شده

مشکل در کلاس MyDayAdapter هستش، من یه ادپتر دیگه برای پروژه درست کرده بودم طبق چیزی که میخواستم، و اون کار میکنه://// اون اسمش ImportantAdapter هستش..

بازم ببخشید باعث زحمت شدم.. 

لینک

فایل پیوست

ابوالفضل رضایی

توسط

ابوالفضل رضایی

24 مهر 99

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

24 مهر 99