【问题标题】:Listview not displaying the data which is stored in databaseListview不显示存储在数据库中的数据
【发布时间】:2020-10-12 13:52:05
【问题描述】:

我无法在列表视图中显示数据。在对话框中,用户输入项目并单击保存按钮,它将数据存储在 sqlite 数据库中,但不显示在列表视图中。当我移动到MainActivity.java 并返回到AddCount.java 时,它会显示存储在 sqlite 数据库中的项目。用户单击对话框中的保存后,如何在列表视图中显示该项目

public class AddCount extends AppCompatActivity {
   ArrayList<User>userList;
   User user;
   DbHandler myDB;
   Cursor data;
   int numRows;
    Two_columnListAdapter adapter;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add_count);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        ListView listView = (ListView)findViewById(R.id.listview);
        myDB = new DbHandler(this);
        userList = new ArrayList<>();
        data = myDB.getListContents();
         numRows = data.getCount();
        if (numRows == 0) {
                Toast.makeText(AddCount.this, "There is nothing in database", Toast.LENGTH_LONG).show();
            } else {
                while (data.moveToNext()) {
                    user = new User(data.getString(1), data.getString(2));
                    userList.add(user);
                }
            }

           adapter = new Two_columnListAdapter(this,R.layout.list_item_layout,userList);
        listView.setAdapter(adapter);
        FloatingActionButton fab = findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                openDialog();
            }
        });

    }

    public void openDialog() {
final AlertDialog.Builder mydialog = new AlertDialog.Builder(AddCount.this);
mydialog.setTitle("Add Count");
LinearLayout layout = new LinearLayout(AddCount.this);
layout.setOrientation(LinearLayout.VERTICAL);
final EditText title = new EditText(AddCount.this);
title.setHint("Title");
layout.addView(title);
final EditText value = new EditText(AddCount.this);
value.setHint("Count");
layout.addView(value);
mydialog.setView(layout);

        mydialog.setPositiveButton("Save", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
               String UserTitle = title.getText().toString();
               String UserCount = value.getText().toString();
               if (UserTitle.length()!= 0 && UserCount.length() != 0) {
                   AddData(UserTitle,UserCount);
                   title.setText("");
                   value.setText("");
                   adapter.notifyDataSetChanged();
               }
               else {
                   Toast.makeText(AddCount.this ,"Empty!",Toast.LENGTH_SHORT).show();
               }
            }
        }).create();
        mydialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
                dialogInterface.cancel();
            }
        }).create();

mydialog.show();

    }
    public void AddData(String title,String count){
        boolean insertData = myDB.insertUserInputs(title, count);
        if (insertData==true){
            Toast.makeText(AddCount.this ,"Saved",Toast.LENGTH_SHORT).show();
        }
        else {
            Toast.makeText(AddCount.this ,"Some thing went wrong",Toast.LENGTH_SHORT).show();
        }
    }


}

DbHandler.java(创建和管理数据库)

public class DbHandler extends SQLiteOpenHelper {       
    private static final int DB_VERSION = 1;
    private static final String DB_NAME = "users.db";
    private static final String TABLE_Inputs = "userinputs";
    private static final String KEY_ID = "id";
    private static final String KEY_Title = "Title";
    private static final String KEY_Count = "Count";


    public DbHandler(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        // Create a new table
        String CREATE_TABLE = "CREATE TABLE " + TABLE_Inputs + "(ID INTEGER PRIMARY KEY AUTOINCREMENT," + "Title,Count)";
        db.execSQL(CREATE_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // Drop older table if exist
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_Inputs);
        // Create tables again
        onCreate(db);
    }

    
    public boolean insertUserInputs(String UserTitle, String UserCount) {
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put(KEY_Title, UserTitle);
        contentValues.put(KEY_Count, UserCount);
        long newRowId = db.insert(TABLE_Inputs, null, contentValues);
        if (newRowId == -1){
            return false;
        }
        else {
            return true;
        }
    }


    public Cursor getListContents(){
SQLiteDatabase db = this.getWritableDatabase();
Cursor data =  db.rawQuery("SELECT * FROM " + TABLE_Inputs,null);
return data;
    }

}

Two_columnListAdapter.java

public class Two_columnListAdapter extends ArrayAdapter<User> {
    private LayoutInflater layoutInflater;
    private ArrayList<User>users;
    private int mviewResourceId;
    public Two_columnListAdapter(Context context,int textViewResourceId,ArrayList<User>users){
        super(context,textViewResourceId,users);
        this.users = users;
        layoutInflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        mviewResourceId = textViewResourceId;
    }
    public View getView(int position, View convertView, ViewGroup parents){
        convertView = layoutInflater.inflate(mviewResourceId,null);
        User user= users.get(position);
        if (user != null){
            TextView  text = (TextView)convertView.findViewById(R.id.title);
            TextView num = (TextView)convertView.findViewById(R.id.value);
            if (text != null){
                text.setText(user.getText());
            }
            if (num != null){
                num.setText(user.getNum());
            }
        }
        return convertView;
    }
}

【问题讨论】:

    标签: sqlite listview


    【解决方案1】:

    您不会通过适配器将任何内容添加到列表中,也不会在将数据保存到数据库时直接将任何内容添加到列表中。 您应该通过适配器将项目添加到列表中: adapter.add(someItem);

    或者您可以将项目添加到列表中,然后调用notifyDataSetChanged

    userlist.add(user);
    adapter.notifyDataSetChanged();
    

    在您的 OnClickListener 中,通过适配器将用户添加到列表中...

            mydialog.setPositiveButton("Save", new DialogInterface.OnClickListener() {
            @Override
            public void onClick(DialogInterface dialogInterface, int i) {
               String UserTitle = title.getText().toString();
               String UserCount = value.getText().toString();
               if (UserTitle.length()!= 0 && UserCount.length() != 0) {
                   AddData(UserTitle,UserCount);
                   title.setText("");
                   value.setText("");
                   
                   adapter.add(new User(....));
                   ...
    

    查看this 适配器上的答案。

    【讨论】:

    • 实际上,我已经尝试在我的 OnClickListener 中添加 adapter.add(user) 它只是重复我上次插入的内容,而不是在列表视图中显示新添加的项目。当我转到 MainActivity 并返回到 listview 时,它会显示新项目。
    • 你也可以发布 Two_columnListAdapter 吗?
    • 我发布了我的 Two_columnListAdapter.java
    • 当您切换到 MainActivity 并返回到 AddCount 活动时,将调用 onCreate 来填充 ListView。而且,在您发布的代码中,您既没有对适配器进行修改,也没有对适配器持有的列表进行修改。没有它,列表视图肯定不会改变,所以你应该在某个点调用 adapter.Add(user) 。此外,您不需要将列表存储在 Two_columnListAdapter 中,因为基类 ArrayAdapter 这样做,您在调用 super 时在基类中设置。您可以通过调用基类的 getItem(position) 在 getView 中获取您的项目。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-04
    • 2013-08-14
    相关资源
    最近更新 更多