0

커서 어댑터에서 활주를 사용하여 수천 개의보기를로드합니다. 그들은 모두 디스크에서로드 된 작은 이미지를 가지고 있습니다 (모두 10kb 미만). 그러나 나는 얼어 붙는 문제가 글라이드 라이브러리에서 오는 것 (그러나 그것은 커서로 인해 발생할 수 있습니다). 아래 코드와 로그 파일을 첨부했습니다.Glide로 RecyclerView 고정

관련 CursorAdapter 번호 :

public FilesFragmentCursorAdapter(Activity context, Cursor cursor, Bucket bucket) { 
     super(context, cursor, 0); 
     mContext = context; 
     this.cursor = cursor; 
     mBucket = bucket; 
     mSelectedItemsIds = new SparseBooleanArray(); 
     downloader = new ThumbnailDownloader(mContext, mBucket); 
     manager = GlideApp.with(mContext); 
     inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     mShowThumbnails = mContext.getSharedPreferences(Constants.PREFS, Context.MODE_PRIVATE).getBoolean(Constants.PREFS_SHOW_THUMBNAILS, false); 
    } 

    @Override 
    public Object getItem(int position) { 
     return super.getItem(position); 
    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup viewGroup) { 
     return LayoutInflater.from(context).inflate(R.layout.list_file_item, viewGroup, false); 
    } 

    @Override 
    public void bindView(View view, Context context, Cursor cursor) { 
     FileViewHolder holder = new FileViewHolder(); 

     holder.mId = view.findViewById(R.id.list_file_id); 
     holder.mName = view.findViewById(R.id.list_file_name); 
     holder.mSize = view.findViewById(R.id.list_file_size); 
     holder.mCreated = view.findViewById(R.id.list_file_date); 
     holder.image = view.findViewById(R.id.list_file_image); 
     holder.container = view.findViewById(R.id.list_file_item); 

     String id = cursor.getString(cursor.getColumnIndex(KEY_PID)); 
     String name = cursor.getString(cursor.getColumnIndex(KEY_NAME)); 
     long size = cursor.getLong(cursor.getColumnIndex(KEY_SIZE)); 
     String created = cursor.getString(cursor.getColumnIndex(KEY_CREATED_AT)); 
     String mimeType = cursor.getString(cursor.getColumnIndex(KEY_MIME)); 

     if (id != null) holder.mId.setText(id); 
     if (name != null) holder.mName.setText(name); 
     String fileSize = Formatter.formatFileSize(mContext, size); 
     holder.mSize.setText(fileSize); 
     if (created != null && created.length() > 10) { 
      String fileCreatedDate = created.substring(0, 10); 
      holder.mCreated.setText(fileCreatedDate); 
     } 
     if (mimeType != null) { 
      if (mimeType.contains("image")) { 
       holder.image.setImageResource(R.drawable.ic_image_black_48dp); 
       if (mShowThumbnails) { 
        String thumbnailPath = cursor.getString(cursor.getColumnIndex(KEY_THUMBNAIL)); 
        if (!TextUtils.isEmpty(thumbnailPath)) { 
         manager.load(thumbnailPath).skipMemoryCache(true).diskCacheStrategy(DiskCacheStrategy.NONE).into(holder.image); 
        } else { 
         File current = DatabaseHelper.createFileFromCursor(cursor); 
         downloader.download(current); 
        } 
       } 
      } else if (mimeType.contains("video")) { 
       holder.image.setImageResource(R.drawable.ic_videocam_black_48dp); 
      } else if (mimeType.contains("text")) { 
       holder.image.setImageResource(R.drawable.ic_text_format_black_48dp); 
      } else if (mimeType.contains("audio")) { 
       holder.image.setImageResource(R.drawable.ic_audiotrack_black_48dp); 
      } else { 
       holder.image.setImageResource(R.drawable.ic_insert_drive_file_black_48dp); 
      } 
     } 
    } 

로그 : 논의

12-28 21:47:17.212 27355-27450/co.intellidev.storj E/Parcel: fcntl(F_DUPFD_CLOEXEC) failed in Parcel::read, i is 0, fds[i] is -1, fd_count is 1, error: Too many open files 
12-28 21:47:20.150 27355-27752/co.intellidev.storj E/libEGL: error creating cache file /data/user_de/0/co.intellidev.storj/code_cache/com.android.opengl.shaders_cache: Too many open files (24) 
12-28 21:50:02.744 27355-27450/co.intellidev.storj E/GraphicBuffer: unflatten: registerBuffer failed: Unknown error -5 (5) 
12-28 21:50:02.748 27355-27450/co.intellidev.storj E/Surface: dequeueBuffer: IGraphicBufferProducer::requestBuffer failed: 5 
12-28 21:50:02.752 27355-27450/co.intellidev.storj E/Parcel: fcntl(F_DUPFD_CLOEXEC) failed in Parcel::read, i is 1, fds[i] is -1, fd_count is 2, error: Too many open files 
12-28 21:50:02.752 27355-27450/co.intellidev.storj E/Surface: dequeueBuffer: IGraphicBufferProducer::requestBuffer failed: -22 
12-28 21:50:02.754 27355-27450/co.intellidev.storj E/Parcel: fcntl(F_DUPFD_CLOEXEC) failed in Parcel::read, i is 1, fds[i] is -1, fd_count is 2, error: Too many open files 
12-28 21:50:02.754 27355-27450/co.intellidev.storj E/Surface: dequeueBuffer: IGraphicBufferProducer::requestBuffer failed: -22 
+0

은 전체 recyclerview 클래스를 제공합니다. – Aks4125

+0

어댑터 레이아웃에서 활주를 사용할 때 listview가 실제로 앱을 고정시킵니다. 대신 recyclerview를 사용하십시오. – AloDev

+0

@ Aks4125 사용자 정의 recyclerview 클래스가 아닙니다 –

답변

0

... 따라

public class FilesFragmentCursorAdapter extends RecyclerView.Adapter<FilesFragmentCursorAdapter.FileViewHolder > { 
/* objects */ 
public FilesFragmentCursorAdapter(Activity context, Cursor cursor, Bucket bucket) { 
    mContext = context; 
    this.cursor = cursor; 
    mBucket = bucket; 
    mSelectedItemsIds = new SparseBooleanArray(); 
    downloader = new ThumbnailDownloader(mContext, mBucket); 
    manager = GlideApp.with(mContext); 
    inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    mShowThumbnails = mContext.getSharedPreferences(Constants.PREFS, Context.MODE_PRIVATE).getBoolean(Constants.PREFS_SHOW_THUMBNAILS, false); 
} 


@Override 
public FilesFragmentCursorAdapter.FileViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View itemView = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.list_file_item, parent, false); 
    return new FileViewHolder(itemView); // <- render view here 
} 

@Override 
public void onBindViewHolder(FilesFragmentCursorAdapter.FileViewHolder holder, final int position) { 
    String id = cursor.getString(cursor.getColumnIndex(KEY_PID)); 
    String name = cursor.getString(cursor.getColumnIndex(KEY_NAME)); 
    long size = cursor.getLong(cursor.getColumnIndex(KEY_SIZE)); 
    String created = cursor.getString(cursor.getColumnIndex(KEY_CREATED_AT)); 
    String mimeType = cursor.getString(cursor.getColumnIndex(KEY_MIME)); 


    if (id != null) holder.mId.setText(id); 
    if (name != null) holder.mName.setText(name); 

} 



@Override 
public int getItemCount() { 
    return contactsList.size(); 
} 

public class FileViewHolder extends RecyclerView.ViewHolder { 
    private TextView mId; 
    private TextView mName; 
    private TextView mSize; 
    // so on 
    public FileViewHolder (View view) { 
     super(view); 
     mId = view.findViewById(R.id.list_file_id); 
     mName = view.findViewById(R.id.list_file_name); 
     mSize = view.findViewById(R.id.list_file_size); 
     // so on 


    } 
} 
} 

업데이트 어댑터 클래스입니다.


캐시를 건너 뛰고 캐시에 저장하지 않는 이유가 궁금합니다.

manager.load(thumbnailPath).skipMemoryCache(true).diskCacheStrategy(DiskCacheStrategy.NONE).into(holder.image); 

변경하여 원본 이미지가 아닌 캐시 된 이미지를 캐시 할 수 있습니다.

manager.load(thumbnailPath).diskCacheStrategy(DiskCacheStrategy.RESULT).into(holder.image); 
+0

덕분에 기술적으로이 질문에 답하는 지연이 크게 줄어 들었습니다. 너무 많은 파일 오류에 대한 새로운 질문을 열어야합니다. –

+0

@DreamersOrg 예 .. 가능한 경우 링크를 보내주십시오. – Aks4125