This is the problem. It is not possible to update the list after adding a row to the database.

Here the list is displayed and the context menu is called for it.

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_admin); ListView lv= (ListView) findViewById(R.id.lv); registerForContextMenu(lv); MyAdapter adapter=new MyAdapter(); adapter.notifyDataSetChanged(); adapter.context= this; adapter.list=GlobalVar.users; lv.setAdapter(adapter); } @Override public boolean onContextItemSelected(MenuItem item) { if (item.getItemId()==R.id.dob) { Intent intent= new Intent(AdminActivity.this,RegActivity.class); startActivity(intent); } return super.onContextItemSelected(item); } @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); MenuInflater inflater= getMenuInflater(); inflater.inflate(R.menu.menu,menu); } class MyAdapter extends BaseAdapter { ArrayList<User> list; Context context; @Override public int getCount() { return list.size(); } @Override public User getItem(int position) { return list.get(position); } @Override public long getItemId(int position) { return list.get(position).getId(); } @Override public View getView(int position, View convertView, ViewGroup parent) { View con= convertView; if(con== null) { LayoutInflater inflater= (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); con= inflater.inflate(R.layout.list_item,parent,false); } TextView loginTxt= (TextView) con.findViewById(R.id.userloginTxt); TextView nameTxt= (TextView) con.findViewById(R.id.usernameTxt); TextView passwordTxt= (TextView) con.findViewById(R.id.userpasswordTxt); loginTxt.setText(list.get(position).getLogin()); nameTxt.setText(list.get(position).getName()); passwordTxt.setText(list.get(position).getPassword()); return con; } } 

}

and here comes the addition of a new

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_reg); final EditText nameReg= (EditText) findViewById(R.id.editReg); final EditText passReg= (EditText) findViewById(R.id.editReg2); final EditText passReg2= (EditText) findViewById(R.id.editReg3); final EditText loginReg=(EditText) findViewById(R.id.editReg4); Button btnReg= (Button) findViewById(R.id.btmReg); Button btnReg2=(Button) findViewById(R.id.btmReg2); btnReg2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { finish(); } }); btnReg.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { User user= new User(); user.setLogin(loginReg.getText().toString()); user.setPassword(passReg.getText().toString()); user.setName(nameReg.getText().toString()); if (SaveData(user)) { finish(); } else { Toast.makeText(RegActivity.this,"Ошибка", Toast.LENGTH_LONG).show(); } } }); } boolean SaveData(User user) { DBHelper helper= new DBHelper(this); SQLiteDatabase db= helper.getWritableDatabase(); ContentValues cv= new ContentValues(); cv.put("login", user.getLogin()); cv.put("password", user.getPassword()); cv.put("name", user.getName()); long rowId= db.insert("user",null,cv); if (rowId>0) { return true; } return false; } 

What should be done so that after adding the list with data is updated ???

    1 answer 1

    You need to either use the SimpleCursorAdapter and call notifyDataSetChanged(); when adding data, or if you want to leave the BaseAdapter , then you need to make a static procedure that will re-create the adapter with new data.

    Here is the procedure:

     //Вам нужно будет ListView сделать static public static void refreshAdapter(Context ctx){ MyAdapter adapter = new MyAdapter(); adapter.notifyDataSetChanged(); adapter.context = ctx; adapter.list = GlobalVar.users; lv.setAdapter(adapter); } 

    And add to the button in 2 activites:

     if (SaveData(user)) { ВашПервыйАктивити.refreshAdapter(getApplicationContext()); finish(); } 
    • what to leave onCreate same ? - erma4elo
    • @ erma4elo you can leave the same thing, you can just starting everything with MyAdapter adapter=new MyAdapter(); remove and insert refreshAdapter(this); - Iman
    • I am shown here the error MyAdapter adapter = new MyAdapter (); here lv.setAdapter (adapter); and myself static - erma4elo
    • @ Iman, I can not understand this. Sorry if I just got it, I'm just starting - erma4elo
    • @ erma4elo and you declared your ListView as static ? Like this: static ListView lv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); lv = (ListView) findViewById(R.id.lv); } static ListView lv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); lv = (ListView) findViewById(R.id.lv); } static ListView lv; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); lv = (ListView) findViewById(R.id.lv); } - Iman