2017-08-01 15 views
1

問題:リサイクルの項目を事前に読み込んで、ユーザーに最高のユーザーエクスペリエンスを与える方法。Preload StaggeredGridLayoutManagerを使用したRecyclerviewアイテム

見つけたblogLinearLayoutManagerではなく、StaggeredGridLayoutManagerと同じことをしています。

メソッドsetExtraLayoutSpaceおよびsetInitialPrefetchItemCount(int)は、StaggeredGridLayoutManager APIでは不安定です。

ユーザーの操作性を向上させるためにスクロールする前に、どのようにitems(images)を読み込むことができますか。

+0

を持って

void StartImageCacheService(Context context, LinkedList<com.fayvo.Model.Trending> trendingHash) { if (context != null && trendingHash.size() > 0) { Intent i = new Intent(context, ImageCache.class); i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); i.putParcelableArrayListExtra(Constants.CacheKey, new ArrayList<com.fayvo.Model.Trending>(trendingHash)); i.putExtra(Constants.IncomingClass, "Trending"); context.startService(i); } } 

優れたユーザー体験を提供するには、このための任意の解決策を得るのですか? – Rose

答えて

0

これは完璧な方法ではありませんが、それでも機能します。

ユーザが スクロールして新しい投稿を読み込むと、バックグラウンドで画像を読み込み/キャッシュするインテントサービスを作成すると、サーバに の代わりにキャッシュから取得されます。

ImageCahce.java

public class ImageCache extends IntentService { 

    Context mContext; 

    public ImageCache() { 
     super("ImageCache"); 
    } 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     mContext = this; 
     Log.d("ImageCache", "Service Started"); 
    } 

    @Override 
    protected void onHandleIntent(@Nullable Intent intent) { 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     if (intent != null) 
      if (intent.getStringExtra(Constants.IncomingClass) != null) 
       if (intent.getStringExtra(Constants.IncomingClass).equalsIgnoreCase("Trending")) { 
        ArrayList<Trending> items = intent.getExtras().getParcelableArrayList(Constants.CacheKey); 
        StartCachingImages(items); 
       } 
     return START_NOT_STICKY; 
    } 

    //Trending logic 
    private void StartCachingImages(final ArrayList<Trending> items) { 

     if (items != null) { 
      if (!items.isEmpty()) { 
       for (int i = 0; i < items.size(); i++) { 

        Post pogo = items.get(i).postObj; 
        String imagePath = ""; 
        if (pogo.type.equalsIgnoreCase("Picture")) { 
         imagePath = pogo.picture; 
        } else if (pogo.type.equalsIgnoreCase("Video")) { 
         imagePath = pogo.thumbnail; 
        } else if (pogo.type.equalsIgnoreCase("Multimedia")) { 
         // imagePath = pogo.thumbnail; 
         if (pogo.picture.length() > 0) imagePath = pogo.picture; 
         else imagePath = pogo.thumbnail; 
        } 

        //Log.d("ImageCache", "index " + i + " started"); 
        BackgroundCaching backgroundCaching = new BackgroundCaching(i, imagePath, items.get(i).userObj.picture); 
        backgroundCaching.execute(); 
       } 
       //Log.d("ImageCache", "Self stopping"); 
       ImageCache.this.stopSelf(); 
      } 
     } 
    } 

    class BackgroundCaching extends AsyncTask<String, Void, String> { 

     String path, thumbnail; 
     int id; 

     public BackgroundCaching(int id, String path, String thumbnail) { 
      this.id = id; 
      this.path = path; 
      this.thumbnail = thumbnail; 
     } 

     @Override 
     protected String doInBackground(String... params) { 
      try { 
       FutureTarget<File> future = Glide.with(mContext).load(path) 
         .downloadOnly(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL); 
       future.get(); 
       //Log.d("ImageCache", "Loaded actual " + id); 
      } catch (Exception e) { 
       //Log.d("ImageCache", "Failed to load ->" + path); 
      } 
      try { 
       FutureTarget<File> future = Glide.with(mContext).load(thumbnail) 
         .downloadOnly(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL); 
       future.get(); 

       //Log.d("ImageCache", "Loaded thumbnail " + id); 
      } catch (Exception e) { 
       //Log.d("ImageCache", "Failed to load ->" + thumbnail); 
      } 
      return "Executed"; 
     } 
    } 

    @Override 
    public void onDestroy() { 
     super.onDestroy(); 
     Log.d("ImageCache", "Service Stopped"); 
    } 
} 

サービスを開始するStartImageCacheService()を使用しています。私は

関連する問題