在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