2013-08-06 102 views
1

大家好,我是Android新手。我正在开发包含ListAdapter的应用程序,并且我想从onResume中清除它。onResume不更新适配器

在Activity中指的是levelsView。

public class MyActivity extends Activity{ 
        ... 


@Override 
    protected void onResume(){ 
     super.onResume(); 
     levelsView.onResume(); 
    } 
} 

LevelsView指FontsSelect在那里我有myAdapter

public class FontsSelect extends LinearLayout { 
private List<FontLevels> fontsLevels; 

public FontsSelect(Context context, AttributeSet attr, int defStyle){ 
     super(context, attr, defStyle); 
     inflate(context, R.layout.list_view_of_fonts, this); 

     listViewFonts = (ListView)findViewById(R.id.list_of_fonts); 
     listViewFonts.setDivider(null); 
     fontsLevels = new ArrayList<FontLevels>(); 
     levels = new ArrayList<Level>(); 
     createLevels(); 
     myAdapter = new MyAdapter(context); 
     listViewFonts.setOnItemClickListener(levelSelectListener); 
     listViewFonts.setAdapter(myAdapter); 

    } 

public void createLevels(){ 
    ... 
fontsLevels.add(new FontLevels(context, "fonts/TNR.ttf"))} 

class MyAdapter extends BaseAdapter { 

     final LayoutInflater inflater; 

     public MyAdapter(Context context){ 
      inflater = LayoutInflater.from(context); 
     } 
     @Override 
     public int getCount() { 
      return fontsLevels.size(); 
     } 

     @Override 
     public Object getItem(int position) { 
      return fontsLevels.get(position); 
     } 

     @Override 
     public long getItemId(int position) { 
      return position; 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      final ViewHolder holder; 
      if(convertView == null){ 
       convertView = inflater.inflate(R.layout.item_level, parent, false); 
       holder = new ViewHolder((TextView)convertView.findViewById(R.id.level_name_typeface), (TextView)convertView.findViewById(R.id.level_score_number)); 
       convertView.setTag(holder); 
      } 
      else { 
       holder = (ViewHolder)convertView.getTag(); 
      } 

      ... 


      return convertView; 
     } 



    } 

public void onResume(){ 
     listViewFonts.setAdapter(null); 
     fontsLevels.clear(); 
     fontsLevels.add(new FontLevels(context, "fonts/TNR.ttf"); 
     fontsLevels.add(new FontLevels(context, "fonts/TNR.ttf"); 
     myAdapter = new MyAdapter(getContext(), fontsLevels); 
     listViewFonts.setAdapter(myAdapter); 
     myAdapter.notifyDataSetChanged(); 

    } 
} 

这里是ckass FontLevel

public class FontLevels{ 
private String fontFullName; 
    private int _id; 
    private List<Level> easyLevels; 
    private List<Level> hardLevels; 

public FontLevels(Context context, String fontFullName){ 
     this.fontFullName = fontFullName; 
     typeface = Typeface.createFromAsset(context.getAssets(), FONTS_DIR + fontFullName); 
     easyLevels = new ArrayList<Level>(levelNumber); 
     hardLevels = new ArrayList<Level>(levelNumber); 
} 

,并重新启动后,我的应用程序,适配器不更新,并显示旧列表。 请帮忙)) Thanx !!!

+0

你确定你的数组列表正在当你重新启动应用程序时更新?如果不是那么它的一般行为,以显示旧值:) –

+0

我debuged应用程序,并看到,重新启动后,构造函数初始化数组(''createLevels()')和'getCount()'返回正确的值,但然后'onResume '清除数组和'getCount()= 0',最后我不明白getCount()是否返回旧值,因为没有人初始化数组 – IgorB

+0

其实你已经定制了类并且隐藏了一些你的代码无法获取流和映射。你能用他们的参数和回应发布最少的方法吗? –

回答

0

notifydatasetchanged()只有在使用修改底层数据的adapter.add()/adapter.clear()/adapter.remove()方法更新视图结构由适配器提供。

如果您直接修改底层数据结构,则需要重新实例化传递新数据结构的适配器并重新设置视图适配器。

我在我自己的代码中发现了这个问题,并重新实例化了适配器修复了它。

- 更新 - 尝试增加

myAdapter = new MyAdapter(); 
listViewFonts.setAdapter(myAdapter); 

到的onResume()来重新创建适配器的“新”的实例,并将其设置为ListView

+0

谢谢,我会尝试。但我有一个曲线estion,如果我添加按钮并将其设置为clickListener,其中'.clear()'我的数组,以及thren'adapter.notifydatasetchanged()'视图将更改并且没关系。但为什么不能从'onResume()'做同样的事情。谢谢! – IgorB

+0

我会说实话,我不是100%肯定,但我认为当你经历的onPause在应用程序的编写潜力被关闭,虽然内存不足,因此,当你回来到列表视图对象范围丢失onResume,该数组不再直接链接到阵列适配器对象。所以通知不起作用。同样,一个猜测,我只能说是我观察到相同的行为,这是我固定它 – o0rebelious0o

+0

我能问你一个小忙,写的你如何实现它的一个小例子。我会非常感谢你:) – IgorB

-1

下清除了ListView对我来说:

 listview.removeAllViewsInLayout(); 
     listview.removeAllViewsFromAdapter(); 
     listview.setAdapter(null); 
     listview.refreshDrawableState(); 
     listview.removeViews(0, listview.getChildCount()); 
+0

我加了它,但它不工作:( '@覆盖 保护无效的onResume(){ super.onResume(); levelsView.fontsSelect.listViewFonts.removeAllViewsInLayout(); levelsView.fontsSelect.listViewFonts.setAdapter(NULL); levelsView.fontsSelect.listViewFonts.refreshDrawableState(); levelsView.fontsSelect.listViewFonts.removeViews(0,levelsView.fontsSelect.listViewFonts.getChildCount());} ' – IgorB

+0

手动清除视图是不是做到这一点,适配器会检测视图被改变,并手动刷新自己,把它们直背 – o0rebelious0o

0

This post点出了问题,并描述了所有可能的解决方案