【问题标题】:ListView not repopulating after resume恢复后 ListView 未重新填充
【发布时间】:2016-02-10 00:24:38
【问题描述】:

我正在创建一个由 Sqlite 数据库(由我的“DBAdapter”类创建)填充的列表视图。我正在构建的这个日志以包含 listView 的片段开始,它打开一个活动(通过添加按钮“TrainingLogCreate.java”),向用户显示两个 editText 框(一个当前未使用)。当我回到片段时,数据被写入 sqlite 数据库,但是直到我回到导航抽屉并选择日志后新数据才会出现,这会重新加载片段,然后在列表中显示新信息看法。无论如何,当活动关闭并恢复片段时,我可以让 listView 重新填充吗?

数据库适配器:

    package com.hardingsoftware.hrcfitness;

/**
 * Created by John on 2/9/16.
 */



public class DBAdapter {

    //COLUMNS
    static final String ROWID="id";
    static final String NAME = "name";
    static final String POSITION = "position";

    //DB PROPERTIES
    static final String DBNAME="m_DB";
    static final String TBNAME="m_TB";
    static final int DBVERSION='1';

    static final String CREATE_TB="CREATE TABLE m_TB(id INTEGER PRIMARY KEY AUTOINCREMENT,"
            + "name TEXT NOT NULL,position TEXT NOT NULL);";

    final Context c;
    SQLiteDatabase db;
    DBHelper helper;

    public DBAdapter(FragmentActivity ctx) {
        // TODO Auto-generated constructor stub

        this.c=ctx;
        helper=new DBHelper(c);
    }



    // INNER HELPER DB CLASS
    private static class DBHelper extends SQLiteOpenHelper
    {

        public DBHelper(Context context ) {
            super(context, DBNAME, null, DBVERSION);
            // TODO Auto-generated constructor stub
        }

        @Override
        public void onCreate(SQLiteDatabase db) {

            try
            {
                db.execSQL(CREATE_TB);
            } catch (SQLException e) {
                e.printStackTrace();
            }

        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // TODO Auto-generated method stub

            Log.w("DBAdapetr","Upgrading DB");

            db.execSQL("DROP TABLE IF EXISTS m_TB");

            onCreate(db);
        }

    }

    // OPEN THE DB
    public DBAdapter openDB()
    {
        try
        {
            db=helper.getWritableDatabase();

        }catch(SQLException e)
        {
            Toast.makeText(c, e.getMessage(), Toast.LENGTH_LONG).show();
        }

        return this;
    }


    //CLOSE THE DB
    public void close()
    {
        helper.close();
    }

    //INSERT INTO TABLE
    public long add(String name,String pos)
    {
        try
        {
            ContentValues cv=new ContentValues();
            cv.put(NAME, name);
            cv.put(POSITION, pos);

            return db.insert(TBNAME, ROWID, cv);

        }catch(SQLException e)
        {
            e.printStackTrace();
        }

        return 0;
    }

    //GET ALL VALUES

    public Cursor getAllNames()
    {
        String[] columns={ROWID,NAME,POSITION};

        return db.query(TBNAME, columns, null, null, null, null, null);
    }




}

训练日志:

    package com.hardingsoftware.hrcfitness;


/**
 * Created by John on 2/3/16.
 */

public class TrainingLog extends Fragment {

    ListView lv;
    ArrayList<String> players = new ArrayList<String>();
    ArrayAdapter<String> adapter;
    ArrayAdapter<String> clearAdapter;

    public TrainingLog() {
        // Required empty public constructor
    }



    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment

        View rootView = inflater.inflate(R.layout.fragment_training_log, container, false);
        lv = (ListView) rootView.findViewById(R.id.myListView);
        final DBAdapter db = new DBAdapter(this.getActivity());
        setHasOptionsMenu(true);

        players.clear();

        //OPEN
        db.openDB();



        //RETRIEVE
        Cursor c=db.getAllNames();

        while(c.moveToNext())
        {
            String name=c.getString(1);
            players.add(name);
        }



        db.close();




        adapter=new ArrayAdapter<String>(this.getActivity(),android.R.layout.simple_selectable_list_item,players);
        lv.setAdapter(adapter);
        /* ListAdapter myTrainingAdapter = new TrainingAdapter(this.getActivity(), exercizeActivity, exercizeDetail);
        ListView myListView = (ListView) rootView.findViewById(R.id.myListView);
        myListView.setAdapter(myTrainingAdapter); */


        return rootView;
    }

    @Override
    public void onResume() {
        super.onResume();

        final DBAdapter db = new DBAdapter(this.getActivity());



        /* //OPEN
        db.openDB();

        getContext().deleteDatabase("db");

        //RETRIEVE
        Cursor c=db.getAllNames();

        while(c.moveToNext())
        {
            String name=c.getString(1);
            players.add(name);
        }



        db.close();

        lv.setAdapter(clearAdapter);


        adapter=new ArrayAdapter<String>(this.getActivity(),android.R.layout.simple_selectable_list_item,players);


        lv.setAdapter(adapter); */

    }

    @Override
    public void onCreateOptionsMenu(
            Menu menu, MenuInflater inflater) {
        inflater.inflate(R.menu.traning_menu_itemdetail, menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // handle item selection
        switch (item.getItemId()) {
            case R.id.action_add:
                Intent trainingCreateIntent = new Intent (getContext(), TrainingLogCreate.class);
                startActivity(trainingCreateIntent);
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }


}

训练日志创建:

    package com.hardingsoftware.hrcfitness;


/**
 * Created by John on 2/6/16.
 */
public class TrainingLogCreate extends AppCompatActivity {


    EditText nameTxt;
    EditText posTxt;
    Button savebtn;
    Context context = this;

    public TrainingLogCreate() {
        // Required empty public constructor
    }



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.training_log_create);

        savebtn = (Button) findViewById(R.id.saveButton);
        nameTxt = (EditText) findViewById(R.id.exercizeActivity);
        posTxt = (EditText) findViewById(R.id.exercizeDetails);
        final DBAdapter db=new DBAdapter(this);



        savebtn.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {

                // TODO Auto-generated method stub

                //OPEN
                db.openDB();

                //INSERT
                long result=db.add(nameTxt.getText().toString(), posTxt.getText().toString());

                if(result > 0)
                {
                    nameTxt.setText("");
                    posTxt.setText("");
                }else
                {
                    Toast.makeText(getApplicationContext(), "Failure", Toast.LENGTH_SHORT).show();
                }


                //CLOSE DB
                db.close();

                //Close Fragment


                finish();

            }
        });



    }



    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater mif = getMenuInflater();
        mif.inflate(R.menu.training_create_menu, menu);
        getActionBar().show();
        return super.onCreateOptionsMenu(menu);




    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // handle item selection
        switch (item.getItemId()) {
            case R.id.action_save:
                //add save functionality
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }
}

【问题讨论】:

    标签: java android sqlite listview android-fragments


    【解决方案1】:

    从 BaseAdapter 或 CursorAdapter 实现您的 DBAdapter。每当数据库中更新的数据调用 dataSetChanged 或 SwapeCursor 时,具体取决于您的实现。

    请参考以下链接进行实施。

    Cursor adapter and sqlite example

    How to update ListView in case of CursorAdapter usage?

    【讨论】:

      猜你喜欢
      • 2019-05-21
      • 1970-01-01
      • 2013-12-17
      • 1970-01-01
      • 1970-01-01
      • 2015-04-24
      • 2015-07-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多