2016-07-14 33 views
1

我花了兩天試圖找到解決方案,並找不到它的任何地方。我的問題是:我有一個列表視圖,其中每個項目有4個文本視圖和一個ImageView。我使用Volley從網站獲取數據。數據正常加載,當我向下滾動時,一切正常。問題是我回滾時。當我滾動圖像時,文本瀏覽會出現0.5延遲(首先看到最後一個項目的圖片),然後顯示內容。我已經嘗試與viewholder recyclerview和listview。這種「輕彈」在兩種解決方案中都存在。與複雜項目的列表視圖加載時具有微秒的延遲

public class BigCategoryListViewAdapter extends BaseAdapter{ 

    private Context context; 
    private String[] smallCatsList; 
    private News news; 
    private ImageLoader imageLoader; 

    static class myViewHolder{ 
    TextView smallCatName; 
    RelativeLayout spinner; 
    ImageView newsImageView; 
    TextView newsTitle; 
    TextView newsContent; 


} 

public BigCategoryListViewAdapter(Context context, String[] smallCatsList){ 
    this.context = context; 
    this.smallCatsList = smallCatsList; 
    this.imageLoader = ImageLoader.getInstance(); 
    if(!this.imageLoader.isInited()) { this.imageLoader.init(ImageLoaderConfiguration.createDefault(context));} 
} 

@Override 
public int getCount() { 
    return smallCatsList.length; 
} 

@Override 
public Object getItem(int position) { 
    return smallCatsList[position]; 
} 

@Override 
public long getItemId(int position) {return 0;} //modificar aqui 



@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    final myViewHolder mvh; 
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE); 



    convertView = inflater.inflate(R.layout.bigcat_listview,null); 

    mvh = new myViewHolder(); 

    mvh.smallCatName = (TextView) convertView.findViewById(R.id.bigcat_viewpager_smallcat); 
    mvh.spinner = (RelativeLayout) convertView.findViewById(R.id.spinner); 
    mvh.newsImageView = (ImageView) convertView.findViewById(R.id.bigcat_viewpager_imageView); 
    mvh.newsTitle = (TextView) convertView.findViewById(R.id.bigcat_viewpager_news_title); 
    mvh.newsContent = (TextView) convertView.findViewById(R.id.bigcat_viewpager_content); 
    convertView.setTag(mvh); 


    mvh.smallCatName.setText(smallCatsList[position]); 

    JSONObject params = new JSONObject(); 
    try{ 
     params.put("slug",smallCatsList[position]); 
     params.put("startIndex", 0); 
     params.put("endIndex", 0); 
    }catch (Exception e) { 
     Log.e(getClass().toString(), "Error setting params for communication with server"); 
     e.printStackTrace(); 
    } 

    Volley volley = Volley.getVolley(context); 
    volley.runRequest(Request.Method.POST, VolleyConstants.PROD_URL + VolleyConstants.NEWS_FETCH_ROUTE, 
     params, new Response.Listener<JSONObject>() { 
     //---------------------Volley------------------// 

    @Override 
     public void onResponse(JSONObject response) { 
      JSONArray responseArr = null; 
      try { 
       responseArr = response.getJSONArray("newsArr"); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

      for (int i = 0; i < responseArr.length(); i++) { 
       try { 
        JSONObject object = responseArr.getJSONObject(i); 
        String photoURLString = object.getString("photo"); 
        String titleString = object.getString("title"); 
        String publisherString = object.getString("publisher"); 
        String dateString = object.getJSONObject("date").getString("date"); 
        String contentString = object.getString("contents"); 
        String urlString = object.getString("url"); 

        news = new News(photoURLString, titleString, publisherString, dateString, contentString,urlString); 
       } catch (Exception e) { 
        news = new News("Unknown", "Unknown", "Unknown", "Unknown", "Unknown","Unknown"); 
       } 




      } 
      //tv2.setText(news.getNewsDate()); 

      mvh.newsContent.setText(news.getNewsContent()); 
      mvh.newsTitle.setText(news.getNewsHead()); 

      //---------------------Image Loading------------------// 
      try { 
       URL url = new URL(news.getNewsPic()); 
       imageLoader.loadImage(news.getNewsPic(), new ImageLoadingListener() { 
       @Override 
        public void onLoadingStarted(String imageUri, View view) { 

        } 

       @Override 
        public void onLoadingFailed(String imageUri, View view, FailReason failReason) { 

        } 

       @Override 
        public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { 
         mvh.newsImageView.setImageBitmap(loadedImage); 
         mvh.spinner.setVisibility(View.GONE); 
        } 

       @Override 
        public void onLoadingCancelled(String imageUri, View view) { 


        } 
       }); 
      }catch(Exception e){ 
       mvh.newsImageView.setImageDrawable(context.getResources().getDrawable(R.drawable.nopic)); 
       mvh.spinner.setVisibility(View.GONE); 

      } 


     } 
    }, new CustomErrorListener("ERROR")); 

    return convertView; 
} 

這是我的適配器。我的問題是,如果有辦法消除這個延遲來顯示內容?或者是我的網絡或列表視圖本身的問題? 我只是想加載所有的內容一次,然後用戶可以上下滾動,而無需每次刷新內容。

回答

0

每次調用getView時都會加載內容,這就是爲什麼它會像這樣加載。將Volley請求與getView分開,它應該完全位於適配器外部,不會每次調用列表中的每一部分。你有你的新聞對象,你可以傳遞一個ArrayList到適配器並從那裏填充它,這將解決你的加載問題。此外,您在主線程中調用抽象而不是新線程,您應該將兩者分開,並在完成加載的內容時填充ListView適配器。

0

一,ViewHolder模式的例子應該是更多的東西是這樣的:

if (convertView == null) { 
    convertView = inflater.inflate(R.layout.bigcat_listview,null); 

    mvh = new myViewHolder(); 
    //... rest of your code 
} else { 
    mvh = (myViewHolder) convertView.getTag(); 
    //... rest of your code 
} 

二,主要凌空裝載的東西不應該在適配器,但處理其他地方事先然後通過在這example應該有所幫助。你出了很多。