【问题标题】:Recyclerview not getting updatedRecyclerview 没有更新
【发布时间】:2019-01-17 17:46:25
【问题描述】:

我正在尝试使用 notifyDataSetChanged() 更新 recyclerview,但 recyclerview 没有得到更新,我知道在堆栈溢出时有很多类似的问题被问及我尝试了其中的大部分,但在我的情况下似乎没有任何效果;

当数据第一次进入片段时,我正在为适配器创建一个对象并将其设置为运行良好的 recyclerview,但是下次当适配器已经初始化时,我试图通知适配器,它给了我一个即使提供的列表不为空,也可以清空 recyclerview。

请提出建议。

回收站查看代码

 private void showStateList(List<State> states) {
        if (states != null) {
            this.lstStates = states;
            if(stateAdapter == null){
                LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
                linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
                stateFragmentBinding.stateRecyclerView.setLayoutManager(linearLayoutManager);

                stateFragmentBinding.stateRecyclerView.addItemDecoration(new DividerItemDecoration(stateFragmentBinding.stateRecyclerView.getContext(),
                        linearLayoutManager.getOrientation()));
                stateFragmentBinding.stateRecyclerView.setHasFixedSize(true);

                stateAdapter = new StateAdapter(lstStates, this);
                stateFragmentBinding.stateRecyclerView.setAdapter(stateAdapter);
            }
            else{
                stateAdapter.notifyDataSetChanged(lstStates);
            }
        }

    }

适配器代码:

   class StateAdapter extends RecyclerView.Adapter<StateViewHolder> {
    private LayoutInflater inflater;
    private StateClickListener stateClickListener;
    private List<State> lstStateItem;

    public StateAdapter(List<State> lstStateItem, StateClickListener stateClickListener) {
        this.lstStateItem = lstStateItem;
        this.stateClickListener = stateClickListener;
    }

    @NonNull
    @Override
    public StateViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int position) {
        if (inflater == null)
            inflater = LayoutInflater.from(viewGroup.getContext());
        StateAdapterBinding stateAdapterBinding = StateAdapterBinding.inflate(inflater, viewGroup, false);
        return new StateViewHolder(stateAdapterBinding, stateClickListener);
    }

    @Override
    public void onBindViewHolder(@NonNull StateViewHolder stateViewHolder, int position) {
        State state = lstStateItem.get(position);
        stateViewHolder.bind(state, position);
    }

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

    public void notifyDataSetChanged(List<State> states) {
        List<State> tempList = new ArrayList<>(states);
        lstStateItem.clear();
        lstStateItem.addAll(tempList);
        this.notifyDataSetChanged();
    }
}

ViewHolder 类

 class StateViewHolder extends RecyclerView.ViewHolder {
    private StateAdapterBinding stateAdapterBinding;
    private StateClickListener stateClickListener;

    StateViewHolder(StateAdapterBinding stateAdapterBinding, StateClickListener stateClickListener) {
        super(stateAdapterBinding.getRoot());
        this.stateAdapterBinding = stateAdapterBinding;
        this.stateClickListener = stateClickListener;
    }

    public void bind(State state, int position) {
        stateAdapterBinding.executePendingBindings();
        stateAdapterBinding.setStateModel(state);
        stateAdapterBinding.setStateHandler(stateClickListener);
        stateAdapterBinding.getRoot().setTag(R.id.lnrHome, position);
        stateAdapterBinding.getRoot().setTag(state);
    }

【问题讨论】:

  • 发布适配器的完整代码。
  • 问题不完整..发布您的适配器代码...
  • 发布了完整的适配器代码@Kannan_SJD
  • 发布了完整的适配器代码@DeepPatel
  • @Praneshsaw :检查我的答案并尝试一下

标签: android android-recyclerview


【解决方案1】:

试试这个:将您的数据更新方法名称更改为 updateDataSet 并试一试

回收站查看代码:

private void showStateList(List<State> states) {
        if (states != null) {
            this.lstStates = states;
            if (stateAdapter == null) {
                LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
                linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
                stateFragmentBinding.stateRecyclerView.setLayoutManager(linearLayoutManager);

                stateFragmentBinding.stateRecyclerView.addItemDecoration(new DividerItemDecoration(stateFragmentBinding.stateRecyclerView.getContext(),
                        linearLayoutManager.getOrientation()));
                stateFragmentBinding.stateRecyclerView.setHasFixedSize(true);

                stateAdapter = new StateAdapter(lstStates, this);
                stateFragmentBinding.stateRecyclerView.setAdapter(stateAdapter);
            } else {
                stateAdapter.updateDataSet(lstStates);
            }
        }
    }

适配器代码:

class StateAdapter extends RecyclerView.Adapter<StateViewHolder> {
    private LayoutInflater inflater;
    private StateClickListener stateClickListener;
    private List<State> lstStateItem = new ArrayList<>();;

    public StateAdapter(List<State> lstStateItem, StateClickListener stateClickListener) {
        this.lstStateItem.addAll(lstStateItem);
        this.stateClickListener = stateClickListener;
    }

    @NonNull
    @Override
    public StateViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int position) {
        if (inflater == null)
            inflater = LayoutInflater.from(viewGroup.getContext());
        StateAdapterBinding stateAdapterBinding = StateAdapterBinding.inflate(inflater, viewGroup, false);
        return new StateViewHolder(stateAdapterBinding, stateClickListener);
    }

    @Override
    public void onBindViewHolder(@NonNull StateViewHolder stateViewHolder, int position) {
        State state = lstStateItem.get(position);
        stateViewHolder.bind(state, position);
    }

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

    public void updateDataSet(List<State> states) {
        this.lstStateItem.clear();
        this.lstStateItem.addAll(states);
        notifyDataSetChanged();
    }
}

查看持有人代码:

class StateViewHolder extends RecyclerView.ViewHolder {
    private StateAdapterBinding stateAdapterBinding;
    private StateClickListener stateClickListener;

    StateViewHolder(StateAdapterBinding stateAdapterBinding, StateClickListener stateClickListener) {
        super(stateAdapterBinding.getRoot());
        this.stateAdapterBinding = stateAdapterBinding;
        this.stateClickListener = stateClickListener;
    }

    public void bind(State state, int position) {
        stateAdapterBinding.setStateModel(state);
        stateAdapterBinding.setStateHandler(stateClickListener);
        stateAdapterBinding.getRoot().setTag(R.id.lnrHome, position);
        stateAdapterBinding.getRoot().setTag(state);
        stateAdapterBinding.executePendingBindings();
    }

【讨论】:

  • 试过但类似的问题!!
  • 请立即查看
  • 最后一次尝试。其他一切看起来都很好。如果仍然无法正常工作,则必须逐步调试以检查数据丢失的位置。
【解决方案2】:

尝试使用:

 your_binding_instance.executePendingBindings()

你的viewholder类应该是这样的:

    class ViewHolder(binding) extends RecyclerView.ViewHolder(binding.root){
    bind(item){
    bindnig.item = item
    binding.executePendingBindings()
    }
}

【讨论】:

  • 因为你使用数据绑定..我认为一旦列表更新后强制回收视图执行挂起的绑定很重要!
  • 我已经给了 stateAdapterBinding.executePendingBindings();在 onCreateViewHolder 但无法解决问题。
  • 你在哪里叫这个?
  • 在适配器内部;我想我必须在我的视图中调用它,即片段
  • 不..我尝试更改 showStateList() 方法,但它开始工作不知道如何...只是弄清楚...
【解决方案3】:

我已通过以下代码更改了 showStateList 方法,如果有人有更好的解决方案,请发布:

   private void showStateList(List<State> states) {
    if (states != null) {
        this.lstStates = states;
        if(stateAdapter == null){
            stateAdapter = new StateAdapter(lstStates, this);
        }
        else {
            stateAdapter.notifyStateChanged(lstStates);
        }
        stateFragmentBinding.stateRecyclerView.setAdapter(stateAdapter);
    }

}

【讨论】:

  • 每次都需要设置适配器...任何其他解决方案将不胜感激。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多