交错GridView布局中的重新排序问题

时间:2018-01-30 05:37:38

标签: android android-layout android-fragments android-recyclerview staggered-gridview

使用交错的GridView布局时遇到问题。从列表中删除元素后,交错网格视图中的项目不能正确地重新排列。我的意思是,他们在他们上面留下了很多空的空间。

以下是删除之前和之后的一些图片,

之前:

PICTURE1

之后:

PICTURE2

再来一次:

PICTURE3

但在我关闭应用程序并再次打开它之后,它们会正确地重新排序。

这是我的代码, 片段:

public class TaskListFragment extends Fragment {

public static final String TAG = TaskListFragment.class.getSimpleName();

private FragmentTaskListBinding mBinding;

private TaskViewModel viewModel;

private TaskListAdapter taskListAdapter;

private List<TaskEntity> entityList;

private StaggeredGridLayoutManager layoutManager;

public TaskListFragment() {
    // Required empty public constructor
}

public static TaskListFragment instantiate() {
    return new TaskListFragment();
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    mBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_task_list,
            container, false);
    mBinding.setFabClick(clickCallback);
    layoutManager = new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);
    mBinding.taskListRecyclerView.setItemAnimator(new DefaultItemAnimator());
    mBinding.taskListRecyclerView.setLayoutManager(layoutManager);
    return mBinding.getRoot();
}

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    viewModel = ViewModelProviders.of(this)
            .get(TaskViewModel.class);
    subscribeUi(viewModel);
}

private void subscribeUi(TaskViewModel viewModel) {
    viewModel.loadTasks().observe(this, taskEntities -> {
        if (taskEntities != null) {
            setListData(taskEntities);
        }
    });
    mBinding.executePendingBindings();
}

private void setListData(List<TaskEntity> taskEntities) {
    this.entityList = taskEntities;
    taskListAdapter = new TaskListAdapter();
    taskListAdapter.setTaskList(entityList);
    mBinding.taskListRecyclerView.setAdapter(taskListAdapter);
    ItemTouchHelper itemTouchHelper = new ItemTouchHelper(createHelperCallback());
    itemTouchHelper.attachToRecyclerView(mBinding.taskListRecyclerView);
}

private final FabClickCallback clickCallback = new FabClickCallback() {
    @Override
    public void onFabClick() {
        if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED)) {
            ((MainListActivity) getActivity()).start();
        }
    }
};

private ItemTouchHelper.SimpleCallback createHelperCallback() {
    return new SwipeToDelete() {
        @Override
        public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
            int position = viewHolder.getAdapterPosition();
            viewModel.deleteTask(entityList.get(position));

            entityList.remove(position);
            taskListAdapter.notifyItemRemoved(position);
        }
    };

}
}

适配器:

public class TaskListAdapter extends RecyclerView.Adapter<TaskListAdapter.TaskViewHolder> {

private List<? extends Task> mTasks;

public TaskListAdapter() {
}

public void setTaskList(List<? extends Task> tasks) {
    if (mTasks == null) {
        mTasks = tasks;
        notifyItemRangeInserted(0, mTasks.size());
    } else {
        DiffUtil.DiffResult result = DiffUtil.calculateDiff(new DiffUtil.Callback() {
            @Override
            public int getOldListSize() {
                return mTasks.size();
            }

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

            @Override
            public boolean areItemsTheSame(int oldItemPosition, int newItemPosition) {
                return mTasks.get(oldItemPosition).getTId() ==
                        tasks.get(newItemPosition).getTId();
            }

            @Override
            public boolean areContentsTheSame(int oldItemPosition, int newItemPosition) {
                Task newTask = tasks.get(newItemPosition);
                Task oldTask = mTasks.get(oldItemPosition);
                return newTask.getTId() == oldTask.getTId()
                        && Objects.equals(newTask.getTaskName(), oldTask.getTaskName())
                        && Objects.equals(newTask.getTaskDescription(), oldTask.getTaskDescription());
            }
        });
        mTasks = tasks;
        result.dispatchUpdatesTo(this);
    }
}

@Override
public TaskViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    TaskItemBinding mBinding = DataBindingUtil.inflate(
            LayoutInflater.from(parent.getContext()), R.layout.task_item,
            parent, false);
    return new TaskViewHolder(mBinding);
}

@Override
public void onBindViewHolder(TaskViewHolder holder, int position) {
    holder.mBinding.setTask(mTasks.get(position));
}

@Override
public int getItemCount() {
    return mTasks == null ? 0 : mTasks.size();
}

static class TaskViewHolder extends RecyclerView.ViewHolder {

    final private TaskItemBinding mBinding;

    public TaskViewHolder(TaskItemBinding taskItemBinding) {
        super(taskItemBinding.getRoot());
        mBinding = taskItemBinding;
    }
}
}

1 个答案:

答案 0 :(得分:0)

编辑:我找到了问题的答案。

我一直在创建一个新的适配器并将其设置为setListData()方法中的recyclerview,而不是将它们放在onCreateView方法中。将这两行代码移到onCreateView修复了我的问题。