سلام..
موقعی که تسکی رو اد میکنم و با استفاده از اینترفیس هندلش میکنم همه چیز خوب پیش میره و هم داخل دیتابیس ذخیره میشه هم داخل لیست تسک هام توی ریسایکلر ویو، اما توی متد 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()); } } }
سلام وقت بخیر ابولفضل جان
فرمت ارسال کدتون نا خوانا هست ممنون میشم از این به بعد با فرمت 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 و اضافه نکردید.
موفق باشید
شرمنده.. چشم حتما
پوریاجان منظور منو اشتباه فهمیدین.. موقعی که من تسکی رو توی ریسایکل اد میکنم 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 کار نمیکنه برام..
مشکل در کلاس MyDayAdapter هستش، من یه ادپتر دیگه برای پروژه درست کرده بودم طبق چیزی که میخواستم، و اون کار میکنه://// اون اسمش ImportantAdapter هستش..
بازم ببخشید باعث زحمت شدم..