notifyDataSetChanged()不使用Fragment中的GridView

时间:2016-04-01 13:16:54

标签: android gridview android-adapter notifydatasetchanged

我的片段中有一个gridview,由BaseAdapter填充。

问题是在我的适配器中我有一个喜欢的按钮,当我点击我希望按钮改变。但是API中的逻辑已经完成,但是当我重新加载页面时,我的按钮才会改变。

我尝试使用adapter.notifyDataSetChanged();但是没有用。

我的getView适配器代码:

//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();
        }
    });

在fragment.notifyAdapterChanged()中; line a只是调用我的Fragment,我在适配器的构造函数中接收,这是函数:

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

EDIT1:我的布局如何 http://i.imgur.com/SPr0HBS.png

EDIT2:我的完整适配器

public class ProdutoAdapter扩展了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;
    }
}

}

编辑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();
        }
    });

1 个答案:

答案 0 :(得分:0)

好的,你正在调用favoritarProduto(),后者又调用服务器来更新喜欢的状态:)

但是你错过了一个简单的事情:) Dude它的异步调用:)这意味着在doInBackground中执行代码需要时间:)你怎么能期望状态被立即更新并准备就好,就好像它是同步调用? ? :)

修改代码,如下所示

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 :) 
    }

}