2015-09-12 8 views
6

私はロリポップをサポートするようにアプリケーションを修正し始めました。基本的に私はrecyclerviewのファイルブラウザフラグメントを持っています。ユーザがこのフラグメントを開くと、ルートディレクトリのすべてのフォルダが表示されます。フォルダをクリックすると、すべてのサブフォルダ+ファイルを取得し、 notifydatachangedと同じrecyclerview。この問題を適切に機能させる機能は、ユーザーがフォルダをクリックすると、notifydatachangedの間に波及効果が保持されない場合です。は、recyclerviewでnotifydatanganged中に波紋効果を保持します

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 adapter: 
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); 
     } 


    } 

答えて

3

ここで答えをチェックアウト:(あなたのコールバックで想定して)あなたのonClickメソッドで

https://stackoverflow.com/a/34523222/1847734

を、あなたは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 
    } 
}; 
関連する問題