经过许多教程后,我在我的Android应用程序中成功实现了数据库,除了一件事,一切正常。我的应用程序构建为接收文本消息(SMS)并将它们存储在数据库中,并在ListView上填充它们。当应用程序收到消息时,数据库会更新,但列表视图不会在该实例中更新,但在重新启动应用程序后,列表视图将填充数据库中的所有接收数据。请帮我解决这个问题。 这是我的代码片段: 主要课程
import android.os.Bundle;
import android.widget.ListView;
import com.example.bhash.database.Adapter;
import com.example.bhash.database.MessageData;
import com.example.bhashsms.adapters.DrawerAdapter;
import com.jeremyfeinstein.slidingmenu.lib.app.SlidingActivity;
public class Main extends SlidingActivity {
ListView dList, mList;
DrawerAdapter dAdapter;
static MessageData db;
static Adapter adapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setBehindContentView(R.layout.drawer);
init();
db = new MessageData(Main.this);
adapter = new Adapter(this);
mList.setAdapter(adapter);
}
private void init() {
getSlidingMenu().setBehindOffset(100);
dList = (ListView) findViewById(R.id.drawerlist);
mList = (ListView) findViewById(R.id.mainlist);
}
public static void update(String number, String body) {
// adapter.list.add(new Person_Data(number, body));
try {
db.open();
db.createEntry(number, body);
db.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
adapter.notifyDataSetChanged();
}
}
databasehelper class:
public class MessageData {
public static final String KEY_ROWID = "_id";
public static final String KEY_NUMBER = "phone_number";
public static final String KEY_MESSGAE = "message";
private static final String DATABASE_NAME = "Message";
private static final String DATABASE_TABLE = "SMS";
private static final int DATABASE_VERSION = 1;
private Helper helper;
private Context ourContext;
private SQLiteDatabase ourDatabase;
public MessageData(Context c) {
// TODO Auto-generated constructor stub
ourContext = c;
}
private static class Helper extends SQLiteOpenHelper {
public Helper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
try {
db.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" + KEY_ROWID
+ " INTEGER PRIMARY KEY AUTOINCREMENT, " + KEY_NUMBER
+ " TEXT NOT NULL, " + KEY_MESSGAE + " TEXT NOT NULL);");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
try {
db.execSQL("DROP TABLE IF EXIST " + DATABASE_TABLE);
onCreate(db);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public MessageData open() {
helper = new Helper(ourContext);
ourDatabase = helper.getWritableDatabase();
return this;
}
public void close() {
helper.close();
}
public long createEntry(String number, String message) {
ContentValues cv = new ContentValues();
cv.put(KEY_NUMBER, number);
cv.put(KEY_MESSGAE, message);
return ourDatabase.insert(DATABASE_TABLE, null, cv);
}
public List<Person_Data> getData() {
String[] columns = new String[] { KEY_ROWID, KEY_NUMBER, KEY_MESSGAE };
Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null,
null, null);
// int iRow = c.getColumnIndex(KEY_ROWID);
int iNumber = c.getColumnIndex(KEY_NUMBER);
int iMessage = c.getColumnIndex(KEY_MESSGAE);
Log.i("coaunt value",c.getCount()+"");
List<Person_Data> list = new ArrayList<Person_Data>();
c.moveToFirst();
for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
list.add(new Person_Data(c.getString(iNumber), c
.getString(iMessage)));
}
c.close();
return list;
}
}
Adapterclass:
public class Adapter extends BaseAdapter {
Context c;
LayoutInflater inflaterr;
public List<Person_Data> list = new ArrayList<Person_Data>();
public Adapter(Context c) {
this.c = c;
MessageData md = new MessageData(c.getApplicationContext());
md.open();
Person_Data datatData;
list = md.getData();
Log.i("dasdasdad", list.size()+"");
md.close();
inflaterr = LayoutInflater.from(this.c);
// TODO Auto-generated constructor stub
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return list.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return list.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ViewHolder holder = null;
View singleview = convertView;
if (convertView == null) {
singleview = inflaterr.inflate(R.layout.main_list_view, parent,
false);
holder = new ViewHolder(singleview);
singleview.setTag(holder);
}
else {
holder = (ViewHolder) singleview.getTag();
}
final Person_Data data = list.get(position);
holder.Number.setText(data.Number);
holder.callme.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
ExtractNumber(data.Message);
}
private void ExtractNumber(String src) {
StringBuilder builder = new StringBuilder();
int j = src.length();
for (int i = 0; i < j; i++) {
char c = src.charAt(i);
if (c == '+') {
builder.append(c);
for (int k = i; k < j; k++) {
char r = src.charAt(k);
if (!Character.isDigit(r)) {
i = k;
break;
}
builder.append(r);
}
if (builder.toString().length() > 8
&& builder.toString().length() < 14)
break;
}
}
Intent callIntent = new Intent(Intent.ACTION_CALL);
callIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
callIntent.setData(Uri.parse("tel:" + builder.toString()));
c.startActivity(callIntent);
}
});
return singleview;
}
class ViewHolder {
TextView Number, time;
ImageView callme;
public ViewHolder(View v) {
// TODO Auto-generated constructor stub
Number = (TextView) v.findViewById(R.id.rNum);
callme = (ImageView) v.findViewById(R.id.callbutton);
}
}
}