RecyclerView не раздувает, а обновляет тот же вид? - PullRequest
0 голосов
/ 08 июня 2018

У меня есть задание по реализации списка дел, содержащего обзор переработчика, где каждый элемент представляет собой флажок и текстовое представление, и каждая задача добавляется из текста редактирования.Он хранит данные, используя Realm.io.Я продолжаю понимать, что единственный элемент в обзоре переработчиков просто обновляется, а не раздувается!Пожалуйста, помогите.

TasksActivity -

public class TasksActivity extends AppCompatActivity implements View.OnClickListener{

    TextView courseTitle;
    RecyclerView TaskList;
    EditText addTask;
    Button addButton;

    String transName; //Transferred Course name from MainActivity


    TaskAdapter TA;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tasks);

        courseTitle = findViewById(R.id.CourseName);
        TaskList = findViewById(R.id.TaskListRV);
        TaskList.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false));


        addTask = findViewById(R.id.InputTask);
        addButton = findViewById(R.id.AddTaskButton);

        //Course name is the obtained from the previous acivity.

        transName =getIntent().getExtras().getString("CourseName");
        courseTitle.setText(transName);

        TA = new TaskAdapter(transName);
        TaskList.setAdapter(TA);

        addButton.setOnClickListener(this);

    }

    @Override
    public void onClick(View view) {

        String task = addTask.getText().toString();

        // Checking if the text is empty.

        boolean flag = false;
        for(int i = 0;i<task.length();i++)
        {
            if(task.charAt(i)!=' ')
                flag = true;
        }

        if(!flag || task.equals(""))
        {
            Toast emptyWarning = Toast.makeText(getApplicationContext(),"Task cannot be Empty!",Toast.LENGTH_SHORT);
            emptyWarning.show();
        }
        else
        {
            addTask.setText("");
            TA.addNewTask(task);

        }
    }

}

TasksAdapter -

public class TaskAdapter extends RecyclerView.Adapter<TaskViewHolder> implements RealmChangeListener<RealmResults<TaskModel>>
{

    private ArrayList<TaskModel> TaskList;
    private String course;
    private final Realm realm;



        public TaskAdapter(String course)
        {
            this.course = course;

            this.TaskList = new ArrayList<>();
            realm = Realm.getDefaultInstance();
            loadTaskData();
        }

        void loadTaskData()
        {
            RealmResults<TaskModel> taskModelRealmResults = realm.where(TaskModel.class).equalTo("courseName",course).findAll();
            taskModelRealmResults.addChangeListener(this);

            for(TaskModel iTM : taskModelRealmResults)
            {
                TaskList.add(realm.copyFromRealm(iTM));
            }
            notifyDataSetChanged();

        }

        @Override
        public TaskViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
            View view= layoutInflater.inflate(R.layout.item_task,parent,false);

            TaskViewHolder Tvh = new TaskViewHolder(view);
            return Tvh;
        }

        @Override
        public void onBindViewHolder(TaskViewHolder holder, int position) {
            holder.populateTask(TaskList.get(position));

        }

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

        public void addNewTask(String task)
        {
            TaskModel newTaskObj = new TaskModel(task,course,false);

            TaskList.add(newTaskObj);
            notifyDataSetChanged();

            realm.beginTransaction();
            realm.insertOrUpdate(newTaskObj);
            realm.commitTransaction();

        }


        @Override
        public void onChange(RealmResults<TaskModel> taskModels) {

            taskModels = realm.where(TaskModel.class).equalTo("courseName",course).findAll();
            this.TaskList = new ArrayList<>();

            for(TaskModel iTM : taskModels)
            {
                this.TaskList.add(realm.copyFromRealm(iTM));
            }
            notifyDataSetChanged();
        }

    }

TaskViewHolder и TaskModel - (на случай, если они вам могут понадобиться)

public class TaskModel extends RealmObject {

    String task;

    @PrimaryKey
    String courseName;

    boolean isDone;

    public TaskModel() {
        task = "";
        courseName = "";
        isDone = false;
    }

    public TaskModel(String task, String courseName, boolean isDone) {
        this.task = task;
        this.courseName = courseName;
        this.isDone = isDone;
    }


    public String getTask() {
        return task;
    }

    public void setTask(String task) {
        this.task = task;
    }

    public boolean isDone() {
        return isDone;
    }

    public void setDone(boolean done) {
        isDone = done;
    }
}

public class TaskViewHolder extends RecyclerView.ViewHolder  {

    CheckBox isdone;
    TextView Taskname;


    public TaskViewHolder(View itemView) {
        super(itemView);

        isdone = itemView.findViewById(R.id.TaskCheckBox);
        Taskname = itemView.findViewById(R.id.TaskName);

    }

    void populateTask(final TaskModel T)
    {
        Taskname.setText(T.getTask());
        isdone.setChecked(T.isDone());

        isdone.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
                T.setDone(isdone.isChecked());
            }
        });
    }

}

Ответы [ 2 ]

0 голосов
/ 15 июля 2018

ОП здесь.Я закончил тем, что использовал стандарт ReacyclerView.Adapter.Проблема была в использовании метода Realm insertOrUpdate, когда @PrimaryKey был courseName, что, таким образом, заставляло его действительно обновлять тот же объект, а не создавать новый!insert() должен был быть использован.Вот метод вставки задачи -

  public void addNewTask(String task)
{
    boolean flag = false;

    for(int i = 0;i<TaskList.size();i++)
    {
        if(task.equals(TaskList.get(i).getTask()))
        {
            Toast.makeText(context,"Task already exists!",Toast.LENGTH_SHORT).show();
            flag = true;
            break;
        }
    }
    if(!flag)
    {
        TaskModel newTaskObj = new TaskModel();
        newTaskObj.setTask(task);
        newTaskObj.setDone(false);
        newTaskObj.setCourseName(course);

        TaskList.add(newTaskObj);
        notifyDataSetChanged();

        realm.beginTransaction();
        realm.insert(newTaskObj);
        realm.commitTransaction();
    } }

Весь проект можно найти здесь, проверьте его - https://github.com/Hariram-R/ToDoList-App

0 голосов
/ 18 июня 2018

Я советую вам использовать Realm Android dapter , этот адаптер заботится об обновлении пользовательского интерфейса вашего приложения.Не нужно реализовывать OnChangeListener, ваш список будет автоматически обновляться после вставки, удаления или редактирования

Используйте findAllAsync , чтобы не блокировать поток пользовательского интерфейса

OrderedRealmCollection<TaskModel> taskModels = realm.where(TaskModel.class).equalTo("courseName", course).findAllAsync();

public RealmAdapter(OrderedRealmCollection<TaskModel> data) {
    super(data, true);
}

РЕДАКТИРОВАТЬ:

Также всегда делайте процесс, используя Async метод, когда это возможно.Вы можете заменить ваш addNewTask метод на:

public void addNewTask(String task) {
     final TaskModel newTaskObj = new TaskModel(task, course, false);

     realm.executeTransactionAsync(new Realm.Transaction() {
        @Override
        public void execute(Realm realm) {
            realm.copyToRealmOrUpdate(newTaskObj);
        }
     });
}

Yous должен иметь что-то вроде этого:

TasksActivity

public class TasksActivity extends AppCompatActivity implements View.OnClickListener {

    private EditText addTask;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tasks);

        String transName = getIntent().getExtras().getString("CourseName");

        TextView courseTitle = findViewById(R.id.CourseName);
        courseTitle.setText(transName);

        addTask = findViewById(R.id.InputTask);

        findViewById(R.id.AddTaskButton).setOnClickListener(this);

        OrderedRealmCollection<TaskModel> taskModels = Realm.getDefaultInstance().where(TaskModel.class).equalTo("courseName", transName).findAllAsync()
        TaskAdapter adapter = new TaskAdapter(this, taskModels);

        RecyclerView taskList = findViewById(R.id.TaskListRV);
        taskList.setLayoutManager(new LinearLayoutManager(this));
        taskList.setAdapter(adapter);
    }

    @Override
    public void onClick(View view) {

        String task = addTask.getText().toString().trim();

        if (task.trim().isEmpty()) {
            Toast emptyWarning = Toast.makeText(getApplicationContext(),"Task cannot be Empty!",Toast.LENGTH_SHORT);
            emptyWarning.show();
            return;
        }

        addTask.setText("");
        addNewTask(task);
    }

    private void addNewTask(String task) {
        final TaskModel newTaskObj = new TaskModel(task, course, false);
        realm.executeTransactionAsync(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {
                realm.copyToRealmOrUpdate(newTaskObj);
            }
        });
    }
}

И TaskAdapter :

public class TaskAdapter extends RealmRecyclerViewAdapter<TaskModel, TaskViewHolder> {

    private LayoutInflater layoutInflater

    public TaskAdapter(Context context, OrderedRealmCollection<TaskModel> taskModels) {
        super(taskModels, true);

        this.layoutInflater = LayoutInflater.from(context);
    }

    @Override
    public TaskViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return new TaskViewHolder(layoutInflater.inflate(R.layout.item_task , parent, false));
    }

    @Override
    public void onBindViewHolder(TaskViewHolder holder, int position) {
        holder.populateTask(getItem(position));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...