1

I'm new to Android Sqlite DB Dev't so I need your help guys. I was able to do the basic CRUD operations. Now I want to know how to refresh the listview to display the newly added data. I've looked into adapter.notifyDataSetChanged but I wonder why it's not working for me. Here's what I've tried so far

   private void initControls() {

    SearchAuto = (AutoCompleteTextView)findViewById(R.id.autoCompleteTextView1);
    String[] SearchItems = getResources().getStringArray(R.array.DogSearch);
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,R.layout.searchitems,SearchItems);
    SearchAuto.setAdapter(adapter);
    SearchAuto.setThreshold(0);

    search = (Button) findViewById (R.id.handle);
    search.setOnClickListener(this);
    lv = (ListView) findViewById (R.id.lv);

    values = dbHelper.getAllAnimals(ANIMALTYPE);
    for (int i = 0; i < values.length; i++) {
        lvAdapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, values);
        lv.setAdapter(lvAdapter);
    }

    // TODO onItemClick
    lv.setOnItemClickListener(new OnItemClickListener() {

        public void onItemClick(AdapterView<?> parent, View v, int position, long id)
         {
            String strDog = parent.getItemAtPosition(position).toString();

            Intent i = new Intent(DogClass.this, Dogs.class);
            i.putExtra("dog_name", strDog);
            startActivity(i);    
            finish();
         }
    });

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.addanimal, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    // get prompt_addprayer.xml view
    LayoutInflater li = LayoutInflater.from(this);
    View promptsView = li.inflate(R.layout.prompt_addanimal, null);

    AlertDialog.Builder alertDialogBuilder = 
            new AlertDialog.Builder(this);

    // set prompts.xml to alertdialog builder
    alertDialogBuilder.setView(promptsView);

    final EditText etBreed = (EditText) promptsView
            .findViewById(R.id.etBreed);

    final EditText etDescription = (EditText) promptsView
            .findViewById(R.id.etDescription);

    final EditText etDiet = (EditText) promptsView
            .findViewById(R.id.etDiet);

    final EditText etShelter = (EditText) promptsView
            .findViewById(R.id.etShelter);

    final EditText etHygiene = (EditText) promptsView
            .findViewById(R.id.etHygiene);

    final EditText etMedication = (EditText) promptsView
            .findViewById(R.id.etMedication);

    // set dialog message
    alertDialogBuilder
            .setCancelable(false)
            .setPositiveButton("OK",
                    new DialogInterface.OnClickListener() {
                        public void onClick(
                                DialogInterface dialog,
                                int id) {

                            String strAnimalType = ANIMALTYPE;
                            String strBreed = etBreed.getText().toString();
                            String strDesc = etDescription.getText().toString();
                            String strDiet = etDiet.getText().toString();
                            String strShelter = etShelter.getText().toString();
                            String strHygiene = etHygiene.getText().toString();
                            String strMedication = etMedication.getText().toString();

                                dbHelper.addAnimalInfo(strAnimalType, strDesc, 
                                        strDiet, strShelter, strHygiene, strMedication, strBreed);
                                Toast.makeText(DogClass.this, "Data has been added successfully!",
                                        Toast.LENGTH_SHORT).show();

                                lvAdapter.notifyDataSetChanged();
                        }

                    })
            .setNegativeButton("Cancel",
                    new DialogInterface.OnClickListener() {
                        public void onClick(
                                DialogInterface dialog,
                                int id) {
                            dialog.cancel();
                        }
                    });

    // create alert dialog
    AlertDialog alertDialog = alertDialogBuilder.create();
    // show it
    alertDialog.show();
    return true;



}

Any ideas? I really need to get this working. Thanks

Dunkey
  • 1,900
  • 11
  • 42
  • 72
  • 1
    What this loop for: for (int i = 0; i < values.length; i++)!remove it. and keep what inside it – hasan Oct 05 '13 at 10:54

1 Answers1

1
dbHelper.addAnimalInfo(strAnimalType, strDesc, strDiet, strShelter, strHygiene, strMedication, strBreed);
Toast.makeText(DogClass.this, "Data has been added successfully!",
                                        Toast.LENGTH_SHORT).show();

lvAdapter.notifyDataSetChanged();

This is where you lacked. What you did is, you just inserted data into database, still you are remaining to bring data from database and bind it with adapter, and after that you may call notifyDataSetChanged();, and you'll achieve what you want...

Try this:

dbHelper.addAnimalInfo(strAnimalType, strDesc, strDiet, strShelter, strHygiene, strMedication, strBreed);
    Toast.makeText(DogClass.this, "Data has been added successfully!",
                                            Toast.LENGTH_SHORT).show();
values = dbHelper.getAllAnimals(ANIMALTYPE);
lvAdapter.clear();
lvAdapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, values);

    lvAdapter.notifyDataSetChanged();

Note: you should not write this way. Your code:

for (int i = 0; i < values.length; i++) {
        lvAdapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, values);
        lv.setAdapter(lvAdapter);
    }

If your getAllAnimals() method is returning an arrayList then you simply need to:

lvAdapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1, values);
        lv.setAdapter(lvAdapter);

The last argument of your ArrayAdapter constructor needs List<Item> to be passed. And then just call setAdapter(adapter) of ListView.

For more clarification, refer this SO link: notifyDataSetChanged example http://androidadapternotifiydatasetchanged.blogspot.in

Community
  • 1
  • 1
Chintan Soni
  • 24,761
  • 25
  • 106
  • 174