2013-09-07 9 views
5

के लिए मेरे एडाप्टर के साथ काम नहीं करता है मेरे पास GridView है और GridView के लिए एडाप्टर है (बास्केट एडाप्टर BaseAdapter बढ़ाता है)।सूचित करेंडेटाट चेंज() ग्रिडव्यू

मैं sharedpref फ़ाइल से GridView में डेटा लोड। डेटा बदलने के बाद, मैं डेटा के साथ sharedpref फ़ाइल को पुन: सहेजता हूं और notifyDataSetChanged() पर कॉल करता हूं। लेकिन notifyDataSetChanged() दुर्भाग्य से काम नहीं करता है।

अगर मैं नई एडाप्टर बना सकते हैं और मेरी GridView के लिए सेट है, यह काम करता है। क्या कोई इस मुद्दे के साथ मेरी मदद कर सकता है?

public class FragmentBasket extends SherlockFragment { 

    // my gridview 
    GridView gvCatalogAllStoneBasket; 
    // list of data from shared pref 
    ArrayList<CatalogItem> catalogItemBasket = new ArrayList<CatalogItem>(); 
    ActionMode mode; 
    public static CatalogItem catalogItem; 
    // id variables for actionmode's actions 
    static final int ID_DELETE = 1; 
    static final int ID_EDIT = 2; 
    // shared pref id string 
    static String SHARED_PREFS_FILE = "basket"; 
    // my adapter 
    BasketAdapter adapter = null; 

    public FragmentBasket() { 

    } 

    @Override 
    public void onStart() { 

     super.onStart(); 
     // loading saved data from file 
     new GetCatalogAllStoneBasket().execute(); 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 

     super.onCreate(savedInstanceState); 

     Receiver receiver = new Receiver(); 
     IntentFilter intentFilterAdd = new IntentFilter("com.example.myproject.ADD_ITEM_BASKET"); 
     IntentFilter intentFilterEdit = new IntentFilter("com.example.myproject.EDIT_ITEM_BASKET"); 
     IntentFilter intentFilterDelete = new IntentFilter("com.example.myproject.DELETE_ITEM_BASKET"); 
     getActivity().registerReceiver(receiver, intentFilterAdd); 
     getActivity().registerReceiver(receiver, intentFilterEdit); 
     getActivity().registerReceiver(receiver, intentFilterDelete); 

    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 

     View view = inflater.inflate(R.layout.right_panel_fragment_catalog_grid, container, false); 

     gvCatalogAllStoneBasket = (GridView)view.findViewById(R.id.gvCatalogAllStoneBasket); 

     gvCatalogAllStoneBasket.setOnItemLongClickListener(new OnItemLongClickListener() { 

      @Override 
      public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) { 


       // start action mode and send id of clicked item 
       mode = getSherlockActivity().startActionMode(new ActionModeOfBasket(String.valueOf(view.getTag()))); 

       return false; 
      } 
     }); 

     return view; 

    } 

    private final class ActionModeOfBasket implements ActionMode.Callback 
    { 

     String itemId; 

     public ActionModeOfBasket(String itemId) { 

      // get id from clicked item 
      this.itemId = itemId; 
     } 

     @Override 
     public boolean onCreateActionMode(ActionMode mode, Menu menu) { 


      menu.add(0, ID_EDIT, 0, "Edit") 
      .setIcon(android.R.drawable.ic_menu_edit) 
      .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW); 

      menu.add(0, ID_DELETE, 1, "Delete") 
      .setIcon(android.R.drawable.ic_menu_delete) 
      .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW); 

      return true; 
     } 

     @Override 
     public boolean onPrepareActionMode(ActionMode mode, Menu menu) { 

      return false; 
     } 

     @Override 
     public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 


      // get file 
      SharedPreferences sPref = getActivity().getSharedPreferences(SHARED_PREFS_FILE, getActivity().MODE_PRIVATE); 
      // open file for reading, writing 
      BasketHelper bHelper = new BasketHelper(sPref, getActivity()); 

      switch (item.getItemId()) 
      { 
      // if clicked del button 
      case ID_DELETE:    
       // delete item 
       bHelper.DelItem(itemId); 
       mode.finish(); 
       catalogItemBasket = bHelper.GetAllItems(); 
       break; 
      // if clicked edit button 
      case ID_EDIT:    
       // edit item 
       bHelper.EditItem(itemId, getFragmentManager()); 
       mode.finish(); 
       catalogItemBasket = bHelper.GetAllItems(); 

       break; 

      } 

      return true; 
     } 

     @Override 
     public void onDestroyActionMode(ActionMode mode) { 


     } 

    } 

    class GetCatalogAllStoneBasket extends AsyncTask<String, String, String> 
    { 

     @Override 
     protected void onPreExecute() { 

      super.onPreExecute(); 

     } 

     @Override 
     protected String doInBackground(String... params) { 

      SharedPreferences sPref = getActivity().getSharedPreferences(FragmentCatalogStonePosition.SHARED_PREFS_FILE, getActivity().MODE_PRIVATE); 
      try { 


       if(sPref.getString(FragmentCatalogStonePosition.TASK, null) != null) 
       { 

        BasketHelper bHelper = new BasketHelper(sPref, getActivity()); 
        catalogItemBasket = bHelper.GetAllItems(); 
       } 

      } catch (Exception e) { 

       Log.d(MainActivity.tag, e.getMessage() + " " + e.getCause()); 
       e.printStackTrace(); 
      } 

      return null; 
     } 

     @Override 
     protected void onPostExecute(String result) { 

      super.onPostExecute(result); 

      adapter = new BasketAdapter(getActivity(), catalogItemBasket); 
      gvCatalogAllStoneBasket.setAdapter(adapter); 


     } 

    } 
    class Receiver extends BroadcastReceiver 
    { 
     @Override 
     public void onReceive(Context context, Intent intent) { 

      if(intent.getAction().toString() == "com.example.myproject.ADD_ITEM_BASKET") 
      { 


      } 
      else if(intent.getAction().toString() == "com.example.myproject.EDIT_ITEM_BASKET") 
      {     

       // this code doesn't work (((
       adapter.notifyDataSetChanged(); 

       // this one successfully works    
       BasketAdapter bAdapter = new BasketAdapter(getActivity(), catalogItemBasket); 
       gvCatalogAllStoneBasket.setAdapter(bAdapter); 

      } 
      else if(intent.getAction().toString() == "com.example.myproject.DELETE_ITEM_BASKET") 
      { 


      } 


     } 
    } 
    class BasketAdapter extends BaseAdapter 
    { 

     Context context = null; 
     ArrayList<CatalogItem> data = null; 

     public BasketAdapter(Context context, ArrayList<CatalogItem> data) { 

      this.context = context; 
      this.data = data; 

     } 

     @Override 
     public int getCount() { 

      return data.size(); 
     } 

     public CatalogItem getItem(int position) { 

      return data.get(position); 
     } 

     @Override 
     public long getItemId(int position) { 

      return 0; 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 

      View view = convertView; 

      if(view == null) 
      { 

       LayoutInflater inflater = getLayoutInflater(null); 
       view = inflater.inflate(R.layout.right_panel_fragment_catalog_grid_item, parent, false); 

       CatalogItem item = getItem(position); 
       ((TextView)view.findViewById(R.id.tvCatalogItemBasketName)).setText(item.name + "/" + item.code); 

       Double gPrice = Double.valueOf(item.price) * Double.valueOf(item.count); 
       ((TextView)view.findViewById(R.id.tvCatalogItemBasketCount)).setText(String.valueOf(item.count)); 
       ((TextView)view.findViewById(R.id.tvCatalogItemBasketGeneralPrice)).setText(String.valueOf(gPrice)); 
       ((TextView)view.findViewById(R.id.tvCatalogItemBasketDescription)).setText(item.description); 

       final ImageView imgView = (ImageView)view.findViewById(R.id.ivCatalogItemBasketImage); 
       String strURL = "http://myproject.ua/images/stock/" + item.folder + "/" + item.images + "_800x600.jpg"; 

       ImageLoaderConfiguration config = ImageHelper.ImageConfig(getActivity().getApplicationContext()); 

       DisplayImageOptions options = ImageHelper.ImageOptions(); 

       ImageLoader imageLoader = ImageLoader.getInstance(); 

       imageLoader.init(config); 

       final ProgressBar pImgDialog = (ProgressBar)view.findViewById(R.id.pbImage); 

       imageLoader.displayImage(strURL, imgView, options, new ImageLoadingListener() { 

        @Override 
        public void onLoadingStarted(String imageUri, View view) { 

         pImgDialog.setVisibility(View.VISIBLE); 
         imgView.setVisibility(View.GONE); 

        } 

        @Override 
        public void onLoadingFailed(String imageUri, View view, FailReason failReason) { 

         pImgDialog.setVisibility(View.GONE); 
         imgView.setVisibility(View.VISIBLE); 

        } 

        @Override 
        public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { 

         pImgDialog.setVisibility(View.GONE); 
         imgView.setVisibility(View.VISIBLE); 

        } 

        @Override 
        public void onLoadingCancelled(String imageUri, View view) { 

         pImgDialog.setVisibility(View.GONE); 
         imgView.setVisibility(View.VISIBLE); 

        } 
       }); 

       view.setTag(item.catalog_id); 
      } 

      return view; 
     } 

    } 

} 

उत्तर

3

आपका convertView तो अपने getView() कुछ इस तरह होना चाहिए, मामले View पुनर्नवीनीकरण में रिक्त नहीं है:

यहाँ मेरी कोड है

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    View view = convertView; 

    if(view == null) 
    { 
     LayoutInflater inflater = getLayoutInflater(null); 
     view = inflater.inflate(R.layout.right_panel_fragment_catalog_grid_item, parent, false); 
    } 

     CatalogItem item = getItem(position); 
     ((TextView)view.findViewById(R.id.tvCatalogItemBasketName)).setText(item.name + "/" + item.code); 

     Double gPrice = Double.valueOf(item.price) * Double.valueOf(item.count); 
     ((TextView)view.findViewById(R.id.tvCatalogItemBasketCount)).setText(String.valueOf(item.count)); 
     ((TextView)view.findViewById(R.id.tvCatalogItemBasketGeneralPrice)).setText(String.valueOf(gPrice)); 
     ((TextView)view.findViewById(R.id.tvCatalogItemBasketDescription)).setText(item.description); 

     final ImageView imgView = (ImageView)view.findViewById(R.id.ivCatalogItemBasketImage); 
     String strURL = "http://myproject.ua/images/stock/" + item.folder + "/" + item.images + "_800x600.jpg"; 

     ImageLoaderConfiguration config = ImageHelper.ImageConfig(getActivity().getApplicationContext()); 

     DisplayImageOptions options = ImageHelper.ImageOptions(); 

     ImageLoader imageLoader = ImageLoader.getInstance(); 

     imageLoader.init(config); 

     final ProgressBar pImgDialog = (ProgressBar)view.findViewById(R.id.pbImage); 

     imageLoader.displayImage(strURL, imgView, options, new ImageLoadingListener() { 

      @Override 
      public void onLoadingStarted(String imageUri, View view) { 

       pImgDialog.setVisibility(View.VISIBLE); 
       imgView.setVisibility(View.GONE); 

      } 

      @Override 
      public void onLoadingFailed(String imageUri, View view, FailReason failReason) { 

       pImgDialog.setVisibility(View.GONE); 
       imgView.setVisibility(View.VISIBLE); 

      } 

      @Override 
      public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) { 

       pImgDialog.setVisibility(View.GONE); 
       imgView.setVisibility(View.VISIBLE); 

      } 

      @Override 
      public void onLoadingCancelled(String imageUri, View view) { 

       pImgDialog.setVisibility(View.GONE); 
       imgView.setVisibility(View.VISIBLE); 

      } 
     }); 

     view.setTag(item.catalog_id); 
    return view; 
} 

और आप अपने के बाद से अपने एडाप्टर के अंदर ArrayList, आपको इसे भी अपडेट करना होगा।

public void changeModelList(List<CatalogItem> models) { 
    this.data = models; 
    notifyDataSetChanged(); 
} 

और notifyDataSetChanged() के बजाय इसका उपयोग: बस अपने BasketAdapter के लिए इस विधि जोड़ें। यह परीक्षण नहीं किया गया है, लेकिन मुझे लगता है कि यह आपकी समस्या है।

+0

यह काम नहीं करता = \ – Denis

+0

ठीक है, अब मैं इसे देख, अपने getView() विधि समस्या अपने convertView isn't अशक्त मामले में दृश्य – malimo

+0

उत्कृष्ट पुनर्नवीनीकरण है ..! अब यह काम करता है। ! बहुत बहुत शुक्रिया) – Denis

संबंधित मुद्दे