在notifydatachanged期间保持ripple效果在recyclerview

我开始修改我的应用程序来支持棒棒糖。 基本上,我有一个带有recyclerview的文件浏览器片段,当用户打开这个片段时,他会看到他的根目录中的所有文件夹,当用户点击文件夹时,我需要获取所有子文件夹+文件并将它们显示给用户使用与notifydatachanged相同的recyclerview。 该功能正常工作的问题是,当用户单击文件夹时,在notifydatachanged期间不会保留连锁效果。

file_item.xml

<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/file_name"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="?attr/selectableItemBackground"
    android:clickable="true"
    android:drawablePadding="15dp"
    android:ellipsize="marquee"
    android:focusable="true"
    android:gravity="center_vertical"
    android:minHeight="?android:attr/listPreferredItemHeight"
    android:paddingLeft="14dip"
    android:paddingRight="15dip"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:textColor="?android:attr/textColorAlertDialogListItem" />

Recyclerview适配器:

public class RecycleAdapter extends RecyclerView.Adapter<RecycleAdapter.CustomViewHolder>{

    private List<Item> _data;
    private Context _context;
    private IFileListener _listener;

    public RecycleAdapter(Context context, List<Item> data,IFileListener listener) {
        _data = data;
        _context = context;
        _listener = listener;
    }

    public void setData(List<Item> data)
    {
        _data = data;
        notifyDataSetChanged();
    }


    @Override
    public CustomViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(_context).inflate(R.layout.file_item, viewGroup,false);

        CustomViewHolder viewHolder = new CustomViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(CustomViewHolder customViewHolder, int i) {
        final Item file = _data.get(i);

        //Setting text view title
        customViewHolder.textView.setText(file._fileName);
        customViewHolder.textView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                _listener.onFileClickListener(file._fileName);
            }
        });
//            customViewHolder.textView.setOnTouchListener(new View.OnTouchListener() {
//                @Override
//                public boolean onTouch(View v, MotionEvent event) {
//
//                    switch (event.getActionMasked())
//                    {
//                        case MotionEvent.ACTION_UP:
//                            _listener.onFileClickListener(file._fileName);
//                            break;
//                    }
//                    return false;
//                }
//            });
//            customViewHolder.textView.setOnTouchListener(new View.OnTouchListener() {
//                @TargetApi(Build.VERSION_CODES.LOLLIPOP)
//                @Override
//                public boolean onTouch(View v, MotionEvent event) {
//                    v.getBackground().setHotspot(event.getX(), event.getY());
//
//                    return(false);
//                }
//            });


        if (file._isFolder) {
            customViewHolder.textView.setCompoundDrawablesWithIntrinsicBounds(
                    R.drawable.directory_icon, 0, 0, 0);
        } else {
            customViewHolder.textView.setCompoundDrawablesWithIntrinsicBounds(
                    R.drawable.file_icon, 0, 0, 0);
        }

    }

    @Override
    public int getItemCount() {
        return (null != _data ? _data.size() : 0);
    }



    public class CustomViewHolder extends RecyclerView.ViewHolder
    {
        protected TextView textView;

        public CustomViewHolder(View view) {
            super(view);
            this.textView = (TextView) view.findViewById(R.id.file_name);
        }
    }

    public interface IFileListener
    {
        public void onFileClickListener(String file);
    }


}

看看这里的答案:

https://stackoverflow.com/a/34523222/1847734

在onClick方法中(假设在回调中),请确保在notifyItemChanged(position)之后不要调用notifyDataSetChanged() notifyItemChanged(position)

notifyDataSetChanged()将与这些默认的纹波效果相冲突。

new recyclerAdapter.ClickListener() {
    @Override
    public void onClick(int position) {

        ... awesome item onClick code ...

        notifyItemChanged(position);
        //notifyDataSetChanged(); <//--- Causes the no ripple bug
    }
};
链接地址: http://www.djcxy.com/p/29067.html

上一篇: retain ripple effect during notifydatachanged in recyclerview

下一篇: Detecting 4K UHD screens on Android