I have already read many articules about this, but I can't find solution or can't implement it of my case.
I have list of buildings and when I choose element of the list the dialog is showing and other Thread is starting which connects to external database.
My problem is: I can't refresh my dialog in function run on other Thread. The text will show elements of database which is getting.
I 've tried my own Dialog class but still nothing.
public class BuildingListActivity extends ListActivity {
private WifiManager wifiManager;
static String[] buildingsName = null;
SqLiteDatabaseCRUD database;
List<Budynek> budynkiExternal = new ArrayList<Budynek>();;
List<Budynek> budynkiInternal = new ArrayList<Budynek>();;
CustomArrayAdapter adapter;
AlertDialog alertDialog;
TextView dialogText;
ListView listView;
View v;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_building_list);
v = getLayoutInflater().inflate(R.layout.dialog, null);
dialogText = (TextView)v.findViewById(R.id.textView);
listView = (ListView)findViewById(android.R.id.list);
...
getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
alertDialog = new AlertDialog.Builder(BuildingListActivity.this).create();
alertDialog.setTitle("Alert Dialog");
alertDialog.setMessage("Welcome to AndroidHive.info");
alertDialog.setButton("OK", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// Write your code here to execute after dialog closed
Toast.makeText(getApplicationContext(), "You clicked on OK", Toast.LENGTH_SHORT).show();
}
});
alertDialog.show();
Thread getData = new Thread(getDatas, "external_database");
getData.start();
}
});
}
private Runnable getDatas = new Runnable()
{
@Override
public void run()
{
SqLiteDatabaseCRUD database = new SqLiteDatabaseCRUD(getApplicationContext());
List<Integer> idList = new ArrayList<Integer>();
idList = adapter.getIdList();
ExternalDatabase externalConnection = new ExternalDatabase();
List<Pomieszczenie> pomieszczenieList;
List<DaneSurowe> daneList;
List<AP> routerList;
for(int i = 0; i < idList.size(); i++)
{
database.createFieldBudynek(externalConnection.getBudynek(idList.get(i)));
pomieszczenieList = externalConnection.getPomieszczenieByBudynek(idList.get(i));
daneList = externalConnection.getDaneSurowe(idList.get(i));
routerList = externalConnection.getAPbyPomieszczenie(idList.get(i));
for(int j = 0; j < pomieszczenieList.size(); j++)
{
database.createFieldPomieszczenie(pomieszczenieList.get(j));
}
for(int j = 0; j < daneList.size(); j++)
{
database.createFieldDaneSurowe(daneList.get(j));
}
for(int j = 0; j < routerList.size(); j++)
{
database.createFieldAP(routerList.get(j));
}
}
}
};
I've tried this:
public class DatabaseDialog extends Dialog {
View v = null;
public DatabaseDialog(Context context) {
super(context);
}
public Dialog show(Context context) {
Dialog d = new Dialog(context);
v = LayoutInflater.from(context).inflate(R.layout.dialog, null);
d.setContentView(v);
return d;
}
public void update() {
v.invalidate();
// v.setId(R.id.textView);
}
}
And use it like
Dialog testDialog = new Dialog(getApplicationContext());
DatabaseDialog dialog = new DatabaseDialog(getApplicationContext());
testDialog = dialog.show(getApplicationContext());
testDialog.show();
but it shows nothing.
dialog.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:text="Medium Text"
android:id="@+id/textView"
android:layout_gravity="center_horizontal" />
</LinearLayout>
activity_building_list
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="com.example.arkadio.naviwifi.BuildingListActivity">
<ListView
android:id="@android:id/list"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
</RelativeLayout>
Thanks for help!
For updating GUI you need to run that code on main thread or update will not be executed. Use this pattern inside your thread on places where you are updating GUI.
activity.runOnUiThread(
new Runnable(){
@Override
public void run(){
// HERE UPDATE GUI
}
}
);
Also nice example here.
Or just use AsyncTask. Example here.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With