添加到数据库后,项目未显示在列表视图中

时间:2015-09-02 12:41:43

标签: android

我在数据库中添加项目后,只有在我重新启动应用程序后才显示这些项目。如何解决这个问题?我尝试过使用notifyDataSetChanged(),但不确定我是否做得好。

Fragment显示调用添加项活动的ListViewButton

    @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;

5 个答案:

答案 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();}