java - ImageView 上的涟漪效应未触发

标签 java android android-layout android-recyclerview material-design

我有一个 RecyclerView,每个项目都有 ImageView

我为 onBindViewHolder 中的 ImageView 设置了 onClickListener 如下:

holder.starIV.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            // TODO: logic
        }
    });

在我将以下逻辑添加到 onClick 之前,链式 react 效果很好。此逻辑更改 ImageViewDrawable

holder.starIV.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (v.getId() == holder.starIV.getId()) {
                ListItem clickedItem = mDataset.get(position);
                ListItem updatedItem = new ListItem(clickedItem);
                if (clickedItem.getStarState() == STAR_ON) {
                    updatedItem.setStarState(STAR_OFF);
                    updatedItem.setStarDrawable(
                        ContextCompat.getDrawable(
                            v.getContext(),R.drawable.ic_star_border_24px));
                }
                else if (clickedItem.getStarState() == STAR_OFF) {
                    updatedItem.setStarState(STAR_ON);
                    updatedItem.setStarDrawable(
                        ContextCompat.getDrawable(
                            v.getContext(),R.drawable.ic_star_24px));
                }
                mDataset.set(position,updatedItem);
                notifyDataSetChanged();
            }
        }
    });

现在,我完全没有链式 react 。这是 ImageView 的 XML:

<ImageView
    android:id="@+id/list_item_star"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:paddingLeft="4dp"
    android:paddingRight="16dp"
    android:src="@drawable/ic_star_border_24px"
    android:clickable="true"
    android:background="?attr/selectableItemBackgroundBorderless"
    android:drawSelectorOnTop="true"
/>

当我注释掉onClick中的逻辑部分时,涟漪效应再次正常工作。

我是否正确实现了上述内容?

为了使涟漪效应正常工作,您建议进行哪些更改?

编辑: 看来更改 Drawable 会干扰波纹动画。所以我将所有逻辑移动到一个 AsyncTask 并有一个小的延迟以允许动画完成。这似乎有效,但我觉得这个解决方案并不优雅。这是 AsyncTask:

    class DoLogix extends AsyncTask<Integer, Integer, Void> {
    @Override
    protected Void doInBackground(Integer... params) {
        try{Thread.sleep(125);}catch (Exception e) {}
        publishProgress(params[0]);
        return null;
    }

    protected void onProgressUpdate(Integer... val) {
        ListItem clickedItem = mDataset.get(val[0]);
        ListItem updatedItem = new ListItem(clickedItem);
        if (clickedItem.getStarState() == STAR_ON) {
            updatedItem.setStarState(STAR_OFF);
            updatedItem.setStarDrawable(starBorder);
        }
        else if (clickedItem.getStarState() == STAR_OFF) {
            updatedItem.setStarState(STAR_ON);
            updatedItem.setStarDrawable(star);
        }
        mDataset.set(val[0],updatedItem);
        notifyDataSetChanged();
    }
}

最佳答案

您可以将波纹可绘制对象设置为 ImageView 的前景。

关于java - ImageView 上的涟漪效应未触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38671427/

相关文章:

java - 将组件添加到 jPanel java

android - 选择菜单项时显示弹出窗口

android - 将 TextView 居中,同时将其保持在按钮右侧?

android - Samsung Galaxy Tab 7inch - 布局问题

java - 如何在不使用 autoIt 和机器人类的情况下使用 selenium webdriver 处理 IE 下载弹出窗口

java - LSA - 找到 SVD 后的步骤

java - 如何从 Intstream 创建 ArrayList

android - 如何加载 libandroid_runtime

java - 如何区分通知点击和通知按钮点击

android-studio - Android 3.3 和 ConstraintLayout 问题