2017-01-10 58 views
0

我被困了几天,不幸的是不知道如何解决它。 我有DetailScreen.java显示数据从MainScreen(recyclerview的列表之一)。Put ID自动增量传递后2 ScreenActivity SQLite

  1. 我想这个代码,但没有效果,当我试图改变使用 COLUMN_NOMOR在我更新功能,我可以改变时改变nomor名字,但 收到错误。我想,它有权在我的更新函数中使用 COLUMN_ID,因为id是我的PK-AI。那么是否因为我没有在我的DetailScreen中调用COLUMN_ID而导致 ?但是我怎样在我的UpdateScreen中在我的DetailsS​​creen中调用我的 ID?

  2. 如果数据成功更新,屏幕将自动再次进入DetailScreen,但仍显示旧数据。我必须先到MainActivity才能获取新数据。我应该修改哪些代码?在我DBHandler.java

这里我更新功能

public int updateDataSiswa(Siswa siswa) { 
    SQLiteDatabase db = this.getWritableDatabase(); 

    ContentValues values = new ContentValues(); 
    values.put(COLUMN_NOMOR, siswa.getNomor()); 
    values.put(COLUMN_NAMA, siswa.getNama()); 

    return db.update(TABLE_SISWA, values, COLUMN_ID + " = ?", 
      new String[]{String.valueOf(siswa.getId())}); 
} 

这里DetailScreen.java

public class DetailScreen extends AppCompatActivity { 
     private TextView txt_resultnomor, txt_resultnama; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.screen_details); 

     //put data 
     Intent i = getIntent(); 
     final String id = i.getExtras().getString("id"); 
     final String nomor = i.getExtras().getString("nomor"); 
     final String nama = i.getExtras().getString("nama"); 

     //inisialisasi 
     txt_resultnomor = (TextView) findViewById(R.id.txt_resultnomor); 
     txt_resultnama = (TextView) findViewById(R.id.txt_resultnama); 

     //set 
     txt_resultnomor.setText(nomor); 
     txt_resultnama.setText(nama); 
    } 


    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_detail, menu); 
     return true; 
    } 
    public boolean onOptionsItemSelected(MenuItem item) { 
     int id = item.getItemId(); 

     if (id == R.id.action_edit) { 
      Intent in = new Intent(this, UpdateScreen.class); 
      in.putExtra("nomor", txt_resultnomor.getText().toString()); 
      in.putExtra("nama", txt_resultnama.getText().toString()); 
      startActivity(in); 
     } 
     if (id == R.id.action_delete) { 
      return true; 
     } 
     if (id == R.id.action_settings) { 
      // Intent i = new Intent(this, About.class); 
      //startActivity(i); 
     } 

     return super.onOptionsItemSelected(item); 
    } 



} 

然后在这里我UpdateScreen.java

public class UpdateScreen extends AppCompatActivity { 

    private EditText et_nomor; 
    private EditText et_nama; 

    private Button button_updatedata; 

    private DBHandler dbHandler; 
    private SiswaAdapter adapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_update_screen); 

     dbHandler = new DBHandler(this); 
     initComponents(); 
    } 
    private void initComponents(){ 
     et_nomor = (EditText) findViewById(R.id.et_nomor); 
     et_nama = (EditText) findViewById(R.id.et_nama); 

     //ambil data 
     Intent in=getIntent(); 
     final String id=in.getExtras().getString("id_siswa"); 
     final String nomor=in.getExtras().getString("nomor"); 
     final String nama=in.getExtras().getString("nama"); 

//set inisial 
     et_nomor.setText(nomor); 
     et_nama.setText(nama); 

     button_updatedata = (Button) findViewById(R.id.button_updatedata); 
     button_updatedata.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       validasiForm(); 
      } 
     }); 
    } 

    private void validasiForm() { 
     String form_nomor = et_nomor.getText().toString(); 
     String form_nama = et_nama.getText().toString(); 

     if (form_nomor.isEmpty()){ 
      et_nomor.setError("Nomor belum diisi"); 
      et_nomor.requestFocus(); 
     } 
     else if (form_nama.isEmpty()){ 
      et_nama.setError("Nama belum diisi"); 
      et_nama.requestFocus(); 
     } 
     else { 
      dbHandler.updateDataSiswa(new Siswa(form_nomor, form_nama)); 

      List<Siswa> siswaList = dbHandler.getSemuaSiswa(); 
      adapter = new SiswaAdapter(siswaList); 
      adapter.notifyDataSetChanged(); 
      Toast.makeText(UpdateScreen.this, "Berhasil Memperbarui Data Siswa", Toast.LENGTH_SHORT).show(); 
      MainSiswaActivity.mma.refresh(); 
      finish(); 
     } 
    } 
} 

我希望我讲清楚,请帮助我。谢谢。

回答

0

你打电话给你给出的更新方法public int updateDataSiswa(Siswa siswa) ..?也基于你提供的...你的notifyDataSetChanged()适配器只是试图更新RecyclerView .. 的列表视图,但它不明白底层数据已经改变了它..你需要为你的数据库处理程序创建一个方法在这里你可以获取新records..and的名单,然后用这个方法来更新它的适配器,然后设置新的适配器到您的ListView在validasiForm()方法.. 请这对于更多的细节... Android ListView not refreshing after notifyDataSetChanged

+0

对不起,我编辑了我的代码。我在UpdateScreen中调用'updateDataSiswa'。你能不能带我先修理我的更新代码,请问?我犯了这个错误:(@saurabh – Riris