在recyclerview中的notifydatachanged期间保留涟漪效应 [英] retain ripple effect during notifydatachanged in recyclerview
问题描述
我开始修改我的应用程序以支持棒棒糖.基本上,我有一个带有recyclerview的文件浏览器片段,当用户打开该片段时,他将看到其根目录中的所有文件夹,当用户单击该文件夹时,我需要获取所有子文件夹+文件并将它们显示给用户使用具有notifydatachanged的同一recyclerview.该功能正常工作的问题是,当用户单击文件夹时,notifydatachanged期间不会保留波纹效果.
I am started to modify my application to support lollipop. Basically, I have a file browser fragment with recyclerview, When the user opens this fragment he will see all the folders on his root directory, when the user will click on the folder I need to get all the subfolders + files and show them to the user using the same recyclerview with notifydatachanged. The functionality working properly the problem is when the user clicks a folder the ripple effect is not retained during 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()
.
In your onClick method (assuming in your callback), make sure you do not call notifyDataSetChanged()
after notifyItemChanged(position)
.
notifyDataSetChanged()
将与那些默认的波纹效果发生冲突.
notifyDataSetChanged()
will conflict with those default ripple effects.
new recyclerAdapter.ClickListener() {
@Override
public void onClick(int position) {
... awesome item onClick code ...
notifyItemChanged(position);
//notifyDataSetChanged(); <//--- Causes the no ripple bug
}
};
这篇关于在recyclerview中的notifydatachanged期间保留涟漪效应的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!