在recyclerview中notifydatachange期间保留连锁反应

2024-05-13

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

文件项.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 https://stackoverflow.com/a/34523222/1847734

在您的 onClick 方法中(假设在您的回调中),请确保您不调用notifyDataSetChanged() after notifyItemChanged(position).

notifyDataSetChanged()将与那些默认的连锁反应相冲突。

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

        ... awesome item onClick code ...

        notifyItemChanged(position);
        //notifyDataSetChanged(); <//--- Causes the no ripple bug
    }
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在recyclerview中notifydatachange期间保留连锁反应 的相关文章

随机推荐