Search code examples
android-studiolistviewandroid-listviewandroid-sqliteandroid-database

move one row from listview in Activity to another listview in another activity


i have two listviews each one of them is in different activity i want when i long click on any row from the first listview get moved the second listview and still do the same task as if it was in the first one(for example open an activity) and the list view gets its data from a strings.xml here is my code and please help me

public class DB_Sqlite extends SQLiteOpenHelper {
    public static final String BDname = "data.db";
    public static final int DBVERSION = 1; /*<<<<< ADDED BUT NOT NEEDED */
    public static final String TABLE_FAVOURITES = "mytable";

    public static final String FAVOURITES_COL_ID = BaseColumns._ID; /*<<<< use the Android stock ID name*/
    public static final String FAVOURITES_COL_NAME = "name";
    public static final String FAVOURITES_COL_FAVOURITEFLAG = "favourite_flag"; /*<<<<< NEW COLUMN */

    public DB_Sqlite(@Nullable Context context) {
        super(context, BDname, null, DBVERSION /*<<<<< used constant above */);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table " + TABLE_FAVOURITES + " (" +
                FAVOURITES_COL_ID + " INTEGER PRIMARY KEY," + /*<<<<< AUTOINCREMENT NOT NEEDED AND IS INEFFICIENT */
                FAVOURITES_COL_NAME + " TEXT, " +
                FAVOURITES_COL_FAVOURITEFLAG + " INTEGER DEFAULT 0" + /*<<<<< COLUMN ADDED */
                ")");
        /* CHANGES HERE BELOW loop adding all Resource names NOT VALUES */
        ContentValues cv = new ContentValues();
        for (String s: StringResourcesHandling.getAllStringResourceNames()) {
            cv.clear();
            cv.put(FAVOURITES_COL_NAME,s);
            db.insert(TABLE_FAVOURITES,null,cv);


        }
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int i, int i1) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_FAVOURITES);
        onCreate(db);
    }
    public boolean insertData(String name){
        SQLiteDatabase db = this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put(FAVOURITES_COL_NAME, name);
        long result = db.insert(TABLE_FAVOURITES,null, contentValues);
        if (result == -1)
            return false;
        else
            return true;
    }


    public Cursor getFavouriteRows(boolean favourites)  {
        SQLiteDatabase db = this.getWritableDatabase();
        String whereclause = FAVOURITES_COL_FAVOURITEFLAG + "=?";
        String compare = "<1";
        if (favourites) {
            compare =">0";
        }

        return db.query(
                TABLE_FAVOURITES,null,
                FAVOURITES_COL_FAVOURITEFLAG + compare,
                null,null,null,null
        );
    }


    private int setFavourite(long id, boolean favourite_flag) {
        SQLiteDatabase db = this.getWritableDatabase();
        String whereclause = FAVOURITES_COL_ID + "=?";
        String[] whereargs = new String[]{String.valueOf(id)};
        ContentValues cv = new ContentValues();
        cv.put(FAVOURITES_COL_FAVOURITEFLAG,favourite_flag);
        return db.update(TABLE_FAVOURITES,cv,whereclause,whereargs);
    }


    public int setAsFavourite(long id) {
        return setFavourite(id,true);
    }


    public int setAsNotFavourite(long id) {
        return setFavourite(id, false);
    }

    /* Getting everything and make MatrixCursor VALUES from Resource names from Cursor with Resource names  */
    public Cursor getAllDataInCurrentLocale(Context context) {
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor csr = db.query(TABLE_FAVOURITES,null,null,null,null,null,null);
        if (csr.getCount() < 1) return csr;
        MatrixCursor mxcsr = new MatrixCursor(csr.getColumnNames(),csr.getCount());
        while (csr.moveToNext()) {
            mxcsr.addRow(convertCursorRow(context,csr,new String[]{FAVOURITES_COL_NAME}));
        }
        csr.close();
        return mxcsr;
    }
    public Cursor getDataInCurrentLocaleById(Context context, long id) {
        SQLiteDatabase db = this.getWritableDatabase();
        String wherepart = FAVOURITES_COL_ID + "=?";
        String[] args = new String[]{String.valueOf(id)};
        Cursor csr = db.query(TABLE_FAVOURITES,null,wherepart,args,null,null,null);
        if (csr.getCount() < 1) return csr;
        MatrixCursor mxcsr = new MatrixCursor(csr.getColumnNames(),csr.getCount());
        while (csr.moveToNext()) {
            mxcsr.addRow(convertCursorRow(context,csr,new String[]{FAVOURITES_COL_NAME}));
        }
        csr.close();
        return mxcsr;
    }

    /* This getting columns from Cursor into String array (no BLOB handleing)*/
    private String[] convertCursorRow(Context context, Cursor csr, String[] columnsToConvert) {
        String[] rv = new String[csr.getColumnCount()];
        for (String s: csr.getColumnNames()) {
            boolean converted = false;
            for (String ctc: columnsToConvert) {
                if (csr.getType(csr.getColumnIndex(s)) == Cursor.FIELD_TYPE_BLOB) {
                    //........ would have to handle BLOB here if needed (another question if needed)
                }
                if (ctc.equals(s)) {
                    rv[csr.getColumnIndex(s)] = StringResourcesHandling.getStringByName(context,csr.getString(csr.getColumnIndex(s)));
                    converted = true;
                }
            } if (!converted) {
                rv[csr.getColumnIndex(s)] = csr.getString(csr.getColumnIndex(s));
            }
        }
        return rv;
    }

    }
public class MainActivity extends AppCompatActivity {

    DB_Sqlite dbSqlite;
    ListView listView;
    ListView listView1;
    ArrayAdapter adapter, adapter1;
    ArrayList arrayList, arrayList1;
    String[] number;
    Button button;
    StringResourcesHandling srh;
    MatrixCursor getAllDataInCurrentLocale,getAllDataInCurrentLocale1;
    SimpleCursorAdapter favourites_adapter,non_favourites_adapter;




    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listView = (ListView) findViewById(R.id.list_view);
        arrayList = new ArrayList<String>();
        arrayList1 = new ArrayList<String>();
        listView.setAdapter(adapter);
        button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this, cc.class);
                startActivity(intent);
            }
        });





        /* Show the resources for demo */
        for (String s : StringResourcesHandling.getAllStringResourceNames()) {
            Log.d("RESOURCEDATA", "String Resource Name = " + s +
                    "\n\tValue = " + StringResourcesHandling.getStringByName(this, s)

            );

        }

        dbSqlite = new DB_Sqlite(this);
        Cursor csr = dbSqlite.getAllDataInCurrentLocale(this);
        DatabaseUtils.dumpCursor(csr);
        csr.close();

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        getAllDataInCurrentLocale.close();

    }





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


    }





    private void manageNonFavouritesListView() {
        getAllDataInCurrentLocale = (MatrixCursor) dbSqlite.getAllDataInCurrentLocale(this);
        if (non_favourites_adapter == null) {
            non_favourites_adapter = new SimpleCursorAdapter(
                    this,
                    R.layout.textview,
                    getAllDataInCurrentLocale,
                    new String[]{FAVOURITES_COL_NAME},
                    new int[]{R.id.textview10},
                    0
            );
            listView.setAdapter(non_favourites_adapter);
            setListViewHandler(listView,false);
        } else {
            non_favourites_adapter.swapCursor(getAllDataInCurrentLocale);
        }
    }





    private void setListViewHandler(ListView listView, boolean favourite_flag) {
        if (!favourite_flag) {
            listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                    if (i == 0) {
                        Intent intent = new Intent(MainActivity.this, tc.class);
                        startActivity(intent);
                    }
                }
            });
            listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
                @Override
                public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long l) {
                    Intent intent = new Intent(MainActivity.this,cc.class);
                    intent.putExtra("EXTRAKEY_ID",l);
                    String name = getAllDataInCurrentLocale.getString(getAllDataInCurrentLocale.getColumnIndex(FAVOURITES_COL_NAME));
                    Toast.makeText(MainActivity.this, name+" Added To Favorite", Toast.LENGTH_SHORT).show();
                    return true;
                }
            });

        }}


}
public class cc extends AppCompatActivity {
    String fav_name;
    long fav_id;
    DB_Sqlite dbSqlite;
    Cursor getAllDataInCurrentLocale, getDataInCurrentLocaleById;
    SimpleCursorAdapter non_favourites_adapter;
    ListView listView1;

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


        fav_id = getIntent().getLongExtra("EXTRAKEY_ID", 0);
        if (fav_id == 0) {
        }

        dbSqlite = new DB_Sqlite(this);
        Cursor cursor = dbSqlite.getDataInCurrentLocaleById(this, fav_id);
        if (cursor.moveToFirst()) {
            fav_name = cursor.getString(getAllDataInCurrentLocale.getColumnIndex(FAVOURITES_COL_NAME));
            manageNonFavouritesListView();

        }
        cursor.close();
    }








    private void manageNonFavouritesListView() {
        getDataInCurrentLocaleById =  dbSqlite.getDataInCurrentLocaleById(this,fav_id);
        if (non_favourites_adapter == null) {
            non_favourites_adapter = new SimpleCursorAdapter(
                    this,
                    R.layout.textview,
                    getDataInCurrentLocaleById,
                    new String[]{FAVOURITES_COL_NAME},
                    new int[]{R.id.textview10},
                    0
            );
            listView1.setAdapter(non_favourites_adapter);
            setListViewHandler(listView1,false);
        } else {
            non_favourites_adapter.swapCursor(getDataInCurrentLocaleById);
        }
    }

    private void setListViewHandler(ListView listView1, boolean b) {

            listView1.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                    if (i == 0) {
                        Intent intent = new Intent(cc.this, tc.class);
                        startActivity(intent);
                    }
                }
            });


        }

        }
public class StringResourcesHandling {
    private static final String[] allowedStringResourcePrefixes = new String[]{"db_"};
    private static boolean loaded = false;
    private static Field[] fields = R.string.class.getFields();
    private static ArrayList<String> allowedStringResourceNames = new ArrayList<>();

    private static void loadStringResources() {
        if (loaded) return;

        for (Field f: fields) {
            if (isResourceNameAllowedPrefix(f.getName())) {
                allowedStringResourceNames.add(f.getName());
            }
        }
        loaded = true;
    }

    private static boolean isResourceNameAllowedPrefix(String resourceName) {
        if (allowedStringResourcePrefixes.length < 1) return true;
        for (String s: allowedStringResourcePrefixes) {
            if (resourceName.substring(0,s.length()).equals(s)) return true;
        }
        return false;
    }

    public static String getStringByName(Context context, String name) {
        String rv = "";
        boolean nameFound = false;
        if (!loaded) {
            loadStringResources();
        }
        for (String s: allowedStringResourceNames) {
            if (s.equals(name)) {
                nameFound = true;
                break;
            }
        }
        if (!nameFound) return rv;
        return context.getString(context.getResources().getIdentifier(name,"string",context.getPackageName()));
    }

    public static List<String> getAllStringResourceNames() {

        if (!loaded) {
            loadStringResources();
        }
        return allowedStringResourceNames;
    }
}

Thank u in advance


Solution

  • Issue 1

    Issue one, you are trying to cast a Cursor to a MatrixCursor, you cannot cast that way you can cast a MatrixCursor to a Cursor though (which is done anyway by the getAllDataInCurrentLocale method).

    So instead of :-

    getAllDataInCurrentLocale = (MatrixCursor) dbSqlite.getAllDataInCurrentLocale(this);
    

    You want :-

    getAllDataInCurrentLocale = dbSqlite.getAllDataInCurrentLocale(this);
    

    Issue 2

    The second issue is that you are never passing the Intent Extra when starting another activty.

    That is

    a)

    There is no setting of the Intent Extra here (when starting the tc activity) :-

    button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(MainActivity.this, tc.class);
                startActivity(intent);
            }
        });
    

    b)

    Likewise the is no setting of the Intent Extra here (when starting the cc activity) :-

            listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                    if (i == 0) {
                        Intent intent = new Intent(MainActivity.this, tc.class);
                        startActivity(intent);
                    }
                }
            });
    

    This irrespective of being shown to do just that as per answer being given here :-

    @Override public void onItemClick(AdapterView adapterView, View view, int i, long l) { if (i == 0) { Intent intent = new Intent(MainActivity.this, cc.class); intent.putExtra("EXTRAKEY_ID",l); // THIS ADDED startActivity(intent); } }

    As such you need to add the 1 line ADD as above.

    Issue 3

    You are trying to access a cursor that has not been instantiated and thus getting a null pointer exception in the cc activity as per :-

    Cursor cursor = dbSqlite.getDataInCurrentLocaleById(this, fav_id);
        if (cursor.moveToFirst()) {
            fav_name = cursor.getString(getAllDataInCurrentLocale.getColumnIndex(FAVOURITES_COL_NAME));
            manageNonFavouritesListView();
    
        }
        cursor.close();
    

    That is your are instantiating a Cursor object named cursor and then trying to use Cursor methods on a Cursor named getAllDataInCurrentLocale when it has not been instantiated. Instead you should be using methods of the instantiated Cursor cursor

    You should instead be using :-

        getAllDataInCurrentLocale = dbSqlite.getDataInCurrentLocaleById(this, fav_id);
        if (getAllDataInCurrentLocale.moveToFirst()) {
            fav_name = getAllDataInCurrentLocale.getString(getAllDataInCurrentLocale.getColumnIndex(FAVOURITES_COL_NAME));
            manageNonFavouritesListView();
    
        }
        getAllDataInCurrentLocale.close();
    

    i.e. the Cursor declared as getAllDataInCurrentLocale is the cursor that you should be using rather then declaring another.

    Issue 4

    You then get a null pointer exception because you have decalred but to instantiated listView1.

    So you need a line like (see comment) :-

    listView1 = this.findViewById(R.id.listview1); //<<<<< ADDED note name should match layout so may be different
    

    With these changes clicking on the first (only the first due to coding i == 0 in the onItemClick method) will start the cc activity which will display the clicked item (only the 1 as the id selects only the 1)

    e.g.

    MainActivity :-

    enter image description here

    Clicking Speck goes to cc Activity :-

    enter image description here