在RecyclerView中使用notifyDataSetChanged时保留Ripple效果

9
我开始修改我的应用程序以支持Lollipop。基本上,我有一个带有RecyclerView的文件浏览器片段。当用户打开此片段时,他将看到根目录上所有的文件夹。当用户点击文件夹时,我需要获取所有子文件夹和文件,并使用相同的RecyclerView将它们显示给用户,使用notifydatachanged方法。功能正常工作,问题是当用户单击文件夹时,波纹效果在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);
    }


}
1个回答

5
请看这里的答案:

https://dev59.com/VpHea4cB1Zd3GeqPveac#34523222

在您的onClick方法中(假设在回调中),请确保在notifyItemChanged(position)之后不要调用notifyDataSetChanged()notifyDataSetChanged()会与默认的波纹效果冲突。
new recyclerAdapter.ClickListener() {
    @Override
    public void onClick(int position) {

        ... awesome item onClick code ...

        notifyItemChanged(position);
        //notifyDataSetChanged(); <//--- Causes the no ripple bug
    }
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接