2016-05-14 4 views
0

Я создаю приложение для Android, которое содержит базу данных и listView для отображения элементов данных базы данных. В этом приложении пользователь может добавлять данные во время выполнения, используя кнопку (всплывающее окно) в том же макете панели действий. Чтобы создать добавленный элемент, мне нужно вызвать ту же активность. Моя проблема заключается в том, что всякий раз, когда пользователь добавляет данные я хочу, чтобы автоматически генерировать/обновить ListView без перезагрузки/вспомнить activity.Here является расположение изображения Please view imageКак обновить/автоматически обновить запрос списка без операции повторного вызова

Пусть это основная деятельность
Gradebook.java

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.grade_book); 
    toolbar=(Toolbar)findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 
    getSupportActionBar().setTitle("Grade Book"); 
    getSupportActionBar().setHomeButtonEnabled(true); 
    getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

    listView= (ListView) findViewById(R.id.gradeList); 
    grade_adapter=new Grade_Adapter(getApplicationContext(),R.layout.grade_book_listview1); 
    listView.setAdapter(grade_adapter); 
    registerForContextMenu(listView); 
    db_operation_helper=new Db_operation_helper(getApplicationContext()); 
    sqLiteDatabase=db_operation_helper.getReadableDatabase(); 
    cursor=db_operation_helper.grade_get(sqLiteDatabase); 
    if(cursor.moveToFirst()) 
    { 
     do { 
      String head; 
      head=cursor.getString(0); 
      DataProvider dataProvider=new DataProvider(head); 
      grade_adapter.add(dataProvider); 

     }while (cursor.moveToNext()); 
    } 
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      Toast.makeText(getBaseContext(),"YOU",Toast.LENGTH_LONG).show(); 
      view.setSelected(true); 
     } 
    }); 
} 

И вот поп -up (всплывает, когда пользователь нажимает кнопку добавления на панели действий)
Pop_up.java

public class Grade_pop extends AppCompatActivity { 

EditText semorclass; 
// Db_operation_helper grade_db_helper is the class of db opertion 
Db_operation_helper grade_db_helper; 
SQLiteDatabase sqLiteDatabase; 
Context context=this; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.grade_pop); 
    DisplayMetrics dm=new DisplayMetrics(); 
    getWindowManager().getDefaultDisplay().getMetrics(dm); 
    int width,height; 
    width=dm.widthPixels; 
    height=dm.heightPixels; 
    getWindow().setLayout((int) (width * .4), (int) (height * .155)); 
    semorclass= (EditText) findViewById(R.id.semester); 
} 
public void additems(View view){ 

    String sem=semorclass.getText().toString(); 
    grade_db_helper=new Db_operation_helper(context); 
    sqLiteDatabase=grade_db_helper.getWritableDatabase(); 

     grade_db_helper.grade_add(sem, sqLiteDatabase); 
     Toast.makeText(getBaseContext(), "Data is saved", Toast.LENGTH_LONG).show(); 
     grade_db_helper.close(); 
// Here i recall the activity by intent 
     startActivity(new Intent(this, Grade_book.class)); 
     finish(); 
} 

Здесь код Database.java (данные ввести классом контракта)

private static final String Database_name="database_name"; 
// db ver 
private static final int Database_version=1; 
private static final String Gradebook_Query= 
    "Create Table "+ UserContract.Gradebook_info.Grade_table_name+"("+ UserContract.Gradebook_info.Grade_head+" TEXT);"; 
@Override 
public void onCreate(SQLiteDatabase db) { 
    db.execSQL(Gradebook_Query); 
    Log.e("Database Operation", "Table Grade Book Created"); 
    db.execSQL(Monday_query); 
} 
public void grade_add(String head,SQLiteDatabase db) 
{ 
    ContentValues contentValues=new ContentValues(); 
//  UserContract class is a java class,Gradebook_info is inner 
class,Grade_table_name is the table name 
//  all taken from UserContract class 
    contentValues.put(UserContract.Gradebook_info.Grade_head, head); 
    db.insert(UserContract.Gradebook_info.Grade_table_name, null, contentValues); 
    Log.e("Database Operation", "One row is inserted into Gradebook"); 
} 
+0

вызывать 'notifyDataSetChanged();' после обновления данных в адаптере. –

+0

Когда вы делаете Toast «DATA SAVED», снова устанавливаетеAdapter в listview (также берете данные из базы данных). –

+0

http://stackoverflow.com/questions/20185273/update-listview-based-on-sqlite-backed-contentprovider – Pomagranite

ответ

0

Выполните одно это изменить вашу деятельность такой код:

@Override 
protected void onResume() { 
    super.onResume(); 

    listView.setAdapter(grade_adapter); 
    db_operation_helper=new Db_operation_helper(getApplicationContext()); 
    sqLiteDatabase=db_operation_helper.getReadableDatabase(); 
    cursor=db_operation_helper.grade_get(sqLiteDatabase); 
    if(cursor.moveToFirst()) 
    { 
     do { 
      String head; 
      head=cursor.getString(0); 
      DataProvider dataProvider=new DataProvider(head); 
      grade_adapter.add(dataProvider); 
      grade_adapter.notifyDataSetChanged(); 
     }while (cursor.moveToNext()); 
    } 

} 

protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.grade_book); 
toolbar=(Toolbar)findViewById(R.id.toolbar); 
setSupportActionBar(toolbar); 
getSupportActionBar().setTitle("Grade Book"); 
getSupportActionBar().setHomeButtonEnabled(true); 
getSupportActionBar().setDisplayHomeAsUpEnabled(true); 

listView= (ListView) findViewById(R.id.gradeList); 
grade_adapter=new Grade_Adapter(getApplicationContext(),R.layout.grade_book_listview1); 

registerForContextMenu(listView);  

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     Toast.makeText(getBaseContext(),"YOU",Toast.LENGTH_LONG).show(); 
     view.setSelected(true); 
    } 
}); 
} 

И не называйте startActivity() в вашем POP_UP. Измените addItems() следующим образом:

public void additems(View view){ 

String sem=semorclass.getText().toString(); 
grade_db_helper=new Db_operation_helper(context); 
sqLiteDatabase=grade_db_helper.getWritableDatabase(); 

    grade_db_helper.grade_add(sem, sqLiteDatabase); 
    Toast.makeText(getBaseContext(), "Data is saved", Toast.LENGTH_LONG).show(); 
    grade_db_helper.close(); 
    finish(); 
} 
+0

Я почти отлично работаю, кроме. Он отображает ранее добавленные данные, а в следующей строке отображает как ранее добавленные, так и новые данные. Он повторяет отображение данных предыдущего. –

+0

Я могу сделать это так, как я этого хочу. Спасибо. Я дал мне идею создать его. Мне нужно принять его. –

+0

Welcome Happy кодирование .. !! :) –

2

вы можете попробовать позвонить notifyDataSetChanged() в вашей listViewonResume(); на данный вид деятельности закончить поп-активность после вставки данных в SQLite.

как это

@Override 
public void onResume(){ 
super.onResume(); 
//here you can update the adapter just call notify methods 
grade_adapter.notifyDataSetChanged(); 

} 
+0

Это не работает. Я думаю, что нет новых изменений данных для уведомления. –

-2

, если вы хотите, чтобы обновить ListView затем вызвать grade_adapter.notifyDataSetChanged();

+0

вы можете прокомментировать это .. !! –