2016-07-14 7 views
1

この問題の解決策を見つけるのに2日間を費やしていて、どこにも見つからなかった。私の問題は:私は、各項目が4つのテキストビューとImageViewを持っているリストビューを持っています。私はVolleyを使ってウェブサイトからデータを取得しています。データは正常にロードされ、スクロールダウンするとすべて正常に動作します。問題は、スクロールバックするときです。私が画像をスクロールしているときに、テキストビューに0.5遅延が表示されます(最初は最後の画像が表示されます)。次にコンテンツが表示されます。私はすでにrecyclerviewとviewholderで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をアダプターに渡してそこから入力することで、ロードの問題を修正できます。また、新しいスレッドではなくメインスレッドでvolleyを呼び出し、2つを分離して、読み込まれているコンテンツの完成時に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は役立つはずです。あなたはたくさん出ています。

関連する問題