11

Ho un'attività che emette dati JSON da una lista. Ma ora voglio implementarlo in un frammento. In questo frammento voglio vederlo come gridview. E entrambi i file funzionano bene. ma quando ho provato ad implementare AsyncTask ho ottenuto diversi redflags come codice irraggiungibile. Qualcuno può aiutarmi con questo per favore?implementare AsyncTask in Fragment Android

Modificato: Nuova

public class SalesFragment extends Fragment { 
     GridView gridView; 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
       Bundle savedInstanceState) { 
      View gv = inflater.inflate(R.layout.hot_sales, null); 
      gridView = (GridView) gv.findViewById(R.id.grid_view); 
      bindGridview(); 
      return gv; 
     } 

     public void bindGridview() { 

      new MyAsyncTask(getActivity(),gridView).execute(""); 
     } 

     class MyAsyncTask extends AsyncTask<String, String, String> { 
      GridView mGridView; 
      Activity mContext; 
      Response response; 
      public MyAsyncTask(Activity context,GridView gview) { 
      this.mGridView=gview; 
      this.mContext=context; 
      } 

      protected String doInBackground(String... params) { 

       File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Android/data/sample.txt"); 
       if(file.exists()) { 
        try{ 
          Reader inputStreamReader = new InputStreamReader(new FileInputStream(file)); 

          Gson gson = new Gson(); 
          this.response = gson.fromJson(inputStreamReader, Response.class); 
         } catch (FileNotFoundException e) { 
          e.printStackTrace(); 
         } catch (@SuppressWarnings("hiding") IOException e){ 
          e.printStackTrace(); 
         } 
       }else{ 
        System.out.println("Error"); 
       } 
       return null; 
       } 

      @Override 
      protected void onPostExecute(String result) { 

       super.onPostExecute(result); 

       //List<HashMap<String,String>> aList = new ArrayList<HashMap<String,String>>(); 

       for(Sales sales : this.response.sales){ 
        HashMap<String, String> hm = new HashMap<String,String>(); 

        if (sales.getCategories1().contains("12")){ 
         //hm.put("sale_title", "" + sales.getShort_title()); 
         for(Shop shop : this.response.shops){ 
          String image_file = new String(Environment.getExternalStorageDirectory().getAbsolutePath() 
            + "/images/" + shop.getImage()); 
          if(shop.getId().equals(sales.getShop_id())){ 
           hm.put("shop_image", image_file); 
           System.out.println(shop_image); 
          } 
         } 

        if(hm.size()>0){ 
         gridView.setAdapter(new ImageAdapter(MainActivity.this,R.layout.grid_layout , imgArray, titleArray)); 
          } 
        } 
       } 



      } 
     } 
    } 

Come chiamare le immagini in GridView sull'immagine? Per favore aiuto.

+1

Forse pubblicare un po 'di codice? Qualsiasi numero di problemi può causare questo. – blaffie

+1

pubblica qui il tuo codice implementato ............ – Piyush

+0

@ Piyush Gupta & blaffie: il codice aggiunto ora. Voglio fare la stessa cosa dell'attività in frammento. – Kabe

risposta

20

C'è click qui crea asyntask entro frammento

nel codice posto frammento su activityCreateview

new MyAsyncTask(getActivity(), mListView).execute(""); 

getActivity() è metodo per comunicare con frammento e l'attività

in asynstak su post

context.mListView.setArrayAdapter(...........) 

qui è

public class SalesFragment extends Fragment { 
GridView gridView; 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View gv = inflater.inflate(R.layout.hot_sales, null); 
     gridView = (GridView) gv.findViewById(R.id.grid_view); 
     bindGridView() 
     return gv; 
     //return super.onCreateView(inflater, container, savedInstanceState); 
    } 

public void bindGridview() 
{ 

    new MyAsyncTask(getActivity(), gridView).execute(""); 
} 

class MyAsyncTask extends AsyncTask<String, String, String> 
{ 
    GridView mGridView; 
    Activity mContex; 
    public MyAsyncTask(Activity contex,GridView gview) 
    { 
    this.mGridView=gview; 
    this.mContex=contex; 
    } 

    protected String doInBackground(String... params) 
    { 

     //fetch data 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     { 

     for(Sales sales : this.response.sales){ 
      HashMap<String, String> hm = new HashMap<String,String>(); 

      if (sales.getCategories1().contains("12")){ 
       //hm.put("sale_title", "" + sales.getShort_title()); 
       for(Shop shop : this.response.shops){ 
        String image_file = new String(  Environment.getExternalStorageDirectory().getAbsolutePath() 
          + "/images/" + shop.getImage()); 
        if(shop.getId().equals(sales.getShop_id())){ 
         hm.put("shop_image", image_file); 
         System.out.println(shop_image); 
        } 
       } 
      } 
     } 
       if(hm.size()>0) 
       mcontext.mGridView.setAdapter(new ImageAdapter(mContext),hm); 
     } 

prima che i dati che vanno a prendere lo rendono modello come lista di array

public class ImageModel 
    { 
     String title; 
     String img; 
    } 


ArrayList<ImageModel> arrayList=new ArrayList<ImageModel>(); 

riempimento con i dati richiesti poi

mcontext.mGridView.setAdapter(new ImageAdapter(mContext),hm,arrayList); 

//in image adapter 

public class ImageAdapter extends ArrayAdapter<String> { 

public ImageAdapter(Context context, HashMap<String, String> hm,ArrayList<ImageModel> images) 
     { 
      super(context, R.layout.activity_t); 

     } 
//--code 
    } 

uso mappa hash in adattatore e assegnare le immagini con la posizione imposta dati e recupera valore dal modello

+0

Grazie. Il tuo codice ha aiutato per la mia domanda, ma ora ho un nuovo problema. Come potrei chiamare "shop_image" in una griglia? Ho modificato il mio post, per favore vedi il codice sopra. – Kabe

+0

puoi passare l'immagine o più immagini nel costruttore di adattatore ho modificato il codice vedi sopra –

+0

non ha funzionato. ottenere redflags su mcontext e ImageAdapter. – Kabe