【问题标题】:How to implement mini equalizer on selected item of RecyclerView?如何在 RecyclerView 的选定项目上实现迷你均衡器?
【发布时间】:2020-08-18 18:52:23
【问题描述】:

我有一个 recyclerview,它的 listitem 设计如下

  • 线性布局(水平)
    • 图像视图
    • 文本视图
    • 图像按钮(播放按钮)
    • 均衡器视图(不可见)

现在,当我单击 PlayButton 时,它应该隐藏并显示均衡器,如果我滚动列表,均衡器应该只停留在选定的项目上。

但是,我面临的问题是 EqualizerView 以 10 个项目的间隔显示。也就是说,如果我点击第 3 项,则均衡器将显示在第 3、13 等等..

我正在使用这个https://github.com/claucookie/mini-equalizer-library-android 库来实现迷你均衡器。

public class StationViewAdapter extends RecyclerView.Adapter<StationViewAdapter.StationViewHolder> {

    List<Station> statons;
    final private ListItemClickListener mOnClickListener;

    public  StationViewAdapter (List<Station> s, ListItemClickListener l)
    {
        statons = s;
        mOnClickListener = l;
    }

    @NonNull
    @Override
    public StationViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item,parent,false);
        return new StationViewHolder(v);
    }

    @Override
    public void onBindViewHolder(@NonNull final StationViewHolder holder, int position) {

        Station station = statons.get(position);
        if(!station.getArtwork().isEmpty() && station.getArtwork() != null)
        {
            try{
                Picasso.get().load(Uri.parse(station.getArtwork()))
                       // .placeholder(R.mipmap.ic_launcher)
                        .into(holder.stationArtwork);
            } catch (Exception e) {
                e.printStackTrace();
                holder.stationArtwork.setImageResource(R.mipmap.ic_launcher);
            }
        }
        else
            holder.stationArtwork.setImageResource(R.mipmap.ic_launcher);
        holder.stationName.setText(station.getName());

    }


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

    public class StationViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        ImageView stationArtwork;
        TextView stationName;
        ImageButton stationPlayButton;
        EqualizerView equalizerView;
        int selectedItem;
        public StationViewHolder(@NonNull View itemView) {
            super(itemView);
            stationArtwork = itemView.findViewById(R.id.favicon);
            stationName = itemView.findViewById(R.id.text);
            stationPlayButton = itemView.findViewById(R.id.play_button);
            equalizerView = itemView.findViewById(R.id.equalizer_view);
            itemView.setOnClickListener(this);
            stationPlayButton.setOnClickListener(this);
            selectedItem = getAdapterPosition();
        }

        @Override
        public void onClick(View v) {
            int clickPosition = getAdapterPosition();
            Log.d(TAG, "onClick: "+getAdapterPosition());
            Log.d(TAG, "onClick: "+getLayoutPosition());
            Log.d(TAG, "onClick: "+getItemId());
            if(v == itemView) {
                mOnClickListener.onListItemClick(clickPosition);
            }else if(v == stationPlayButton)
            {

                    mOnClickListener.onListItemPlay(clickPosition,stationPlayButton,equalizerView);

            }

        }
    }
    public interface ListItemClickListener {
        void onListItemClick(int clickedItemIndex);
        void onListItemPlay(int clickItemIndex,ImageButton i,EqualizerView eq);
    }
}

这些是主活动中的 ClickListeners

@Override
public void onListItemClick(int clickedItemIndex) {

     if(mToast !=null)
     {
         mToast.cancel();
     }
     mToast = Toast.makeText(this,"Main Activity item clicked at position"+clickedItemIndex,Toast.LENGTH_SHORT);
     mToast.show();
}


@Override
public void onListItemPlay(int clickItemIndex,ImageButton i , EqualizerView eq) {

    i.setVisibility(View.GONE);
    eq.setVisibility(View.VISIBLE);
    eq.animateBars();

}

【问题讨论】:

  • 请提供代码 sn-p。看起来问题是使用 RecyclerView,而不是均衡器本身。
  • @IvanShafran 更新了代码。

标签: java android android-recyclerview selecteditem


【解决方案1】:

RecyclerView 重用 ViewHolder 实例。您需要在 onBindViewHolder 中使 ViewHolder 状态无效。在您的情况下,您至少应该隐藏 EqulizerView:

@Override
public void onBindViewHolder(@NonNull final StationViewHolder holder, int position) {
    equalizerView.setVisibility(View.INVISIBLE);
    ....
}

另外,您应该保存正在播放的歌曲以便稍后初始化 ViewHolder 状态。

更多信息请访问:https://developer.android.com/guide/topics/ui/layout/recyclerview#structure

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-25
    • 2017-09-05
    • 2016-07-14
    • 1970-01-01
    • 2011-07-18
    • 2019-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多