我在数据库中添加项目后,只有在我重新启动应用程序后才显示这些项目。如何解决这个问题?我尝试过使用notifyDataSetChanged()
,但不确定我是否做得好。
Fragment
显示调用添加项活动的ListView
和Button
:
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v =inflater.inflate(R.layout.tab_1,container,false);
Button button = (Button)v.findViewById(R.id.button2);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(getActivity(), NewData.class);
startActivityForResult(intent, 0);}});
listView = (ListView)v.findViewById(R.id.listView);
listDataAdapter = new ListDataAdapter(getActivity().getApplicationContext(),R.layout.row_layout);
listView.setAdapter(listDataAdapter);
userDbHelper = new UserDbHelper (getActivity().getApplicationContext());
sqLiteDatabase = userDbHelper.getReadableDatabase();
cursor = userDbHelper.getInformations(sqLiteDatabase);
if(cursor.moveToFirst()){
do {
String nr1, nr2, nr3;
nr1 = cursor.getString(0);
nr2 = cursor.getString(1);
nr3 = cursor.getString(2);
DataProvider dataProvider = new DataProvider(nr1, nr2, nr3);
listDataAdapter.add(dataProvider);}
while (cursor.moveToNext());}
添加项目活动:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.additemactivity);
number_1 = (EditText)findViewById(R.id.number11);
number_2 = (EditText)findViewById(R.id.number12);
number_3 = (EditText)findViewById(R.id.number13);
Button button1=(Button)findViewById(R.id.shtobtn);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String number1 = number_1.getText().toString();
String number2 = number_2.getText().toString();
String number3 = number_3.getText().toString();
userDbHelper = new UserDbHelper(context);
sqLiteDatabase = userDbHelper.getWritableDatabase();
userDbHelper.addInformations(number1, number2, number3, sqLiteDatabase);
Toast.makeText(getBaseContext(),"Data Saved",Toast.LENGTH_SHORT).show();
userDbHelper.close();
Intent intent=new Intent();
setResult(RESULT_OK, intent);
finish();}});
列出数据适配器:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
LayoutHandler layoutHandler;
if (row == null){
LayoutInflater layoutInflater =(LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = layoutInflater.inflate(R.layout.row_layout,parent,false);
layoutHandler = new LayoutHandler();
layoutHandler.NUMER1=(TextView)row.findViewById(R.id.number11);
layoutHandler.NUMER2=(TextView)row.findViewById(R.id.number12);
layoutHandler.NUMER3=(TextView)row.findViewById(R.id.number13);
row.setTag(layoutHandler);}
else { layoutHandler = (LayoutHandler)row.getTag();}
DataProvider dataProvider = (DataProvider)this.getItem(position);
layoutHandler.NUMER1.setText(dataProvider.getNum1());
layoutHandler.NUMER2.setText(dataProvider.getNum2());
layoutHandler.NUMER3.setText(dataProvider.getNum3()); return row;
答案 0 :(得分:0)
在列表更新后添加listView.notifyDataSetChanged();
。
答案 1 :(得分:0)
在适配器类中创建一个公共方法,即notifyDataSetChanged()
答案 2 :(得分:0)
如果您正在使用SQLite DB然后自动将更新的数据库值填充到列表视图中,则应使用CursorAdapter扩展自定义适配器。一旦你在光标中获取数据,它将自动显示更新的值;
public class CustomAdapter extends CursorAdapter {
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
return LayoutInflater.from(context).inflate(R.layout.your_list_item, parent, false);
// return null;
}
@Override
public Object getItem(int position) {
return super.getItem(position);
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
}
}
答案 3 :(得分:0)
在你的片段中
private SharedPreferences.Editor editor;
private SharedPreferences sharedpreferences;
UpdatingReceiver updatingReceiver;
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View v =inflater.inflate(R.layout.tab_1,container,false);
sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context);
editor = sharedpreferences.edit();
editor.putString("some unique key", name);
String name = "Inside";
}
@Override
protected void onPause() {
super.onPause();
editor = sharedpreferences.edit();
String name = "Outside";
editor.putString("some unique key", name);
editor.commit();
}
@Override
protected void onStart() {
super.onStart();
updatingReceiver = new UpdatingReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("updating receiver unique key");
registerReceiver(updatingReceiver, intentFilter);
}
@Override
protected void onStop() {
super.onStop();
unregisterReceiver(updatingReceiver);
}
class UpdatingReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//list all the data
//set adapter
//notifyDataSetChanged
}
}
因此,您可以了解您是在片段内还是片段外。基于此,您应该从您的活动中触发。
在你的Activity中,在db中添加代码后,只需根据内部或外部调用接收器。所以它会立即更新。
private SharedPreferences.Editor editor;
private SharedPreferences sharedpreferences;
sharedpreferences = PreferenceManager.getDefaultSharedPreferences(this);
String prefsString = sharedpreferences.getString("some unique key", "");
if (prefsString=="Inside")
{
Intent broadCast = new Intent();
broadCast.setAction("updating receiver unique key");
sendBroadcast(broadCast);
}
答案 4 :(得分:0)
解决方案:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {adapter.notifyDataSetChanged();}