【问题标题】:showing Data of data base in ListView in android在android的ListView中显示数据库的数据
【发布时间】:2015-03-15 14:47:44
【问题描述】:

我使用此代码,在我单击 AddActivity.java 中的“insertBTN”后,我的 MyActivity 类中的 ListView 中没有显示任何内容。请帮助我问题出在哪里,我该如何解决?非常感谢。

MyActivity.java:

 public class MyActivity extends Activity {
    private ListView listView;
    private DataBase myDB;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    myDB =new DataBase(this);
    ArrayList total =myDB.getAll();

    ArrayAdapter arrayAdapter = new ArrayAdapter(this,R.layout.list_item,total);

    listView = (ListView) findViewById(R.id.ListView);
    listView.setAdapter(arrayAdapter);

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener(){

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,long arg3) {
            // TODO Auto-generated method stub
            int id_To_Search = arg2 + 1;
            Bundle dataBundle = new Bundle();
            dataBundle.putInt("id", id_To_Search);
            Intent intent = new Intent(getApplicationContext(),AddActivity.class);
            intent.putExtras(dataBundle);
            startActivity(intent);
        }
    });
}

   //***************** Menu Button for filling DataBase
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.add, menu);
    return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item)
{   super.onOptionsItemSelected(item);
    switch(item.getItemId())
    {
        case R.id.add_menu:
            Bundle dataBundle = new Bundle();
            dataBundle.putInt("id", 0);
            Intent intent = new Intent(getApplicationContext(),AddActivity.class);
            intent.putExtras(dataBundle);
            startActivity(intent);
            return true;
        default:
            return super.onOptionsItemSelected(item);
    }
}

main.xml:

  <ListView android:layout_width="match_parent"
          android:layout_height="250dp"
          android:id="@+id/ListView"
          android:layout_gravity="right">
</ListView>

list_item.xml:(用于列表视图)

 <TextView android:layout_width="75dp"
          android:layout_height="200dp"
          android:id="@+id/total_vow_text"
          android:textColor="#ff6400"
          android:textSize="25sp"
          android:layout_gravity="right"/>

AddActivity.java:

 public class AddActivity extends Activity {
    private EditText addNUM;
    private EditText addTEXT ;

    private Button insertBTN;
    private Button deleteBTN;

    private DataBase myDB;
    private int id_To_Update=0;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.add_activity);
    myDB = new DataBase(this);

    addNUM = (EditText) findViewById(R.id.addNum);
    addTEXT  = (EditText) findViewById(R.id.addTEXT);

    insertBTN = (Button) findViewById(R.id.insert);
    deleteBTN = (Button) findViewById(R.id.deleteBTN);

    Bundle extras = getIntent().getExtras();
    if(extras !=null)
    {   int Value = extras.getInt("id");
        if(Value>0){
            //means this is the view part not the add contact part.
            Cursor rs = myDB.getData(Value);
            id_To_Update = Value;
            rs.moveToFirst();
            String number = rs.getString(rs.getColumnIndex(DataBase.TEST_COLUMN_NUMBER));
            String text = rs.getString(rs.getColumnIndex(DataBase.TEST_COLUMN_TEXT));

            if (!rs.isClosed()){
                rs.close();
            }
            addNUM.setText((CharSequence)number);
            addTEXT.setText((CharSequence)text);
        }
    }
}

public void run(View view){
    Bundle extras = getIntent().getExtras();
    if(extras !=null)
    {   int Value = extras.getInt("id");
        if(Value>0){
            if(myDB.updating(id_To_Update,addNUM.getText().toString(), addTEXT.getText().toString())){
                Toast.makeText(getApplicationContext(), "Updated", Toast.LENGTH_SHORT).show();
                Intent intent = new Intent(getApplicationContext(),MyActivity.class);
                startActivity(intent);
            }else{
                Toast.makeText(getApplicationContext(), "not Updated", Toast.LENGTH_SHORT).show();
            }
        }else{
            if(myDB.inserting(addNUM.getText().toString(), addTEXT.getText().toString())){
                Toast.makeText(getApplicationContext(), "done", Toast.LENGTH_SHORT).show();
            }else{
                Toast.makeText(getApplicationContext(), "not done", Toast.LENGTH_SHORT).show();
            }
            Intent intent = new Intent(getApplicationContext(),MyActivity.class);
            startActivity(intent);
        }
    }
}

add_activity.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:orientation="vertical"
          android:gravity="right"
          android:layout_gravity="center_horizontal"
          android:layout_width="match_parent"
          android:layout_height="match_parent"
          android:background="#000000">


<EditText android:layout_width="100dp"
          android:layout_height="50dp"
          android:layout_gravity="center_horizontal"
          android:gravity="right|center_vertical"
          android:id="@+id/addNum"
          android:hint="Type Number"
          android:layout_marginTop="10dp"
          android:layout_marginBottom="10dp"
          android:inputType="number"/>


<EditText android:layout_width="150dp"
          android:layout_height="50dp"
          android:hint="Type Text"
          android:layout_gravity="center_horizontal"
          android:gravity="right|center_vertical"
          android:id="@+id/addTEXT"
          android:layout_marginTop="10dp"
          android:layout_marginBottom="15dp"
          android:inputType="text"/>



<LinearLayout android:layout_width="wrap_content"
              android:layout_height="wrap_content"
              android:orientation="horizontal"
              android:layout_gravity="center_horizontal">

    <Button android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/deleteBTN"
            android:background="@android:drawable/ic_delete"
            />

    <Button android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/insert"
            android:background="@drawable/tick"
            android:onClick="run"/>


</LinearLayout>

最后是DataBase.java:

  public class DataBase extends SQLiteOpenHelper {
     public static final String DATABASE_NAME = "MyDBName.db";
     public static final String TABLE_NAME = "test";
     public static final String TEST_COLUMN_ID = "id";
     public static final String TEST_COLUMN_NUMBER = "number";
     public static final String TEST_COLUMN_TEXT = "text";

   public DataBase(Context context) {
    super(context, DATABASE_NAME, null, 1);
}

@Override
public void onCreate(SQLiteDatabase db) {
    // TODO Auto-generated method stub
    db.execSQL(
            "create table test " + "(id integer primary key, number text,text text)"
    );
}

@Override
public void onUpgrade(SQLiteDatabase db, int i, int i2) {
    // TODO Auto-generated method stub
    db.execSQL("DROP TABLE IF EXISTS TEST");
    onCreate(db);
}

public boolean inserting (String number, String text)
{   SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();

    contentValues.put("number", number);
    contentValues.put("text", text);

    db.insert("testing", null, contentValues);
    return true;
}

public Cursor getData(int id){
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor res =  db.rawQuery( "select * from tests where id="+id+"", null );
    return res;
}
public int numberOfRows(){
    SQLiteDatabase db = this.getReadableDatabase();
    int numRows = (int) DatabaseUtils.queryNumEntries(db, TABLE_NAME);
    return numRows;
}
public boolean updating (Integer id, String number, String text)
{   SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put("number", number);
    contentValues.put("text", text);
    db.update("testing", contentValues, "id = ? ", new String[] { Integer.toString(id) } );
    return true;
}

public Integer deleting (Integer id)
{   SQLiteDatabase db = this.getWritableDatabase();
    return db.delete("testing","id = ? ",
            new String[] { Integer.toString(id) });
}

     public ArrayList getAll(){
        ArrayList total = new ArrayList();
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor res =  db.rawQuery("select * from tests", null );
        res.moveToFirst();
     while(res.isAfterLast() == false){
        total.add(res.getString(res.getColumnIndex(TEST_COLUMN_TEXT)));
        res.moveToNext();
    } return total; }

更新: “getWritableDatabase”方法有问题, 当我按“编辑意图设置”时,此窗口将打开。

我也检查了我的SQLliteOpenHelper.class

// 从类文件生成的 IntelliJ API 反编译器存根源 // 方法的实现不可用

打包android.database.sqlite;

公共抽象类 SQLiteOpenHelper { public SQLiteOpenHelper(android.content.Context context, java.lang.String name, android.database.sqlite.SQLiteDatabase.CursorFactory factory, int version) { /* 编译代码 */ }

public SQLiteOpenHelper(android.content.Context context, java.lang.String name, android.database.sqlite.SQLiteDatabase.CursorFactory factory, int version, android.database.DatabaseErrorHandler errorHandler) { /* compiled code */ }

public java.lang.String getDatabaseName() { /* compiled code */ }

public void setWriteAheadLoggingEnabled(boolean enabled) { /* compiled code */ }

public android.database.sqlite.SQLiteDatabase getWritableDatabase() { /* compiled code */ }

public android.database.sqlite.SQLiteDatabase getReadableDatabase() { /* compiled code */ }

public synchronized void close() { /* compiled code */ }

public void onConfigure(android.database.sqlite.SQLiteDatabase db) { /* compiled code */ }

public abstract void onCreate(android.database.sqlite.SQLiteDatabase sqLiteDatabase);

public abstract void onUpgrade(android.database.sqlite.SQLiteDatabase sqLiteDatabase, int i, int i1);

public void onDowngrade(android.database.sqlite.SQLiteDatabase db, int oldVersion, int newVersion) { /* compiled code */ }

public void onOpen(android.database.sqlite.SQLiteDatabase db) { /* compiled code */ }

}

【问题讨论】:

  • 您是否在列表视图的适配器上调用了notifyDataSetChanged()
  • 不,我使用这个链接来编写这段代码; tutorialspoint.com/android/android_sqlite_database.htm
  • 那个教程很糟糕,非常糟糕。 notifyDataSetChanged() 不会在任何地方调用。修改数据库后,您必须执行myListView.getAdapter().notifyDataSetChanged() 之类的操作。
  • 哦!你能推荐我最好的教程吗?不知道这是什么方法?以及如何使用它?

标签: android database sqlite listview


【解决方案1】:

试试这样的:

public class MyActivity extends Activity {
     private ListView listView;
     private DataBase myDB;

     [some code left out]

     @Override
     public void onResume() {
         super.onResume();
         listView.getAdapter().notifyDataSetChanged();        
     }
}

【讨论】:

  • 我在 MyActivity 中写了这个。但无法识别“notifyDataSetChanged”。我没有单独的 ArrayAdapter 类。我在 MyActivity.java 类中引入了 ArrayAdapter。
  • @MinaDahesh,你所说的“不被识别”是什么意思?
  • 它的颜色是红色并显示此注释“无法解析此符号'notifyDataSetChanged'”。 (我使用 intelij)。当然我使用 ALT+ENTER 但没有任何反应。
  • 我读了它,关于 3 号我写了“arrayAdapter.notifyDataSetChanged();”但没有显示列表的项目!我该怎么办?
  • 你能给我推荐一个教程吗?
猜你喜欢
  • 2013-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-02
相关资源
最近更新 更多