onResume不更新适配器

时间:2013-08-06 14:45:11

标签: android

大家好,我是Android新手。我正在开发包含ListAdapter的应用程序,我想从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);
}

重启我的应用后,适配器不会更新,并显示旧列表。 请帮忙)) 感谢名单!!!

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

如果notifydatasetchanged()方法用于修改适配器呈现的基础数据结构,则

adapter.add()/adapter.clear()/adapter.remove()仅更新视图。

如果要直接修改基础数据结构,则需要重新实现传递新数据结构的适配器并重新设置视图适配器。

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

- 更新 - 尝试添加

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

到onResume()重新创建适配器的“新”实例并为listview设置它

答案 2 :(得分:-1)

以下为我清除了ListView

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