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();
}
});
Ihre vollständige Adapterklasse Post –
Posted meine vollständige Code –
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(); –