2016-04-01 8 views
0

Ich habe eine Gridview in meinem Fragment, das von einem BaseAdapter aufgefüllt wird.notifyDataSetChanged() funktioniert nicht mit GridView in Fragment

Das Problem ist, dass in meinem Adapter habe ich eine Lieblings-Taste, und wenn ich klicke ich möchte die Schaltfläche ändern. Aber die Logik in der API ist fertig, aber meine Schaltfläche ändert sich nur, wenn ich die Seite neu lade.

Ich versuchte mit adapter.notifyDataSetChanged(); aber hat nicht funktioniert.

Mein getView Adaptercode:

//Implementando os clicks 
    itemHolder.imgFavorito.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (!util.isLogado(context)) { 
       ((MainActivity) context).selectDrawerItem(new LoginFragment()); 
      } 

      try { 
       SharedPreferences pref = context.getSharedPreferences("MyPref", 0); 
       produtoFavorito(new favoritarProduto().execute(pref.getString("USID", "null"), item.getId() + "").get()); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

      fragment.notifyAdapterChanged(); 
     } 
    }); 

In fragment.notifyAdapterChanged(); Linie eine gerade mein Fragment nennen, die ich in Konstruktor des Adapters empfangen, und dies ist die Funktion:

public void notifyAdapterChanged(){ 
    adapter.notifyDataSetChanged(); 
} 

EDIT1: Wie mein Layout sieht aus wie http://i.imgur.com/SPr0HBS.png

EDIT2: Mein voller Adapter

Öffentlichkeit Klasse ProdutoAdapter erstreckt BaseAdapter {

private LayoutInflater mInflater; 
private List<ProdutoResumido> itens; 
private HomeFragment fragment; 

public ProdutoAdapter(Context context, List<ProdutoResumido> itens, HomeFragment fragment) { 
    //Itens do listview 
    this.itens = itens; 
    //Objeto responsável por pegar o Layout do item. 
    //mInflater = LayoutInflater.from(context); 
    mInflater = (LayoutInflater) context. 
      getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    this.fragment = fragment; 
} 

public int getCount() { 
    return itens.size(); 
} 

public ProdutoResumido getItem(int position) { 
    return itens.get(position); 
} 

public long getItemId(int position) { 
    return position; 
} 

public View getView(int position, View view, ViewGroup parent) { 
    ItemSuporte itemHolder; 
    //se a view estiver nula (nunca criada), inflamos o layout nela. 
    if (view == null) { 
     //infla o layout para podermos pegar as views 
     view = mInflater.inflate(R.layout.lista_produtos_fg, null); 

     //cria um item de suporte para não precisarmos sempre 
     //inflar as mesmas informacoes 
     itemHolder = new ItemSuporte(); 
     itemHolder.imgProduto = ((ImageView) view.findViewById(R.id.imgProduto)); 
     itemHolder.txtPreco = ((TextView) view.findViewById(R.id.txtPreco)); 
     itemHolder.imgFavorito = ((ImageView) view.findViewById(R.id.imgFavorito)); 
     itemHolder.txtNomeProduto = ((TextView) view.findViewById(R.id.txtNomeProduto)); 
     itemHolder.txtEstadoProduto = ((TextView) view.findViewById(R.id.txtEstadoProduto)); 
     itemHolder.imgLoja = ((ImageView) view.findViewById(R.id.imgLoja)); 
     itemHolder.txtNomeLoja = ((TextView) view.findViewById(R.id.txtNomeLoja)); 

     //define os itens na view; 
     view.setTag(itemHolder); 
    } else { 
     //se a view já existe pega os itens. 
     itemHolder = (ItemSuporte) view.getTag(); 
    } 

    final Context context = view.getContext(); 

    //pega os dados da lista 
    //e define os valores nos itens. 
    final ProdutoResumido item = itens.get(position); 
    Loja loja = new Loja(); 
    itemHolder.txtPreco.setText("R$ " + new DecimalFormat("#.00").format(item.getValor())); 
    itemHolder.imgFavorito.setImageResource(produtoFavorito(item.getFavorito())); 
    itemHolder.txtNomeProduto.setText(item.getNome()); 
    itemHolder.txtEstadoProduto.setText("ESTADO: " + item.getTempoUso()); 
    itemHolder.txtNomeLoja.setText(item.getLoja()); 
    try { 
     if (item.getImagem() != null) 
      new DownloadImageTask(itemHolder.imgProduto).execute("http://200.98.202.23/JustForMoms/" + item.getImagem()); 
     if (item.getLojaImg() != null) 
      new DownloadImageTask(itemHolder.imgLoja).execute("http://200.98.202.23/JustForMoms/" + item.getLojaImg()); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 


    //Implementando os clicks 
    itemHolder.imgFavorito.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (!util.isLogado(context)) { 
       ((MainActivity) context).selectDrawerItem(new LoginFragment()); 
      } 

      try { 
       SharedPreferences pref = context.getSharedPreferences("MyPref", 0); 
       produtoFavorito(new favoritarProduto().execute(pref.getString("USID", "null"), item.getId() + "").get()); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

      fragment.notifyAdapterChanged(); 
     } 
    }); 


    //retorna a view com as informações 
    return view; 
} 

private int produtoFavorito(Boolean favorito) { 
    if (favorito) 
     return R.drawable.favorite; 
    else 
     return R.drawable.notfavorite; 
} 

/** 
* Classe de suporte para os itens do layout. 
*/ 
private class ItemSuporte { 

    ImageView imgProduto; 
    TextView txtPreco; 
    ImageView imgFavorito; 
    TextView txtNomeProduto; 
    TextView txtEstadoProduto; 
    ImageView imgLoja; 
    TextView txtNomeLoja; 
} 


private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> { 
    ImageView bmImage; 

    public DownloadImageTask(ImageView bmImage) { 
     this.bmImage = bmImage; 
    } 

    protected Bitmap doInBackground(String... urls) { 
     String urldisplay = urls[0]; 
     Bitmap mIcon11 = null; 
     try { 
      InputStream in = new java.net.URL(urldisplay).openStream(); 
      mIcon11 = BitmapFactory.decodeStream(in); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return mIcon11; 
    } 

    protected void onPostExecute(Bitmap result) { 
     bmImage.setImageBitmap(result); 
    } 
} 

public class favoritarProduto extends AsyncTask<String, Void, Boolean> { 

    private String retorno; 
    private String url; 

    @Override 
    protected Boolean doInBackground(String... params) { 
     String usID = params[0]; 
     String prodID = params[1]; 

     url = "http://200.98.202.23/JustForMoms/Produto/FavoritarProduto/" + usID + "/" + prodID; 

     webclient client = new webclient(url); 
     retorno = client.getmodel(); 

     if (retorno != null) { 
      if (retorno.equals("\"incluido\"")) { 
       return true; 
      } else { 
       return false; 
      } 


     } 

     return false; 
    } 
} 

}

EDIT 3:

//Implementando os clicks 
    itemHolder.imgFavorito.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (!util.isLogado(context)) { 
       ((MainActivity) context).selectDrawerItem(new LoginFragment()); 
      } 

      try { 
       SharedPreferences pref = context.getSharedPreferences("MyPref", 0); 
       itemHolder.imgFavorito.setImageResource(produtoFavorito(new favoritarProduto().execute(pref.getString("USID", "null"), item.getId() + "").get())); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

      ProdutoAdapter.this. notifyDataSetChanged(); 
     } 
    }); 
+0

Ihre vollständige Adapterklasse Post –

+0

Posted meine vollständige Code –

+0

Zwei Dinge 1> produtoFavorito Methodendeklaration zeigt es int zurückgibt, in Ihrem Code, den Sie nennen es aber nicht Capture seinen Rückgabewert: o Din verstanden Ihre Logik dort 2> Warum notifyAdapterChanged auf Fragment? Du bist im Adapter richtig? Warum notifyAdapterChanged auf Fragment aufrufen? Warum rufen Sie nicht einfach this.notifyDataSetChanged(); –

Antwort

0

Ok, Sie rufen favoritarProduto(), die wiederum einen Anruf-Server macht den Favoritenstatus zu aktualisieren :)

Aber Sie verpasste eine einfache Sache :) Geck seine Async ruf an :) Das bedeutet, dass es Zeit braucht, den Code innerhalb von doInBackground auszuführen :) Wie kann man erwarten, dass der Status sofort aktualisiert wird, als wäre es ein synchroner Aufruf? :)

den Code ändern, wie hier gezeigt

public class favoritarProduto extends AsyncTask<String, Void, Boolean> { 
    private String retorno; 
    private String url; 

    @Override 
    protected Boolean doInBackground(String... params) { 
     String usID = params[0]; 
     String prodID = params[1]; 

     url = "http://200.98.202.23/JustForMoms/Produto/FavoritarProduto/" + usID + "/" + prodID; 

     webclient client = new webclient(url); 
     retorno = client.getmodel(); 

     if (retorno != null) { 
      if (retorno.equals("\"incluido\"")) { 
       return true; 
      } else { 
       return false; 
      } 


     } 

     return false; 
    } 
    @Override 
    protected void onPostExecute(Boolean response) { 
      //call your produtoFavorito fro the item holder based on prodID you have received :) 
    } 

} 
+0

Gespeichert mein Tag :) –

+0

Immer willkommen @ leonardo-accorsi :) Froh, dass ich könnte helfen :) –

Verwandte Themen