Android上下文菜单的info.position随着方向的变化而变化

时间:2011-10-09 00:56:05

标签: android

我的活动是由ArrayList<HashMap<String,String>> THREADS;

填充的ListActivity

我还定义了一个ArrayList<ArrayList<HashMap<String,String>>> PAGES;,它填充在我的活动的getView中。

对于每个THREADS项目,我将相应的数据添加到PAGES

public View getView(int position, View convertView, ViewGroup parent){
...
                      String lp = THREADS.get(position).get("lastPage");
                      String base = THREADS.get(position).get("base").replaceAll("^.*(?:td\\-p\\/)", "").replaceAll("/jump-to/first-unread-message", "?page_size=25&page=PAGE_NUMBER_HERE");
                      int p = Integer.parseInt(lp);
                      ArrayList<HashMap<String, String>> lnks = new ArrayList<HashMap<String, String>>();

                          for(int u=0;u<p;u++){
                              HashMap<String,String> temp = new HashMap<String,String>();
                              temp.put("page", Integer.toString(u+1));
                              temp.put("base", base);
                              temp.put("title", THREADS.get(position).get("title"));
                              lnks.add(temp);
                              PAGES.add(position, lnks);

                          }
...
}

通过上下文菜单

访问此PAGES ArrayList
           case R.id.goPage:
                final Dialog dlg = new Dialog(ThreadListing.this);
                dlg.setContentView(R.layout.link_selector);
                ListView sel = (ListView) dlg.findViewById(R.id.linksel);

                adaptr = new SimpleAdapter(this, PAGES.get(info.position), R.layout.link_sel_row, new String[]{"page"}, new int[]{R.id.link_title});
                pgs = PAGES.get(info.position);
                sel.setAdapter(adaptr);
                dlg.setTitle(PAGES.get(info.position).get(0).get("title"));

                dlg.show();
                sel.setOnItemClickListener(new OnItemClickListener(){
                    public void onItemClick(AdapterView<?> parent, View view, int position, long id){
                        Intent i = new Intent(getApplicationContext(), ThreadViewer.class);
                        String pg = pgs.get(position).get("base").replaceAll("PAGE_NUMBER_HERE", pgs.get(position).get("page"));
                        i.setData(Uri.parse(pg));
                        startActivity(i);
                        dlg.dismiss();
                    }
                });
                return true;

此上下文菜单还可以访问THREADS ArrayList

首次加载活动时,所有内容都会正确匹配。该对话框显示正确的标题,适配器包含正确的数据。

但是,当我要么开始一个新的活动,然后通过后退按钮返回,或者更改方向时,对话框会被乱抛出。它开始显示比我选择的列表项更早的列表项的标题和适配器,好像info.position引用了不同的位置,但是访问THREADS的上下文菜单项保持正确的顺序。所以THREADS.get(info.position)和PAGES.get(info.position)不再以某种方式同步。再次改变方向有时会重新同步它,但我不明白这是如何发生的。

1 个答案:

答案 0 :(得分:1)

为什么要在GetView中添加PAGES ArrayList?

 for(int u=0;u<p;u++){
     ....
     PAGES.add(position, lnks);
 }

getView不属于从Adapter继承的Activity(很可能,但不确定,但未见到您的代码)该方法旨在返回与行,而不是像你一样修改数据集。当从另一个Activity返回或更改方向时,系统会刷新视图(通过调用适配器上的getView)来修改底层数据集,这显然不是您想要的。