【问题标题】:Android Expand and collapse for recyclerview is not working as expected回收器视图的 Android 展开和折叠未按预期工作
【发布时间】:2022-01-18 14:17:28
【问题描述】:

我正在开发一个带有可扩展 Recyclerview 的应用程序。但扩张并没有像预期的那样奏效。如果我在展开另一个项目后单击处于折叠状态的任何项目,则没有任何效果。如果单击任何其他项目,我想自动折叠以前展开的项目。

请查看我的相同代码:

final boolean isExpanded = position==mExpandedPosition;
holder.expandableLayout.setVisibility(isExpanded?View.VISIBLE:View.GONE);
holder.itemView.setActivated(isExpanded);
if (isExpanded) {
    previousExpandedPosition = position;

}
holder.itemView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {



        mExpandedPosition = isExpanded ? -1:position;
        notifyItemChanged(previousExpandedPosition);
        notifyItemChanged(position);



    }
});

如果我的实现有任何问题,请纠正我。

【问题讨论】:

  • 发生这种情况是因为您只是在通知当前项目,因此也请尝试通知之前的展开位置。
  • @Bhavin 更新了代码。也试过了。但有时如果随机点击项目,它会不起作用。
  • 我已经发布了一个答案尝试,否则我们会尝试一些不同的东西。而且我不明白你为什么要管理 previousExpandedPosition,因为如果管理不善,它会产生问题。并且可能有可能所选项目当前未显示在视图中,因此不会调用 onBindViewHolder 方法。

标签: android android-recyclerview android-adapter android-cardview android-expandable-list-view


【解决方案1】:

我猜你只是在通知你当前的项目,但不是已经扩展的旧项目,这导致了问题,所以应用如下更改。

....
holder.itemView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        int previousSelectedPosition = mExpandedPosition;
        mExpandedPosition = isExpanded ? -1:position;

        notifyItemChanged(position); // here we notified our current item   
        if (previousSelectedPosition != -1) 
           notifyItemChanged(previousSelectedPosition); // here we notified past item
    }
});
....

【讨论】:

  • 试过这个。这对于前两项工作正常,之后如果我单击其他项目,只会发生崩溃。如果没有展开行,则单击的项目正在展开。
【解决方案2】:

您不需要“previousExpandedPosition”:

private int mExpandedPosition = -1;
@Override
    public void onBindViewHolder(MyAdapter.MyViewHolder holder, final int position) {
        String str = mData.get(position);
        holder.mText.setText(str);
        
        final boolean isExpanded = position == mExpandedPosition;
        holder.expandableLayout.setVisibility( isExpanded ? View.VISIBLE : View.GONE);
        holder.itemView.setActivated(isExpanded);
        holder.itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    mExpandedPosition = isExpanded ? -1 : position;
                    notifyDataSetChanged();
                }
            });
    }

【讨论】:

  • 没有希望。还是一样的行为
  • 我使用了完全相同的代码,并且我的项目按预期展开和折叠。
猜你喜欢
  • 2020-01-14
  • 1970-01-01
  • 1970-01-01
  • 2012-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-02
  • 1970-01-01
相关资源
最近更新 更多