2017-07-24 3 views
0

J'essaye de télécharger l'image du serveur avec la volée et les montrer dans recyclerview. il fonctionne correctement mais l'image de téléchargement est très faible. (la taille de chaque image est d'environ 50 kb). que puis-je faire? est-il meilleur et optimiser le code que cela?retard dans le téléchargement de l'image du serveur avec la volée

c'est ma classe d'aide:

public class StartActivity { 

    // for recyclerView - downLoad Data 
    private static final int LIMIT = 6; 
    OnLoadMoreListener onLoadMoreListener; 
    int idImage = 1; 
    private List<StructUser> structList = new ArrayList<>(); 
    private AdapterUser adapter; 
    private int CURRENT_ITEM = 1; 
    private Context context; 
    private String TAG = StartActivity.class.getSimpleName(); 

    //---------------------------------------------------- 
    public StartActivity(Context context) { 
    this.context = context; 
    } 

    public void getDataAndSetInRecyclerView(RecyclerView recyclerView) { 
    loadData(CURRENT_ITEM); 
    recyclerView.setLayoutManager(new LinearLayoutManager(context)); 

    adapter = new AdapterUser(recyclerView, structList, context); 


    onLoadMoreListener = new OnLoadMoreListener() { 
     @Override 
     public void onLoadMore() { 

     structList.add(null); 
     adapter.notifyDataSetChanged(); 

     new Handler().postDelayed(new Runnable() { 
      @Override 
      public void run() { 
      structList.remove(structList.size() - 1); 
//   adapter.notifyItemRemoved(structList.size()); 
      loadData(CURRENT_ITEM); 
      } 
     }, 2000); 

     } 
    }; 

    adapter.setOnLoadMoreListener(onLoadMoreListener); 
    recyclerView.setAdapter(adapter); 
    } 

    private void loadData(final int CURRENT_ITEM) { 
    String url = Config.DATA_URL + CURRENT_ITEM; 
    JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(url, 
     new Response.Listener<JSONArray>() { 

     @Override 
     public void onResponse(JSONArray response) { 
      ActivityMain.hideProgressBar(); 
      try { 


      for (int i = 0; i < response.length(); i++) { 
       JSONObject jsonObject = response.getJSONObject(i); 
       StructUser structUser = new StructUser(); 


       if (!jsonObject.isNull(Config.TAG_TITLE)) 
       structUser.setNetworkImageView(jsonObject.getString(Config.TAG_TITLE)); 
       if (!jsonObject.isNull(Config.TAG_IMAGE_URL)) { 
       structUser.setNetworkImageView(Config.IMG_SERVER + idImage + ".png"); 
       idImage++; 
       } 
       structList.add(structUser); 


      } 
      adapter.notifyDataSetChanged(); 

      adapter.setLoaded(); 

      // not show progressBar at end of list when get all data 

      if (response.toString().contains("[]")) { 
       adapter.reachEndList(); 
       Toast.makeText(context, "not More Data to Show", Toast.LENGTH_SHORT).show(); 
      } 
      } catch (JSONException e) { 
      e.printStackTrace(); 
      } 
     } 
     }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
     // hide progressBar 
     ActivityMain.hideProgressBar(); 

     Log.e(TAG, "Login Error: " + error.getMessage()); 
     Toast.makeText(context, 
      error.getMessage(), Toast.LENGTH_LONG).show(); 

     } 
    }); 
    AppController.getInstance().addToRequestQueue(jsonArrayRequest, TAG); 
    this.CURRENT_ITEM = this.CURRENT_ITEM + LIMIT; 
    } 


} 

ceci est mon adaptateur:

public class AdapterUser extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 

    private final int VIEW_TYPE_ITEM = 0; 
    private final int VIEW_TYPE_LOADING = 1; 
    public int visibleThreshold = 2; 
    boolean isLoading; 
    private int lastVisibleItem, totalItemCount; 
    private List<StructUser> structList = new ArrayList<>(); 
    private OnLoadMoreListener mOnLoadMoreListener; 
    private Context context; 

    // load image from server ------------------------------------------------- 
    private static ImageLoader imageLoader = ImageLoader.getInstance(); 
    public static DisplayImageOptions options = new DisplayImageOptions.Builder() 
    .showImageOnLoading(R.mipmap.ic_cloud_download) 
    .showImageForEmptyUri(R.mipmap.ic_picture) 
    .showImageOnFail(android.R.drawable.ic_dialog_alert) 
    .cacheInMemory(true) 
    .cacheOnDisk(false) 
    .considerExifParams(true) 
    .bitmapConfig(Bitmap.Config.RGB_565) 
    .build(); 
    //--------------------------------------------------------------- 


    public AdapterUser(RecyclerView mRecyclerView, List<StructUser> structList, Context context) { 

    this.context = context; 
    this.structList = structList; 
    final LinearLayoutManager linearLayoutManager = (LinearLayoutManager) mRecyclerView.getLayoutManager(); 

    mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { 
     @Override 
     public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
     super.onScrolled(recyclerView, dx, dy); 
     totalItemCount = linearLayoutManager.getItemCount(); 
     lastVisibleItem = linearLayoutManager.findLastVisibleItemPosition(); 



     if (!isLoading && totalItemCount <= visibleThreshold + (lastVisibleItem)) { 
      if (mOnLoadMoreListener != null) { 
      mOnLoadMoreListener.onLoadMore(); 
      } 
      isLoading = true; 
     } 
     } 
    }); 
    } 


    public void setLoaded() { 
    isLoading = false; 
    } 

    public void reachEndList() { 
    isLoading = true; 
    } 

    //======================================================== 
    @Override 
    public int getItemViewType(int position) { 
    return structList.get(position) == null ? VIEW_TYPE_LOADING : VIEW_TYPE_ITEM; 
    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) { 
    if (viewType == VIEW_TYPE_ITEM) { 
     View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.adapter_start_activity , viewGroup, false); 
     return new UserViewHolder(view); 
    } else if (viewType == VIEW_TYPE_LOADING) { 
     View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.layout_loading_item, viewGroup, false); 
     return new LoadingViewHolder(view); 
    } 
    return null; 
    } 

    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
    if (holder instanceof UserViewHolder) { 
     UserViewHolder userViewHolder = (UserViewHolder) holder; 
     StructUser user = structList.get(position); 
     userViewHolder.title.setText(user.getTitle()); 

// load image from server 
     imageLoader.displayImage(user.getNetworkImageView(), userViewHolder.networkImageView, options); 




    } else if (holder instanceof LoadingViewHolder) { 
     LoadingViewHolder loadingViewHolder = (LoadingViewHolder) holder; 
     loadingViewHolder.progressBar.setIndeterminate(true); 
    } 
    } 

    @Override 
    public int getItemCount() { 
    return structList == null ? 0 : structList.size(); 
    } 

    public void setOnLoadMoreListener(OnLoadMoreListener mOnLoadMoreListener) { 
    this.mOnLoadMoreListener = mOnLoadMoreListener; 
    } 


    class UserViewHolder extends RecyclerView.ViewHolder { 
    public TextView title; 
    // for download & cash image 
    public ImageView networkImageView; 

    public UserViewHolder(View itemView) { 
     super(itemView); 
     title = (TextView) itemView.findViewById(R.id.txtTitle); 
     networkImageView = (ImageView) itemView.findViewById(R.id.networkImageView); 

    } 
    } 

    class LoadingViewHolder extends RecyclerView.ViewHolder { 
    public ProgressBar progressBar; 

    public LoadingViewHolder(View itemView) { 
     super(itemView); 
     progressBar = (ProgressBar) itemView.findViewById(R.id.progressBar1); 
    } 

    } 



} 
+0

J'envisagerais d'utiliser Picasso ou Glide lib. (et si les images ne changent pas, utilisez le cache pour les téléchargements) – fbwnd

Répondre

0

Utilisation Glide pour le téléchargement de l'image ...

Glide.with(ActivityName.this) 
.load(image_url) 
.into(imageView_object); 

Il téléchargera l'image et définir dans ImageView.

+0

J'utilise universalimageloader. –

+0

ne pas utiliser that..Use bibliothèque Glide pour le chargement de l'image.Il est très facile –