Динамическое обновление представления сетки в Android

У меня проблема: я показываю изображения в виде сетки, которые анализируются из URL-адреса. Я разработал диалоговое окно уточнения поиска, чтобы уточнить поиск в представлении сетки, но проблема в том, что синтаксический анализ работает нормально, но представление сетки не обновляется в следующий раз, когда я обрабатывается Уточнить поиск. Означает, что элементы Grid View не обновляются, он показывает предыдущий результат. Пожалуйста, помогите мне с этой проблемой.

Код:

package org.shopzilla.android.search;

import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.shopzilla.android.common.R;
import org.shopzilla.android.parsing.SearchResult_Json;
import org.shopzilla.android.parsing.Search_Refine_Json;
import org.shopzilla.android.parsing.Search_refine_grid;
import org.shopzilla.android.product.ProductComparisonActivity;

import com.flurry.android.FlurryAgent;


import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.GridView;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;

public class SearchGridActivity extends Activity{

    URL url1;
    public static Bitmap[] bmp;
    Bundle bundle;
    GridView grid;
    String prod_id;
    public static String str,str1;
    public static Boolean flag_grid=false;
    public static int count =0;
    ImageButton _gridImageButton, brand_options_btn,color_options_btn,mat_options_btn;
    Button categories_btn;
    public static String keyword;
     ArrayList<HashMap<String,Object>> list ;
    ListView listView,brandlist, colorlist;
    static final int DIALOG_PRODUCE_ID = 0,DIALOG_REFINE_ID=1;
    Dialog dialog_category,dialog_refine;
    public static ArrayList<String> brand_list_load = new ArrayList<String>();
    public static ArrayList<String> store_list_load = new ArrayList<String>();
    public static ArrayList<String> brand_count = new ArrayList<String>();
    public static ArrayList<String> brand_id = new ArrayList<String>();
    public static ArrayList<String> brand_array_list = new ArrayList<String>();
    public static ArrayList<String> store_array_list = new ArrayList<String>();
    public static ArrayList<String> store_count = new ArrayList<String>();
    public static ArrayList<String> store_id = new ArrayList<String>();
    public static ArrayList<String> brand_selected = new ArrayList<String>();
    public static ArrayList<HashMap<String,Object>> arr_list = new ArrayList<HashMap<String,Object>>();
    String final_keyword;
    public static Boolean falg=false;
    String store_name;
    String brand_name;
    public String temp;
    public static Boolean checkflag=true;
    EditText et_search;
    ArrayList<String> store_selected = new ArrayList<String>();
    ArrayAdapter<String> slected_brand;
    ArrayAdapter<String> slected_store;
    ListView brand_list,store_list;
    ArrayAdapter<String> arrayAdapter,storeAdapter, store_new_adapter, brand_new_adapter;
    SimpleAdapter adapter;
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.searchgrid);
        bundle = getIntent().getExtras();
        if(count==0)
        {
        keyword = bundle.getString("keyword");
        final_keyword = keyword;
        }
        //str1 = bundle.getString("temp");

        grid = (GridView)findViewById(R.id.Search_Result_Grid);
        grid.invalidateViews();

        this.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN);

        final ProgressDialog dialog = ProgressDialog.show(this, "BIZRATE", "Loading.......", true);
                final Handler handler = new Handler() {

                   public void handleMessage(Message msg) {

                        callHereForEff();
                       dialog.dismiss();

                      }
                   };
                   Thread checkUpdate = new Thread() {  
                    public void run() {
                      if(count==1)
                      {

                          SearchResult_Json.json_parsing(final_keyword);
                      }
                        //SearchResultActivity.set_image();
                        Search_refine_grid.Json_parsing();
                        handler.sendEmptyMessage(0);

                      }
                   };
                checkUpdate.start();




        EditText et_search_grid = (EditText)findViewById(R.id.txt_search_grid);
        et_search_grid.setText(keyword);

        et_search_grid.setOnClickListener(new View.OnClickListener() {

            public void onClick(View arg0) {
                // TODO Auto-generated method stub
            Intent intent = new Intent(SearchGridActivity.this,SearchTabActivity.class);
            startActivity(intent);
            }
        });


        Button btn_list = (Button)findViewById(R.id.btn_searchresult_list);
        Button btn_refine = (Button)findViewById(R.id.btn_RefineSearch);

        btn_refine.setOnClickListener(new View.OnClickListener() {

            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                 arrayAdapter =      
                   new ArrayAdapter<String>(SearchGridActivity.this,R.layout.ref_row, R.id.label, brand_list_load);


                 storeAdapter =      
                       new ArrayAdapter<String>(SearchGridActivity.this,R.layout.ref_row, R.id.label, store_list_load);
                showDialog(0);
            }
        });

        btn_list.setOnClickListener(new View.OnClickListener() {

            public void onClick(View arg0) {
                // TODO Auto-generated method stub
            Intent intent = new Intent(SearchGridActivity.this,SearchResultActivity.class);
            intent.putExtra("keyword", keyword);
            startActivity(intent);
                finish();
            }
        });

        /*for(int j=0;j<SearchResultActivity.image_me.size();j++)
        {
            ImageView iv = new ImageView(this);
            //iv.setImageBitmap(SearchResultActivity.me_bmp[j]);
        HashMap<String,Object> temp = new HashMap<String,Object>();
        temp.put("image",iv.VISIBLE);
        temp.put("price", SearchResultActivity.min_price.get(j));
        arr_list.add(temp);
        }

        adapter = new SimpleAdapter(SearchGridActivity.this,arr_list,R.layout.search_result_griditem,new String[] {"image","price"},new int[] {R.id.img_SearchResultGrid_Product,R.id.txt_SearchResultGrid_Price});


        grid.setAdapter(adapter);*/
        grid.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
                Toast.makeText(SearchGridActivity.this, "" + position, Toast.LENGTH_SHORT).show();
                if(SearchResultActivity.type.get(position).equals("OFFER"))
                {

                    prod_id = SearchResultActivity.id.get(position);
                    System.out.println("Offer Id==================="+prod_id);
                    //type_po=true;
                Intent intent = new Intent(SearchGridActivity.this,ProductComparisonActivity.class);
                intent.putExtra("prod_type", "true");
                intent.putExtra("prod_id", SearchResultActivity.id.get(position));
                startActivity(intent);
                }
                else
                {

                    prod_id = SearchResultActivity.id.get(position);
                    System.out.println("Product Id==================="+prod_id);
                    //type_po=false;
                    Intent intent = new Intent(SearchGridActivity.this,ProductComparisonActivity.class);
                    //intent.putExtra("productType", "SZPID");
                    intent.putExtra("prod_type", "false");

                    intent.putExtra("prod_id", SearchResultActivity.id.get(position));
                    startActivity(intent);
                }
            }
        });


    }

    //Clear Arraylists
    public static void arralist_clear()
    {
        SearchResultActivity.min_price.clear();
        SearchResultActivity.image_me.clear();
    }

    protected void callHereForEff() {
        if(count==1)
        {
            //ImageAdapter obj1 = new ImageAdapter(this);
            //obj1.notifyDataSetChanged();

            grid.setAdapter(new ImageAdapter(this));
             final ImageAdapter im = new ImageAdapter(this);
             im.notifyDataSetChanged();
        }
        else
        {
        //ImageAdapter obj = new ImageAdapter(this);
        //obj.notifyDataSetChanged();

        grid.setAdapter(new ImageAdapter(this));//Load the GridView
        final ImageAdapter im = new ImageAdapter(this);
        im.notifyDataSetChanged();
        }
        //grid.setAdapter(adapter);
    }


    //Showing Images with TextViews in Grid View
     public class ImageAdapter extends BaseAdapter{
            Context mContext;
            public static final int ACTIVITY_CREATE = 10;
            public ImageAdapter(Context c){
                mContext = c;
            }
            public int getCount() {
                // TODO Auto-generated method stub
                return SearchResultActivity.image_me.size();
            }

            public View getView(int position, View convertView, ViewGroup parent) {
                View v;

                if(convertView==null){
                    LayoutInflater li = getLayoutInflater();
                    v = li.inflate(R.layout.search_result_griditem, null);
                    TextView tv = (TextView)v.findViewById(R.id.txt_SearchResultGrid_Price);
                    tv.setText(SearchResultActivity.min_price.get(position));
                    ImageView iv = (ImageView)v.findViewById(R.id.img_SearchResultGrid_Product);
                    iv.setImageBitmap(SearchResultActivity.me_bmp[position]);

                }
                else
                {
                    v = convertView;
                }
                return v;
            }

            public Object getItem(int arg0) {
                // TODO Auto-generated method stub
                return null;
            }

            public long getItemId(int arg0) {
                // TODO Auto-generated method stub
                return 0;
            }
        }

    //Dialog Creation for Refine Search.
        @Override
        protected Dialog onCreateDialog(int id) {
            brand_list_load.add(brand_array_list.get(0));
            store_list_load.add(store_array_list.get(0));
            store_new_adapter = new ArrayAdapter<String>(this,R.layout.ref_row, R.id.label, store_array_list);
            brand_new_adapter = new ArrayAdapter<String>(this,R.layout.ref_row, R.id.label, brand_array_list);
            switch(id) {
            case 0:
                dialog_refine = new Dialog(this);
                dialog_refine.setContentView(R.layout.refine_dialog);
                brand_list= (ListView)dialog_refine.findViewById(R.id.exp);

                store_list= (ListView)dialog_refine.findViewById(R.id.exp_mat);
                brand_list.invalidate();
                store_list.invalidate();
                 brand_options_btn = (ImageButton)dialog_refine.findViewById(R.id.options_btn1);
                 et_search = (EditText)dialog_refine.findViewById(R.id.txt_RefineSearch);
                et_search.setText(keyword);
                mat_options_btn = (ImageButton)dialog_refine.findViewById(R.id.options_btn3);

                //Loads Brands List
                brand_list.setAdapter(arrayAdapter);
                //Loads Color List

                //Loads Material List
                store_list.setAdapter(storeAdapter);

             //Reset Button

                //Click on any Brand
                brand_list.setOnItemClickListener(new OnItemClickListener()
                {
                    public void onItemClick(AdapterView<?> arg0, View arg1,int arg2, long arg3)
                    {

                            String brand = (String) (brand_list.getAdapter()).getItem(arg2); 
                            brand_name = "+"+brand;
                            temp = (String) (brand_list.getAdapter()).getItem(0);
                            brand_selected.clear();
                            brand_selected.add(brand);
                            //brand_list_load.clear();


                                arrayAdapter.clear();
                                brand_list.invalidate();
                                reload_list();


                            //arrayAdapter.add(brand);
                            //slected_brand = new ArrayAdapter<String>(this,R.layout.ref_row, R.id.label, brand_selected);
                            System.out.println("POSITION IS-->"+ brand);

                    }
                    });


                //Click on any Store
                store_list.setOnItemClickListener(new OnItemClickListener()
                {
                    public void onItemClick(AdapterView<?> arg0, View arg1,int arg2, long arg3)
                    {

                            String store = (String) (store_list.getAdapter()).getItem(arg2); 
                            store_name = "+"+store;
                            store_selected.clear();
                            store_selected.add(store);

                            //storeAdapter.add(store);

                                storeAdapter.clear();
                                store_list.invalidate();
                                reload_storelist();




                        System.out.println("POSITION IS-->"+ store);

                    }
                    });

            //Brand options

                brand_options_btn.setOnClickListener(new View.OnClickListener() {


                    public void onClick(View v) {

                        arrayAdapter.clear();

                        brand_list.invalidate();
                        brand_list.setAdapter(brand_new_adapter);
                    }
                });

        // Material Options
        mat_options_btn.setOnClickListener(new View.OnClickListener() {


            public void onClick(View v) {
                // TODO Auto-generated method stub
                storeAdapter.clear();

                store_list.invalidate();

                store_list.setAdapter(store_new_adapter);
            }
        });


          Button btn_reset = (Button)dialog_refine.findViewById(R.id.btn_Refine_reset);
          btn_reset.setOnClickListener(new View.OnClickListener() {

            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                dialog_refine.dismiss();

            }
        });
          //Done Button
         Button done_btn=(Button)dialog_refine.findViewById(R.id.btn_Refine_Done);
        done_btn.setOnClickListener(new View.OnClickListener() {


                public void onClick(View v) {
                    // TODO Auto-generated method stub
                //checkflag=false;
                    count=1;
                    SearchResultActivity.arraylists_clear();
                    final_keyword=et_search.getText().toString()+brand_name+store_name;
                    Intent intent = new Intent(SearchGridActivity.this, SearchGridActivity.class);
                    intent.putExtra("keyword", keyword);
                    startActivity(intent);

                }
            });

                break;

            default:
                dialog_refine = null;
            }
            return dialog_refine;
        }

        protected void reload_storelist() {
            // TODO Auto-generated method stub

            slected_store= new ArrayAdapter<String>(this,R.layout.ref_row, R.id.label, store_selected);
            store_list.setAdapter(slected_store);
        }

        protected void reload_list() {
            //brand_list.invalidate();

            //arrayAdapter.clear();


            slected_brand = new ArrayAdapter<String>(this,R.layout.ref_row, R.id.label, brand_selected);
            brand_list.setAdapter(slected_brand);
            //brand_selected.clear();

        }    
    //Flurry Implementation
      public void onStart()
      {
         super.onStart();
         FlurryAgent.onStartSession(this, "AJT5DWUVF6IAE78NQV69");
         // your code
      }

      public void onStop()
      {
         super.onStop();
         FlurryAgent.onEndSession(this);
         // your code
      }
}

person Sanat Pandey    schedule 24.06.2011    source источник


Ответы (1)


Я не проверял весь ваш код, но вижу несколько проблем:

1.

 grid.setAdapter(new ImageAdapter(this));//Load the GridView
 final ImageAdapter im = new ImageAdapter(this);
 im.notifyDataSetChanged();

Не зная, что это должно делать, вы создаете новый ImageAdapter, а затем второй и вызываете для него notifyDataSetChanged, что кажется довольно бесполезным, поскольку оно не привязано ни к какому представлению.
2. Ваш класс ImageAdapter не работает, особенно метод getView. Основная идея getView заключается в том, что вы получаете convertView для повторного использования. Если он нулевой, создайте представление и установите в нем информацию. Если он не нулевой, повторно используйте convertView и установите в нем информацию. В своем коде вы устанавливаете информацию только в том случае, если представление имеет значение null, поэтому, как только вы прокрутите или измените данные, оно попытается переработать представления, и вы не измените их содержимое.

Метод должен быть примерно таким

public View getView(int position, View convertView, ViewGroup parent) {
    View v = convertView;
    if (v == null){
        // No view passed, create one !
        LayoutInflater li = getLayoutInflater();
        v = li.inflate(R.layout.search_result_griditem, parent, false);
    }

    // Set the view's content
    TextView tv = (TextView)v.findViewById(R.id.txt_SearchResultGrid_Price);
    tv.setText(SearchResultActivity.min_price.get(position));
    ImageView iv = (ImageView)v.findViewById(R.id.img_SearchResultGrid_Product);
    iv.setImageBitmap(SearchResultActivity.me_bmp[position]);
    return v;
}

Вы также можете сохранить ссылку на свой адаптер и вызывать notifyDataSetChanged, когда вы хотите, чтобы GridView обновлял свое содержимое.

И последнее: вы, вероятно, не хотите, чтобы метод getItemId в вашем ImageAdapter все время возвращал 0, поскольку GridView использует этот идентификатор для управления переработанными представлениями и всем остальным. Более простой реализацией будет

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

Возможно, также стоит заполнить метод getItem.

person Gregory    schedule 24.06.2011