Android 在recyclerview中更改notifydatachanged期间保留连锁反应
我开始修改我的应用程序以支持棒棒糖。基本上,我有一个带有recyclerview的文件浏览器片段,当用户打开该片段时,他将看到其根目录上的所有文件夹,当用户单击文件夹时,我需要获取所有子文件夹+文件,并使用相同的recyclerview和notifydatachanged向用户显示它们。功能正常工作问题在于,当用户单击文件夹时,在更改期间不会保留连锁反应 文件\u item.xmlAndroid 在recyclerview中更改notifydatachanged期间保留连锁反应,android,android-recyclerview,ripple,Android,Android Recyclerview,Ripple,我开始修改我的应用程序以支持棒棒糖。基本上,我有一个带有recyclerview的文件浏览器片段,当用户打开该片段时,他将看到其根目录上的所有文件夹,当用户单击文件夹时,我需要获取所有子文件夹+文件,并使用相同的recyclerview和notifydatachanged向用户显示它们。功能正常工作问题在于,当用户单击文件夹时,在更改期间不会保留连锁反应 文件\u item.xml <TextView xmlns:android="http://schemas.android.com/ap
<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);
}
}
公共类RecycleAdapter扩展了RecyclerView.Adapter{
私有列表数据;
私人语境(private Context)(私人语境);;
私有IFileListener\u侦听器;
公共RecycleAdapter(上下文、列表数据、IFileListener侦听器){
_数据=数据;
_上下文=上下文;
_监听器=监听器;
}
公共无效设置数据(列表数据)
{
_数据=数据;
notifyDataSetChanged();
}
@凌驾
公共CustomViewHolder onCreateViewHolder(视图组视图组,int i){
View View=LayoutInflater.from(_context).flate(R.layout.file_项,视图组,false);
CustomViewHolder viewHolder=新CustomViewHolder(视图);
返回视图持有者;
}
@凌驾
BindViewHolder上的公共无效(CustomViewHolder CustomViewHolder,int i){
最终项目文件=_data.get(i);
//设置文本视图标题
customViewHolder.textView.setText(文件名);
customViewHolder.textView.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
_onFileClickListener(文件名);
}
});
//customViewHolder.textView.setOnTouchListener(新视图.OnTouchListener(){
//@覆盖
//公共布尔onTouch(视图v,运动事件){
//
//开关(event.getActionMasked())
// {
//case MotionEvent.ACTION\u UP:
//_listener.onFileClickListener(文件名);
//中断;
// }
//返回false;
// }
// });
//customViewHolder.textView.setOnTouchListener(新视图.OnTouchListener(){
//@TargetApi(Build.VERSION\u code.LOLLIPOP)
//@覆盖
//公共布尔onTouch(视图v,运动事件){
//v.getBackground().setHotspot(event.getX(),event.getY());
//
//返回(假);
// }
// });
如果(文件和文件夹){
customViewHolder.textView.SetCompoundDrawable SwithinInstructBounds(
R.drawable.directory_图标,0,0,0);
}否则{
customViewHolder.textView.SetCompoundDrawable SwithinInstructBounds(
R.drawable.file_图标,0,0,0);
}
}
@凌驾
public int getItemCount(){
返回值(null!=\u data?\u data.size():0);
}
公共类CustomViewHolder扩展了RecyclerView.ViewHolder
{
受保护的文本视图文本视图;
公共CustomViewHolder(视图){
超级(视图);
this.textView=(textView)view.findViewById(R.id.file\u name);
}
}
公共接口IFileListener
{
公共void onFileClickListener(字符串文件);
}
}
在这里查看答案: 在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
}
};
new recyclerAdapter.ClickListener(){
@凌驾
公共void onClick(内部位置){
…很棒的物品点击代码。。。
(职位)变更;
//notifyDataSetChanged();