2011-10-09 43 views
0

我的活动是由一个ArrayList<HashMap<String,String>> THREADS;Android的上下文菜单的info.position与方向改变而改变

填充的ListActivity我也定义在我活动的getView填充的ArrayList<ArrayList<HashMap<String,String>>> PAGES;

对于每个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; 

该上下文菜单还访问螺纹ArrayList的

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

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

回答

1

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

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

getView不属于Activity它是(有可能的,但并非一定没有看到您的代码)从Adapter继承这种方法的目的是得到相应的行中的观点,而不是修改数据集作为你在做。当从另一个Activity返回或更改方向时,系统会刷新正在修改基础数据集的视图(通过调用适配器上的getView),这显然不是您想要的。

+0

我正在解析一个html文档,每行数据都有一个数组。我正在使用PAGES来保存这些内容。我在getview中这样做,所以我可以迭代附加到每一行的数组。如果这是导致差异的原因,那么我可以尝试将迭代移到其他地方。 – aperture