我的活动是由ArrayList<HashMap<String,String>> THREADS;
我还定义了一个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)不再以某种方式同步。再次改变方向有时会重新同步它,但我不明白这是如何发生的。
答案 0 :(得分:1)
为什么要在GetView中添加PAGES ArrayList?
for(int u=0;u<p;u++){
....
PAGES.add(position, lnks);
}
getView
不属于从Adapter继承的Activity
(很可能,但不确定,但未见到您的代码)该方法旨在返回与行,而不是像你一样修改数据集。当从另一个Activity返回或更改方向时,系统会刷新视图(通过调用适配器上的getView)来修改底层数据集,这显然不是您想要的。