Search code examples
androidlistviewandroid-asynctasksimpleadapter

error when try to fill list view adapter on asynctask


this is a pice of my code and i use async task to search from database and fill the listview using simple adapter.

protected String doInBackground(String... arg0)
    {
        Cursor TROWS;
        ArrayList<HashMap<String, String>> LstViw_VItem=new ArrayList<HashMap<String,String>>();
        HashMap<String, String>VMap;
        try
        {
            DBH.openDataBase();

            SQLiteDatabase SQLITE=SQLiteDatabase.openDatabase(myPath, null, Context.MODE_PRIVATE);
            if (TxtVerminSearch.getText().length()==0)
            {
                TROWS=SQLITE.rawQuery("select id,vermin_name from pistachio_vermins", null);
            }
            else
            {
                TROWS=SQLITE.rawQuery("select id,vermin_name from pistachio_vermins where vermin_name like '%"+TxtVerminSearch.getText()+"%'", null);
            }
            if (TROWS.moveToFirst())
            {
                do
                {
                    String VID      =TROWS.getString(0);
                    String VName    =TROWS.getString(1);

                    VMap=new HashMap<String, String>();
                    VMap.put("VerminID", VID);
                    VMap.put("VerminName", VName);
                    LstViw_VItem.add(VMap);
                }
                while (TROWS.moveToNext());
                SimpleAdapter SA=new SimpleAdapter(getApplicationContext(), LstViw_VItem, R.layout.xvermin_items, new String[]{"VerminID","VerminName"}, new int[]{R.id.mainmenu_items__lbl_vermin_id,R.id.mainmenu_items__lbl_vermins});
                LstViwVerminItems.setAdapter(SA);

                LstViwVerminItems.setEnabled(true);
            }
            else 
            {
                VMap=new HashMap<String, String>();
                VMap.put("VerminID", "-1");
                VMap.put("VerminName", "nothing found");

                VMap.put("ImgViw",String.valueOf(R.drawable.warning_48));

                LstViw_VItem.add(VMap);

                SimpleAdapter SA=new SimpleAdapter(getApplicationContext(), LstViw_VItem, R.layout.xvermin_items, new String[]{"VerminID","VerminName","ImgViw"}, new int[]{R.id.mainmenu_items__lbl_vermin_id,R.id.mainmenu_items__lbl_vermins,R.id.mainmenu_items__ImgViw});
                LstViwVerminItems.setAdapter(SA);

                LstViwVerminItems.setEnabled(false);    
            }
        }
        catch (Exception e)
        {
            final String errString;
            errString=e.getMessage();
            Log.d("ERR: ", errString);
            runOnUiThread(new Runnable()
            {
                public void run()
                {
                    Toast.makeText(JAct_Vermins.this, errString, Toast.LENGTH_LONG).show();
                }
            }); 
        }

        return null;
    }

every thing work fine but when result of search is empty i give an error like this:

Only the original thread that created a view hierarchy can touch its views.

and the problem happen on the this line

    VMap.put("ImgViw",String.valueOf(R.drawable.warning_48));

befor of this, i use runOnUiThread function to access ui. but i can not do it right now because i can not declare VMap as final


Solution

  • try to declare HashMap<String, String> VMap; outside doInBackgound() and use runOnUiThread(). If it still doesn't work, try to create a Handler and pass your hashmap key-val as Message.

    Note: Declare your VMap variable outside doInBackground()

    example:

        HashMap<String, String> VMap;
    
        @Override
        protected String doInBackground(String... params) {
            Cursor TROWS;
            ArrayList<HashMap<String, String>> LstViw_VItem = new ArrayList<HashMap<String, String>>();
    
            try {
                DBH.openDataBase();
    
                SQLiteDatabase SQLITE = SQLiteDatabase.openDatabase(myPath, null,
                        Context.MODE_PRIVATE);
                if (TxtVerminSearch.getText().length() == 0) {
                    TROWS = SQLITE.rawQuery("select id,vermin_name from pistachio_vermins", null);
                } else {
                    TROWS = SQLITE.rawQuery(
                            "select id,vermin_name from pistachio_vermins where vermin_name like '%"
                                    + TxtVerminSearch.getText() + "%'", null);
                }
                if (TROWS.moveToFirst()) {
                    do {
                        String VID = TROWS.getString(0);
                        String VName = TROWS.getString(1);
    
                        VMap = new HashMap<String, String>();
                        VMap.put("VerminID", VID);
                        VMap.put("VerminName", VName);
                        LstViw_VItem.add(VMap);
                    } while (TROWS.moveToNext());
                    SimpleAdapter SA = new SimpleAdapter(getApplicationContext(), LstViw_VItem,
                            R.layout.xvermin_items, new String[] { "VerminID", "VerminName" },
                            new int[] { R.id.mainmenu_items__lbl_vermin_id,
                                    R.id.mainmenu_items__lbl_vermins });
                    LstViwVerminItems.setAdapter(SA);
    
                    LstViwVerminItems.setEnabled(true);
                } else {
                    VMap = new HashMap<String, String>();
                    VMap.put("VerminID", "-1");
                    VMap.put("VerminName", "nothing found");
    
                    mHandler.sendEmptyMessage(0);
    
                    LstViw_VItem.add(VMap);
    
                    SimpleAdapter SA = new SimpleAdapter(getApplicationContext(), LstViw_VItem,
                            R.layout.xvermin_items, new String[] { "VerminID", "VerminName",
                                    "ImgViw" }, new int[] { R.id.mainmenu_items__lbl_vermin_id,
                                    R.id.mainmenu_items__lbl_vermins, R.id.mainmenu_items__ImgViw });
                    LstViwVerminItems.setAdapter(SA);
    
                    LstViwVerminItems.setEnabled(false);
                }
            } catch (Exception e) {
                final String errString;
                errString = e.getMessage();
                Log.d("ERR: ", errString);
                runOnUiThread(new Runnable() {
                    public void run() {
                        Toast.makeText(JAct_Vermins.this, errString, Toast.LENGTH_LONG).show();
                    }
                });
            }
    
            return null;
        }
    
        private Handler mHandler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
    
                VMap.put("ImgViw", String.valueOf(R.drawable.warning_48));
    
                super.handleMessage(msg);
            }
        };
    

    Hope it helps!