2017-03-21 13 views
0

私はMainActivityから呼び出されたフラグメントを持っています。このFragmentは、画像URLのJSONファイルを取得し、画像を画面に表示します。 私はFrescoライブラリを使用してこれらのイメージをダウンロードし、イメージリストビューとしてポップしました。画像はFrescoライブラリによって自動的にキャッシュされます。フラグメント内で押されたバックの画像キャッシュをクリアするには?

フラグメントからバックプレスを実行すると、キャッシュされたすべてのイメージが削除されます。私はあなたが何であったかと思います表示リスト方式

private void displayList() { 
    ArrayAdapter<gallery_adapter> adapter = new galleryAdapterList(); 
    list.setAdapter(adapter); 
} 

public class galleryAdapterList extends ArrayAdapter<gallery_adapter> { 

    galleryAdapterList() { 
     super(context, R.layout.gallery_item, gallery_adapterList); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 

     if (convertView == null) { 
      LayoutInflater inflater = LayoutInflater.from(context); 
      convertView = inflater.inflate(R.layout.gallery_item, parent, false); 
     } 

     gallery_adapter current = gallery_adapterList.get(position); 


     TextView mText=(TextView) convertView.findViewById(R.id.galleryText); 
     mText.setText(current.getText()); 


     uri = Uri.parse(current.getUrl()); 
//code to remove images from cache 
     ImagePipeline imagePipeline = Fresco.getImagePipeline(); 
     imagePipeline.evictFromCache(uri);  
//code ends here 


     SimpleDraweeView mImage = (SimpleDraweeView) convertView.findViewById(R.id.galleryImage); 
     mImage.setImageURI(uri); 


     return convertView; 
    } 

} 

答えて

1

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 

    View view = inflater.inflate(R.layout.fragment_gallery, container, false); 
    private List<gallery_adapter> gallery_adapterList = new ArrayList<>(); 
    ListView list = (ListView) view.findViewById(R.id.galleryList); 

    gallery_adapterList.clear(); 
    if(isNetworkConnected()){ 
     new galleryImages().execute("http://www.myurl.json"); 
    }else 
     Toast.makeText(context,"No Internet Connection!",Toast.LENGTH_SHORT).show(); 

    return view; 
} 






public class galleryImages extends AsyncTask<String, String, String> { 

    HttpURLConnection connection; 
    BufferedReader reader; 

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     try { 
      URL url = new URL(params[0]); 
      connection = (HttpURLConnection) url.openConnection(); 
      InputStream stream = connection.getInputStream(); 
      reader = new BufferedReader(new InputStreamReader(stream)); 
      StringBuilder builder = new StringBuilder(); 
      String line; 
      while ((line = reader.readLine()) != null) { 
       builder.append(line); 
      } 
      String str = builder.toString(); 
      return str; 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(String s) { 
     super.onPostExecute(s); 
     if(s!=null){ 


      try { 
       JSONObject parent = new JSONObject(s); 
       JSONArray images = parent.getJSONArray("images"); 

       if(images!=null){ 

        for(int i=0; i<images.length();i++){ 
         JSONObject child = images.getJSONObject(i); 
         gallery_adapterList.add(new gallery_adapter(child.getString("url"),child.getString("text"))); 
        } 
        displayList(); 

       }else 
        Toast.makeText(context,"error",Toast.LENGTH_SHORT).show(); 

      } catch (JSONException e) { 
       Toast.makeText(context, "Images not yet added. Try later",Toast.LENGTH_SHORT).show(); 
      } 


     }else 
      Toast.makeText(context, "Images not yet added. Try later",Toast.LENGTH_SHORT).show(); 
    } 
} 
イメージがダウンリストユーザーがスクロールなど、すぐにキャッシュされていないので、ユーザーが

フラグメントでbackPressを行ったとき、私はすべての画像をアンキャッシュしたいですそれは thisですが、なぜ私はキャッシュをクリアしたいのですか?次回は、ユーザーが、彼はJSONレスポンスを待つ必要があるアクティビティを開いているので、再び以下

0

は、あなたがそうすることができるオプションです。

1.Youは断片でbackpressイベントをキャッシュし、クリアするためにあなたの関数を呼び出すことができますキャッシュイメージ、Handle Back Press

2.トラックの断片化は、onAttach(Context)と書かなければなりません。FragmentManager.addOnBackStackChangedListener(); addtoBackStackでフラグメントを追加した場合に呼び出されます。

+0

このメソッドはMainActivity権限で呼び出されますか?では、MainActivityのURLリストを入手して、キャッシュされないようにする方法を教えてください。 –

+0

Applicationクラスを使用してURLのリストを取得したり、フラグメントとアクティビティの通信を宣言することができます。 – Herry

+0

Thanks @Herry。詳細を取得するためにApplicationクラスを使用し、画像を表示するためにフラグメントに送信 –

関連する問題