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
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!