From e48b75863e1389992b673bb530adec9855c02bd7 Mon Sep 17 00:00:00 2001 From: Przemek Grondek <github@nerull7.info> Date: Wed, 20 Aug 2014 11:24:55 +0200 Subject: [PATCH] Better UI Less actions on main thread. --- .../nerull7/mysqlbrowser/ElementFragment.java | 41 +++++++++++--- .../nerull7/mysqlbrowser/EntriesFragment.java | 55 ++++++++++--------- app/src/main/res/layout/fragment_entries.xml | 10 ++-- 3 files changed, 69 insertions(+), 37 deletions(-) diff --git a/app/src/main/java/info/nerull7/mysqlbrowser/ElementFragment.java b/app/src/main/java/info/nerull7/mysqlbrowser/ElementFragment.java index 898c6ba..65e7685 100644 --- a/app/src/main/java/info/nerull7/mysqlbrowser/ElementFragment.java +++ b/app/src/main/java/info/nerull7/mysqlbrowser/ElementFragment.java @@ -24,10 +24,15 @@ import info.nerull7.mysqlbrowser.db.AsyncDatabaseConnector; * * Fragment for editing/adding elements */ -public class ElementFragment extends Fragment implements AsyncDatabaseConnector.ListReturnListener, AsyncDatabaseConnector.StringReturnListener { +public class ElementFragment extends Fragment implements AsyncDatabaseConnector.ListReturnListener, AsyncDatabaseConnector.StringReturnListener, AsyncDatabaseConnector.OnPostExecuteListener { public static final String EDIT_ELEMENT = "edit_element"; public static final String EDIT_LIST = "edit_element_list"; + private static final int POST_EXECUTE_NONE = 0; + private static final int POST_EXECUTE_GET_FIELDS = 1; + private static final int POST_EXECUTE_UPDATE_ELEMENT = 2; + private static final int POST_EXECUTE_ADD_ELEMENT = 3; + private String tableName; private ElementArrayAdapter listAdapter; @@ -35,6 +40,8 @@ public class ElementFragment extends Fragment implements AsyncDatabaseConnector. private ListView listView; private List<String> values; + private String message; + private int postExecute; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { @@ -45,7 +52,9 @@ public class ElementFragment extends Fragment implements AsyncDatabaseConnector. initArguments(); + postExecute = POST_EXECUTE_NONE; Static.asyncDatabaseConnector.setListReturnListener(this); + Static.asyncDatabaseConnector.setOnPostExecuteListener(this); Static.asyncDatabaseConnector.getFields(tableName); return rootView; @@ -84,12 +93,8 @@ public class ElementFragment extends Fragment implements AsyncDatabaseConnector. @Override public void onListReturn(List<String> fields) { listAdapter = new ElementArrayAdapter(getActivity(), R.layout.list_item_element_simple, fields, values); - listView.setAdapter(listAdapter); -// databasesListView.setAdapter(listAdapter); -// databasesListView.setOnItemClickListener(this); - progressBar.setVisibility(View.INVISIBLE); + postExecute = POST_EXECUTE_GET_FIELDS; - setHasOptionsMenu(true); } private List<String> getNewValues(){ @@ -104,8 +109,30 @@ public class ElementFragment extends Fragment implements AsyncDatabaseConnector. @Override public void onStringReturn(String data) { + message = data; + postExecute = POST_EXECUTE_ADD_ELEMENT; + } + + @Override + public void onPostExecute() { + switch (postExecute){ + case POST_EXECUTE_GET_FIELDS: + listView.setAdapter(listAdapter); + progressBar.setVisibility(View.INVISIBLE); + setHasOptionsMenu(true); + break; + case POST_EXECUTE_ADD_ELEMENT: + case POST_EXECUTE_UPDATE_ELEMENT: + showInfo(message); + break; + } + // Clean after execute + postExecute = POST_EXECUTE_NONE; + } + + private void showInfo(String info){ final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); - builder.setMessage(data); + builder.setMessage(info); builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { diff --git a/app/src/main/java/info/nerull7/mysqlbrowser/EntriesFragment.java b/app/src/main/java/info/nerull7/mysqlbrowser/EntriesFragment.java index f46b353..f0a6583 100644 --- a/app/src/main/java/info/nerull7/mysqlbrowser/EntriesFragment.java +++ b/app/src/main/java/info/nerull7/mysqlbrowser/EntriesFragment.java @@ -61,6 +61,7 @@ public class EntriesFragment extends Fragment implements AsyncDatabaseConnector. private Menu menu; private TableRow headerRow; + private int[] maxWidth; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, @@ -91,12 +92,12 @@ public class EntriesFragment extends Fragment implements AsyncDatabaseConnector. private void initViewItems(View rootView){ headerFrame = (FrameLayout) rootView.findViewById(R.id.headerFrame); - entriesTable = (TableLayout) rootView.findViewById(R.id.entriesTable); entriesScrollView = (ScrollView) rootView.findViewById(R.id.entriesScrollView); fakeScrollView = (CustomScrollView) rootView.findViewById(R.id.fakeScroll); progressBar = (ProgressBar) rootView.findViewById(R.id.loginProgressBar); dummyView = rootView.findViewById(R.id.dummyView); horizontalScrollView = (HorizontalScrollView) rootView.findViewById(R.id.horizontalScrollView); + entriesTable = new TableLayout(getActivity()); fakeScrollView.setOnTouchEventListener(new CustomScrollView.OnTouchEventListener() { @Override @@ -108,8 +109,6 @@ public class EntriesFragment extends Fragment implements AsyncDatabaseConnector. }); layoutParams = new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.MATCH_PARENT); - headerFrame.setVisibility(View.INVISIBLE); - entriesTable.setVisibility(View.INVISIBLE); } @Override @@ -146,7 +145,9 @@ public class EntriesFragment extends Fragment implements AsyncDatabaseConnector. private void loadAnotherPage(){ changeMenus(page); - entriesTable.removeAllViews(); // clean table + entriesScrollView.removeAllViews(); // clean table + entriesTable = new TableLayout(getActivity()); + onPostExecuteListenerExecuted--; setLoading(true); Static.asyncDatabaseConnector.getRows(tableName, entriesLimit, page); // get new entries @@ -208,18 +209,12 @@ public class EntriesFragment extends Fragment implements AsyncDatabaseConnector. newRow.setClickable(true); newRow.setOnClickListener(this); entriesTable.addView(newRow); + syncWidthsFirstStage(); } } else { - TextView errorMessage = new TextView(getActivity()); - errorMessage.setText(R.string.error_no_entries); - errorMessage.setTypeface(null, Typeface.ITALIC); - errorMessage.setClickable(false); - entriesScrollView.removeView(entriesTable); - headerFrame.setVisibility(View.VISIBLE); - entriesScrollView.addView(errorMessage); + entriesTable = null; } - setLoading(false); } @Override @@ -254,25 +249,27 @@ public class EntriesFragment extends Fragment implements AsyncDatabaseConnector. }); } - private void syncWidths(){ // TODO: Merge with adding columns maybe? Loops -= 3 should be quicker - int maxWidth[]= new int[headerRow.getChildCount()]; - for(int i=0;i<headerRow.getChildCount();i++){ + private void syncWidthsFirstStage() { // TODO: Merge with adding columns maybe? Loops -= 3 should be quicker + maxWidth = new int[headerRow.getChildCount()]; + for (int i = 0; i < headerRow.getChildCount(); i++) { TextView textView = (TextView) headerRow.getChildAt(i); textView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); maxWidth[i] = textView.getMeasuredWidth(); } - for(int i=0;i<entriesTable.getChildCount();i++){ + for (int i = 0; i < entriesTable.getChildCount(); i++) { TableRow tableRow = (TableRow) entriesTable.getChildAt(i); - for(int j=0;j<tableRow.getChildCount();j++){ + for (int j = 0; j < tableRow.getChildCount(); j++) { TextView textView = (TextView) tableRow.getChildAt(j); textView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); int width = textView.getMeasuredWidth(); - if(width>maxWidth[j]) - maxWidth[j]=width; + if (width > maxWidth[j]) + maxWidth[j] = width; } } + } + private void syncWidthsSecondStage() { for(int i=0;i<headerRow.getChildCount();i++){ TableRow entriesRow = (TableRow) entriesTable.getChildAt(0); @@ -282,9 +279,6 @@ public class EntriesFragment extends Fragment implements AsyncDatabaseConnector. tmpEntries.setWidth(maxWidth[i]); tmpHeader.setWidth(maxWidth[i]); } - -// headerFrame.setVisibility(View.VISIBLE); -// entriesTable.setVisibility(View.VISIBLE); } private void fakeScroll(){ @@ -318,9 +312,20 @@ public class EntriesFragment extends Fragment implements AsyncDatabaseConnector. @Override public void onPostExecute() { if(++onPostExecuteListenerExecuted==3){ - headerFrame.addView(headerRow); - syncWidths(); - fakeScroll(); + if(entriesTable!=null) { + syncWidthsSecondStage(); + fakeScroll(); + entriesScrollView.addView(entriesTable); + } else { + TextView errorMessage = new TextView(getActivity()); + errorMessage.setText(R.string.error_no_entries); + errorMessage.setTypeface(null, Typeface.ITALIC); + errorMessage.setClickable(false); + entriesScrollView.addView(errorMessage); + } + if(headerFrame.getChildCount()==0) // You can have only one child + headerFrame.addView(headerRow); + setLoading(false); } } } diff --git a/app/src/main/res/layout/fragment_entries.xml b/app/src/main/res/layout/fragment_entries.xml index 3ed823a..55f3cb8 100644 --- a/app/src/main/res/layout/fragment_entries.xml +++ b/app/src/main/res/layout/fragment_entries.xml @@ -26,11 +26,11 @@ android:id="@+id/entriesScrollView" android:layout_below="@+id/headerFrame" android:scrollbars="none"> - <TableLayout - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:id="@+id/entriesTable"> - </TableLayout> + <!--<TableLayout--> + <!--android:layout_width="wrap_content"--> + <!--android:layout_height="wrap_content"--> + <!--android:id="@+id/entriesTable">--> + <!--</TableLayout>--> </ScrollView> </RelativeLayout> </HorizontalScrollView>