jjzjj

android - notifyDataSetChanged() 不适用于我的 gridview 适配器

coder 2023-12-15 原文

我有一个 GridViewGridView 的适配器(BasketAdapter 扩展 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;
        }

    }

}

最佳答案

如果 View 被回收,则您的 convertView 不为空,因此您的 getView() 应该是这样的:

@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,所以您也必须更新这个。只需将此方法添加到您的 BasketAdapter:

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

并使用它代替 notifyDataSetChanged()。 它没有经过测试,但我认为这是你的问题。

关于android - notifyDataSetChanged() 不适用于我的 gridview 适配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18671258/

有关android - notifyDataSetChanged() 不适用于我的 gridview 适配器的更多相关文章

  1. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  2. ruby - capybara field.has_css?匹配器 - 2

    我在MiniTest::Spec和Capybara中使用以下规范:find_field('Email').must_have_css('[autofocus]')检查名为“电子邮件”的字段是否具有autofocus属性。doc说如下:has_css?(path,options={})ChecksifagivenCSSselectorisonthepageorcurrentnode.据我了解,字段“Email”是一个节点,因此调用must_have_css绝对有效!我做错了什么? 最佳答案 通过JonasNicklas得到了答案:No

  3. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  4. Ruby Sinatra 配置用于生产和开发 - 2

    我已经在Sinatra上创建了应用程序,它代表了一个简单的API。我想在生产和开发上进行部署。我想在部署时选择,是开发还是生产,一些方法的逻辑应该改变,这取决于部署类型。是否有任何想法,如何完成以及解决此问题的一些示例。例子:我有代码get'/api/test'doreturn"Itisdev"end但是在部署到生产环境之后我想在运行/api/test之后看到ItisPROD如何实现? 最佳答案 根据SinatraDocumentation:EnvironmentscanbesetthroughtheRACK_ENVenvironm

  5. ruby - 我可以将我的 README.textile 以正确的格式放入我的 RDoc 中吗? - 2

    我喜欢使用Textile或Markdown为我的项目编写自述文件,但是当我生成RDoc时,自述文件被解释为RDoc并且看起来非常糟糕。有没有办法让RDoc通过RedCloth或BlueCloth而不是它自己的格式化程序运行文件?它可以配置为自动检测文件后缀的格式吗?(例如README.textile通过RedCloth运行,但README.mdown通过BlueCloth运行) 最佳答案 使用YARD直接代替RDoc将允许您包含Textile或Markdown文件,只要它们的文件后缀是合理的。我经常使用类似于以下Rake任务的东西:

  6. jquery - 我的 jquery AJAX POST 请求无需发送 Authenticity Token (Rails) - 2

    rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送

  7. ruby - inverse_of 是否适用于 has_many? - 2

    当我使用has_one时,它​​工作得很好,但在has_many上却不行。在这里您可以看到object_id不同,因为它运行了另一个SQL来再次获取它。ruby-1.9.2-p290:001>e=Employee.create(name:'rafael',active:false)ruby-1.9.2-p290:002>b=Badge.create(number:1,employee:e)ruby-1.9.2-p290:003>a=Address.create(street:"123MarketSt",city:"SanDiego",employee:e)ruby-1.9.2-p290

  8. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  9. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  10. ruby-on-rails - 测试我的 Ruby gem:Shoulda::Matchers:Module (NoMethodError) 的未定义方法 `configure' - 2

    我正在开发我的第一个Rubygem,并捆绑了cucumber、rspec和shoulda-matches进行测试。当我运行rspec时,出现以下错误:/app/my_gem/spec/spec_helper.rb:6:in`':undefinedmethod`configure'forShoulda::Matchers:Module(NoMethodError)这是我的gem规范:#my_gem.gemspec...Gem::Specification.newdo|spec|......spec.add_development_dependency"activemodel"spec.a

随机推荐