【问题标题】:Expand/Collapse groups in expandable recyclerview在可展开的回收站视图中展开/折叠组
【发布时间】:2018-01-15 13:22:48
【问题描述】:

我正在使用this 库来实现可扩展的RecyclerView。我已经实现了它,它工作正常。但我想要的是只有当我点击一个特定的视图时,该组才应该展开。现在发生的事情是,如果我单击 RecyclerView 项目上的任意位置,该组就会展开。我有一个ImageView,当我单击该 ImageView 时,该组才会展开。我该如何实现?

RecyclerViewAdapter.java:

public class GenresSongAdapter extends ExpandableRecyclerViewAdapter<SongDetailsViewHolder, OptionViewHolder> {
    private Context mContext;
    public GenresSongAdapter(Context context, List<? extends ExpandableGroup> groups) {
        super(groups);
        mContext = context;
    }

    @Override
    public SongDetailsViewHolder onCreateGroupViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.row_song, parent, false);
        return new SongDetailsViewHolder(view);
    }

    @Override
    public OptionViewHolder onCreateChildViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.row_artists, parent, false);
        return new OptionViewHolder(view);
    }

    @Override
    public void onBindChildViewHolder(OptionViewHolder holder, int flatPosition, ExpandableGroup group, int childIndex) {
        ArtistsModel artistsModel = (ArtistsModel) group.getItems().get(childIndex);
        holder.ArtistText.setText(artistsModel.getArtistsName());
    }

    @Override
    public void onBindGroupViewHolder(SongDetailsViewHolder holder, int flatPosition, ExpandableGroup songInfo) {
        holder.setSongDetails(mContext, songInfo);
    }
}

SongDetailsViewHolder.java

class SongDetailsViewHolder extends GroupViewHolder {
    public TextView songName;
    public TextView artistName;
    public TextView duration;
    public ImageView iv_artwork;

    public SongDetailsViewHolder(View itemView) {
        super(itemView);
        songName = (TextView) itemView.findViewById(R.id.SongName);
        artistName = (TextView) itemView.findViewById(R.id.ArtistName);
        duration = (TextView) itemView.findViewById(R.id.duration);
        iv_artwork = (ImageView) itemView.findViewById(R.id.iv_artwork);
    }

    public void setSongDetails(Context mContext, ExpandableGroup songInfo) {
        if (songInfo instanceof SongInfo) {
            songName.setText(songInfo.getTitle());
            artistName.setText(((SongInfo) songInfo).getArtistName());
            duration.setText(((SongInfo) songInfo).getSongDuration());
            Picasso.with(mContext).load(((SongInfo) songInfo).getImageURI()).placeholder(R.drawable.ic_launcher).into(iv_artwork);
        }
    }
}

OptionViewHolder.java

class OptionViewHolder extends ChildViewHolder {
    TextView ArtistText;

    public OptionViewHolder(View itemView) {
        super(itemView);
        ArtistText = itemView.findViewById(R.id.ArtistText);
    }
}

【问题讨论】:

  • 随意修改 ExpandableRecyclerViewAdapter(不管它是什么)源以满足您的需求......最终请图书馆的作者这样做

标签: android android-recyclerview expandablerecyclerview


【解决方案1】:

我在这里做了一些猜测,因为我目前无法使用您的设置进行测试项目。

您不需要像@Selvin 建议的那样“修改”ExpandableRecyclerViewAdapter;就像你对GenresSongAdapter 所做的那样覆盖类就足够了。只需添加到这个类。我的方法需要两个步骤(但事实证明,这些步骤可以在一个方法中完成):

  1. 禁用内置的点击展开行为并
  2. OnGroupClickListener(其onGroupClick 回调封装了该行为)与ImageViews 连接起来。

我们禁用适配器的OnGroupClickListeners,首先不将它们设置为视图持有者(就像在父类中所做的那样)。因此,我们需要覆盖适配器的onCreateViewHolder() 方法,并简单地跳过设置监听器的命令。然而,在同样的方法中,我们可以得到一个视图持有者,包括它的所有成员。因此我们可以为每个视图持有者的ImageView附加一个监听器。

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    switch (viewType) {
        case ExpandableListPosition.GROUP:
            SongDetailsViewHolder sdvh = onCreateGroupViewHolder(parent, viewType);
            sdvh.iv_artwork.setOnGroupClickListener(this); 
            return sdvh;
        case ExpandableListPosition.CHILD:
            OptionViewHolder ovh = onCreateChildViewHolder(parent, viewType);
            return ovh;
        default:
            throw new IllegalArgumentException("viewType is not valid");
    }
}

您还必须避开GroupViewHolder 类设置的OnClickListeners,可能只需直接从RecyclerView.ViewHolder 扩展SongDetailsViewHolder

这是未经测试的代码,但我很确定至少这个想法是正确的:)

【讨论】:

  • 您好,感谢您抽出宝贵的时间,实际上我自己解决了这个问题。我做的和你差不多。我禁用了OnGroupClickListeners 并将这个toggle(layout) 添加到我的viewHolder。
猜你喜欢
  • 2012-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-13
  • 2017-11-24
  • 2010-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多