【问题标题】:Redraw android spinner重绘android微调器
【发布时间】:2011-02-15 19:21:45
【问题描述】:

我有一个 android 微调器项目,其中的行由 TextView 和 ImageView 组成(星号,表示用户已将该特定项目标记为收藏夹)。现在,当用户收藏某个项目时,我想让星星出现在微调器列表中该项目的旁边,所以我想重绘微调器以显示更新的图像。我该怎么做?

我现在正在做的是创建一个全新的微调器,带有适当的图像。这使我的微调器将所选项目设置为列表中的第一项,这很烦人 - 我希望它保持不变。我试过了

spinner.setSelection(selectedItem);

这适用于我实际想要的数字(当前选定项目的位置)以外的任何数字,然后它将选定的微调器项目再次设置为列表中的第一个。

那么:如何使用更新的信息重新绘制列表而无需重新创建整个列表,或者,如何重新创建列表并仍然保留微调器项目选择?

澄清一下:这就是我正在做的事情

// Callback for "favourite"-button
star.setOnClickListener(new ImageButton.OnClickListener() {
        @Override
        public void onClick(View arg0) {
            // Toggle favourite
            getActiveSelection().setStarred(getActiveSelection().isStarred() ? false : true);
            reloadText();
            createSpinner();
        }
    });

 private void createSpinner() {

    spinner = ((Spinner)findViewById(R.id.spinner));

    ArrayList<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>();
    HashMap<String, Object> map = new HashMap<String, Object>();

    // Populate spinner item list
    for(int i=0; i<N; i++) {
        SpinnerItem item = getSpinnerItem(i);
        map = new HashMap<String, Object>();
        map.put("Name", item.getName());
        map.put("Icon", (item.isStarred() ? "On" : "Off"));
        list.add(map);
    }        

    MySpinnerAdapter aspn = new MySpinnerAdapter(this, list,
            R.layout.spinner, new String[] { "Name", "Icon" },
            new int[] { R.id.spinnerrow, R.id.spinnerrowicon });


    spinner.setAdapter(aspn);
    spinner.setSelection(getActiveSelection().getSpinnerPosition());
}

【问题讨论】:

    标签: android selection android-spinner


    【解决方案1】:

    您可以只更新spinner adapter - 让它知道当用户点击星形图标时哪个项目被加星标(star.setOnClickListener...)。我会做什么:

    1. 在适配器构造中,您只传递“名称”字段列表,不需要图标(默认情况下均未加星标)
    2. 您向适配器添加单独的功能以设置已加星标的项目(setStarred(String name))
    3. 初次调用时,调用setStarred 设置初始选择(如果有)
    4. 在star.setOnClickListener 实现中,调用setStarred 获取适配器上的星标项目,您将获得(MySpinnerAdapter)spinner.getAdapter()

    【讨论】:

      【解决方案2】:

      或者只是尝试:

      spinner.setSelection(getActiveSelection().getSpinnerPosition(),true);
      

      这对我更新微调器很有用...

      【讨论】:

        【解决方案3】:

        当您的数据发生变化时,您需要在微调适配器上调用notifyDataSetChanged()

        【讨论】:

          猜你喜欢
          • 2012-01-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-08-30
          • 2013-01-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多