0

I am Facing a problem in setting a ListView in android . Everything works ok but it is not setting the way i want it to set . here are the images whats happening

Inserting data to listview and sqlite

Retrieving data from sqlite to listview

when i add the data it displays fine and inserts the data accurately but when i go back and then again starts the activity , it retrieves the data and displays it in single row of listview .

1)i want to display the data each entry on different items of listview . i don't know how can i achieve it .

2)when i start the activity it should display all database entries and when i add the new item it should append with the previous list . but what actually happening is when there are already 3 records showing and i add one more record it displays the single record last added . previously added records are gone . i don't know why they are not displaying .

here is my code :

public class noticall extends ListActivity {


    CustomDateTimePicker custom;
    TextView tv,tv1;
    EditText ed;
    String store;
    static String Names;
    public static final int PICK_CONTACT = 1;
    String [] adi ;
    String [] adi1 ;
    String [] adi2 ;
    String [] adi3 ;
    static int incre=0;
    ArrayList<String> myrows = new ArrayList<String>();
    ArrayList<String> time1 = new ArrayList<String>();
    ArrayList<String> name1 = new ArrayList<String>(); 
    ArrayList<String> number1 = new ArrayList<String>();
    private PendingIntent pendingIntent;
    ListView listview;
    String temp1 ,temp2 ;
    int x=0; 
    OnItemClickListener listener;
    String Date,Time,Name,Number;
    MyNotiAdapter adp;


    private SQLiteAdapter mySQLiteAdapter = new SQLiteAdapter(noticall.this);



        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.notify);
            listview = (ListView) findViewById(android.R.id.list);

           listview.setDividerHeight(2);



    custom = new CustomDateTimePicker(noticall.this,new CustomDateTimePicker.ICustomDateTimeListener() {

               @Override
               public void onCancel() { 
                   finish();
               }


               @Override
               public void onSet(Dialog dialog, Calendar calendarSelected,Date dateSelected, int year, String monthFullName,
                            String monthShortName, int monthNumber, int date,
                            String weekDayFullName, String weekDayShortName,
                            int hour24, int hour12, int min, int sec,
                            String AM_PM) {

                      Calendar calendar =  Calendar.getInstance();
                      calendar.set(year, monthNumber, date, hour24,  min, 0);

                      long when = calendar.getTimeInMillis();         // notification time

                      Intent myIntent = new Intent(noticall.this, MyReceiver.class);
                      pendingIntent = PendingIntent.getBroadcast(noticall.this, 0, myIntent,0);

                      AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
                      alarmManager.set(AlarmManager.RTC, calendar.getTimeInMillis(), pendingIntent);


        Date = calendarSelected.get(Calendar.DAY_OF_MONTH) + "/" + (monthNumber+1) + "/" +year; 
        Time = hour12 + ":" + min + " " + AM_PM;


        setlisto(Date);


        //Toast.makeText(noticall.this, store, Toast.LENGTH_SHORT).show();

           }
    });      



            custom.set24HourFormat(false);
            custom.setDate(Calendar.getInstance());



                findViewById(R.id.button_date).setOnClickListener(
                    new OnClickListener() {
                        @Override
                        public void onClick(View v) {



                        Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
                        startActivityForResult(intent,PICK_CONTACT);
                        custom.showDialog();
                        incre++;
                        }
                    });



                read_db();

    }




     @Override
     protected void onActivityResult(int requestCode, int resultCode, Intent data)
     {
       super.onActivityResult(requestCode, resultCode, data);

        if(resultCode != RESULT_CANCELED){

            if (requestCode == 1)
            {
                // Get the URI that points to the selected contact
                Uri contactUri = data.getData();

                // We only need the NUMBER column, because there will be only one row in the result
                String[] projection = {ContactsContract.CommonDataKinds.Phone.NUMBER, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.CONTACT_ID};

                String[] segments = contactUri.toString().split("/");
                String id = segments[segments.length - 1];

                // Perform the query on the contact to get the NUMBER column
                // We don't need a selection or sort order (there's only one result for the given URI)
                // CAUTION: The query() method should be called from a separate thread to avoid blocking
                // your app's UI thread. (For simplicity of the sample, this code doesn't do that.)
                // Consider using CursorLoader to perform the query.
                Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, projection, null, null, null);
                cursor.moveToFirst();
                while (!cursor.isAfterLast())
                {
                    int cid = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID);
                    String contactid = cursor.getString(cid);

                    if (contactid.equals(id))
                    {
                        // Retrieve the phone number from the NUMBER column
                        int column = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
                        String number = cursor.getString(column);

                        // Retrieve the contact name from the DISPLAY_NAME column
                        int column_name = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);
                        String name = cursor.getString(column_name);

                        // Do something with the phone number...
                       // Toast.makeText(this, "I added the Contact: \n" + name + " " + number, Toast.LENGTH_SHORT).show();

                       // ed.setText(name+" - "+number);

                      Name=  Names=name;
                      Number =number;  



                    }

                 cursor.moveToNext();
                }
                cursor.close();


               }
            }
        }


     public void setlisto(String one ){



    // Log.e("setlistoo",one+"");
     myrows.add(one);
     time1.add(Time);
     name1.add(Name);
     number1.add(Number);

      adi=myrows.toArray(new String[myrows.size()]);
     adi1=time1.toArray(new String[time1.size()]);
     adi2=name1.toArray(new String[name1.size()]);
     adi3=number1.toArray(new String[number1.size()]);
     x++;
     listview.setAdapter(new MyNotiAdapter(noticall.this, adi,adi1,adi2,adi3));



     Log.i("a=",one+"");

     Log.i("b=",Time+"");

     Log.i("c=",Name+"");

     Log.i("d=",Number+"");



     mySQLiteAdapter = new SQLiteAdapter(noticall.this);
     mySQLiteAdapter.openToWrite();

     mySQLiteAdapter.insert(one,Time,Name,Number);


     mySQLiteAdapter.close();


  }
     public void del_db(){

         mySQLiteAdapter = new SQLiteAdapter(noticall.this);
         mySQLiteAdapter.openToWrite();

         mySQLiteAdapter.deleteAll();

     }



     public void read_db(){

         Log.e("jsahbdv", "munda agaya medaan men hay jamaalo");


            mySQLiteAdapter.openToRead();

            Cursor cursor = mySQLiteAdapter.getAllData();

            startManagingCursor(cursor);

            String[] from = new String[]{SQLiteAdapter.KEY_Name,SQLiteAdapter.KEY_Number,SQLiteAdapter.KEY_Date,SQLiteAdapter.KEY_Time};
            int[] to = new int[]{R.id.dato,R.id.tym,R.id.person,R.id.edu};

           SimpleCursorAdapter cursorAdapter = new SimpleCursorAdapter(noticall.this, R.layout.row2, cursor, from, to);



           while (cursor.moveToNext()){



               cursor.getString(0);
               cursor.getString(1);
               cursor.getString(2);
               cursor.getString(3);
               cursor.getString(4);



            /*   strBfr.append("Id :"+ cursor.getString(0) + "\n");
               strBfr.append("Name:" + cursor.getString(1) + "\n");
               strBfr.append("Number:" +cursor.getString(2) + "\n");
               strBfr.append("Date:" + cursor.getString(3) + "\n");
               strBfr.append("Time:" + cursor.getString(4) + "\n");

             */  

               Log.i("Error", cursor.getString(0)+"");
               Log.i("Error", cursor.getString(1)+"");
               Log.i("Error", cursor.getString(2)+"");
               Log.i("Error", cursor.getString(3)+"");
               Log.i("Error 8", cursor.getString(4)+"");


               listview.setAdapter(cursorAdapter);

     }

     }


}

sqlite adapter class:

public class SQLiteAdapter {

    public static final String MYDATABASE_NAME = "notidb.db";
    public static final String MYDATABASE_TABLE = "MY_TABLE";
    public static final int MYDATABASE_VERSION = 1;
    public static final String KEY_ID = "_id";
    public static final String KEY_Name = "Name";
    public static final String KEY_Number = "Number";
    public static final String KEY_Date = "Date";
    public static final String KEY_Time = "Time";



    //create table MY_DATABASE (ID integer primary key, Content text not null);
    private static final String SCRIPT_CREATE_DATABASE =
        "create table " + MYDATABASE_TABLE + " ("
        + KEY_ID + " integer primary key autoincrement, "
        + KEY_Name + " text not null, " 
        + KEY_Number + " text not null, " 
        + KEY_Date + " text not null, " 
        + KEY_Time + " text not null);";


    private SQLiteHelper sqLiteHelper;
    private SQLiteDatabase sqLiteDatabase;

    private Context context;

    public SQLiteAdapter(Context c){
        context = c;
    }

    public SQLiteAdapter openToRead() throws android.database.SQLException {
        sqLiteHelper = new SQLiteHelper(context, MYDATABASE_NAME, null, MYDATABASE_VERSION);
        sqLiteDatabase = sqLiteHelper.getReadableDatabase();
        return this;    
    }

    public SQLiteAdapter openToWrite() throws android.database.SQLException {
        sqLiteHelper = new SQLiteHelper(context, MYDATABASE_NAME, null, MYDATABASE_VERSION);
        sqLiteDatabase = sqLiteHelper.getWritableDatabase();
        return this;    
    }

    public void close(){
        sqLiteHelper.close();
    }

    public long insert(String content,String content1,String content2,String content3){

        ContentValues contentValues = new ContentValues();
        contentValues.put(KEY_Name, content.toString());
        contentValues.put(KEY_Number, content1.toString());
        contentValues.put(KEY_Date, content2.toString());
        contentValues.put(KEY_Time, content3.toString());
        return sqLiteDatabase.insert(MYDATABASE_TABLE, null, contentValues);


    }

    public int deleteAll(){
        return sqLiteDatabase.delete(MYDATABASE_TABLE, null, null);
    }

    public Cursor queueAll(){
        String[] columns = new String[]{KEY_ID, KEY_Name, KEY_Number, KEY_Date, KEY_Time};
        Cursor cursor = sqLiteDatabase.query(MYDATABASE_TABLE, columns,null, null, null, null, null);

        return cursor;
    }


    public Cursor getAllData()
    {
        SQLiteDatabase db= sqLiteHelper.getWritableDatabase();
        Cursor res=db.rawQuery("select * from "+MYDATABASE_TABLE,null);

        return res;
    }

    public class SQLiteHelper extends SQLiteOpenHelper {

        public SQLiteHelper(Context context, String name,
                CursorFactory factory, int version) {
            super(context, name, factory, version);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            // TODO Auto-generated method stub
            db.execSQL(SCRIPT_CREATE_DATABASE);
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // TODO Auto-generated method stub

             // Drop older table if existed
            db.execSQL("DROP TABLE IF EXISTS " + MYDATABASE_TABLE);

            // Create tables again
            onCreate(db);

        }

    }

}

related to this = Android Store Listview data in SQlite database and retrieve data oncreate of activity in Listview

how can i set this problem or how can i read rows according to ids and then set to listview .. please help me guys..

Community
  • 1
  • 1
Addi.Star
  • 475
  • 2
  • 15
  • 36
  • Your sqlite adapter class is not an Adapter... And it should extend SqliteOpenHelper preferably... Anyways, it's not clear what the problem is without maybe the XML layout? – OneCricketeer Jul 18 '16 at 13:32
  • Also, why do you have `getContentResolver().query(ContactsContract`? That's not doing anything is it? – OneCricketeer Jul 18 '16 at 13:36
  • SqliteOpenHelper is initialized inside the sqlite class. and getContentResolver().query(ContactsContract is used for picking contacts and getting their names and numbers. – Addi.Star Jul 18 '16 at 14:32

1 Answers1

2

You are using multiple adapters in your list view.

listview.setAdapter(new MyNotiAdapter(noticall.this, adi,adi1,adi2,adi3));

And later

listview.setAdapter(cursorAdapter);

While, yes, the code runs, you are seeing some unexpected results.

For example, that second image looks like you are displaying an Arraylist in one row instead of an element per row.

And that is probably caused by this line where you toString some arraylists

mySQLiteAdapter.insert(myrows.toString(),time1.toString(),name1.toString(),number1.toString());

So, my suggestion is use one adapter (probably just a CursorAdapter since you are using SQLite) to display your data. And you can setAdapter only once inside onCreate and never need to set it again. You only reload the cursor.

Another thing to note. Don't iterate on the cursor after you add it to an adapter. Because the adapter reads the cursor and displays its contents, then you are later exhausting the iterator.

Cursor cursor = mySQLiteAdapter.getAllData();
startManagingCursor(cursor);
// ...
SimpleCursorAdapter cursorAdapter = new SimpleCursorAdapter(noticall.this, R.layout.row2, cursor, from, to);

while (cursor.moveToNext()){ // <--- This is bad
OneCricketeer
  • 179,855
  • 19
  • 132
  • 245
  • I'm not sure what you need an example of, but start by fixing the removal of the `MyNotiAdapter` and don't toString the arraylists when you insert them into the database, and instead add each element in a for loop – OneCricketeer Jul 18 '16 at 14:39
  • arraylist.tosrting are just string which i want to add into database . and MyNotiAdapter is important as i am using it to show the added entries . and later cursor adapter is used to show the data retrieved from sqlite . you can provide me the example of retrieving multiple columns of sqlite into listviews – Addi.Star Jul 18 '16 at 14:47
  • i have changed the code according to your suggestion now it is not showing repeating entries but it reads only one record . can i use MynotiAdapter for sqlite results as well i can share its code aswel whatsay ? – Addi.Star Jul 18 '16 at 15:14
  • 1
    You already are correctly getting the columns on the line. `SimpleCursorAdapter cursorAdapter = new SimpleCursorAdapter(noticall.this, R.layout.row2, cursor, from, to);`.. The `int[] to` are the IDs of the layouts that you want to bind the columns to. – OneCricketeer Jul 18 '16 at 15:16
  • 1
    Are you should **not** `toString` an `ArrayList` because you are seeing `[data1, data2, data3]` on **one** row... – OneCricketeer Jul 18 '16 at 15:17
  • hay i dont know what made it right . its working fine now . i was trying different techniques . i made it correct . i am updating my question code you can see what made it correct . i made several changes – Addi.Star Jul 18 '16 at 15:18
  • mySQLiteAdapter.insert(one,Time,Name,Number); i think this worked .. and i totally agree with you there always be one adapter for listviews . but i should test cursor adapter for displaying added entries.. now i have to implement onlongclick on listview items and delete the selected row data from database aswel as listview . your knowledge really helped me thanks a lot man .. cheers – Addi.Star Jul 18 '16 at 15:26