Better UI

Less actions on main thread.
This commit is contained in:
Przemek Grondek 2014-08-20 11:24:55 +02:00
parent 697c2e845a
commit e48b75863e
3 changed files with 69 additions and 37 deletions
app/src/main
java/info/nerull7/mysqlbrowser
res/layout

View file

@ -24,10 +24,15 @@ import info.nerull7.mysqlbrowser.db.AsyncDatabaseConnector;
* *
* Fragment for editing/adding elements * 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_ELEMENT = "edit_element";
public static final String EDIT_LIST = "edit_element_list"; 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 String tableName;
private ElementArrayAdapter listAdapter; private ElementArrayAdapter listAdapter;
@ -35,6 +40,8 @@ public class ElementFragment extends Fragment implements AsyncDatabaseConnector.
private ListView listView; private ListView listView;
private List<String> values; private List<String> values;
private String message;
private int postExecute;
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
@ -45,7 +52,9 @@ public class ElementFragment extends Fragment implements AsyncDatabaseConnector.
initArguments(); initArguments();
postExecute = POST_EXECUTE_NONE;
Static.asyncDatabaseConnector.setListReturnListener(this); Static.asyncDatabaseConnector.setListReturnListener(this);
Static.asyncDatabaseConnector.setOnPostExecuteListener(this);
Static.asyncDatabaseConnector.getFields(tableName); Static.asyncDatabaseConnector.getFields(tableName);
return rootView; return rootView;
@ -84,12 +93,8 @@ public class ElementFragment extends Fragment implements AsyncDatabaseConnector.
@Override @Override
public void onListReturn(List<String> fields) { public void onListReturn(List<String> fields) {
listAdapter = new ElementArrayAdapter(getActivity(), R.layout.list_item_element_simple, fields, values); listAdapter = new ElementArrayAdapter(getActivity(), R.layout.list_item_element_simple, fields, values);
listView.setAdapter(listAdapter); postExecute = POST_EXECUTE_GET_FIELDS;
// databasesListView.setAdapter(listAdapter);
// databasesListView.setOnItemClickListener(this);
progressBar.setVisibility(View.INVISIBLE);
setHasOptionsMenu(true);
} }
private List<String> getNewValues(){ private List<String> getNewValues(){
@ -104,8 +109,30 @@ public class ElementFragment extends Fragment implements AsyncDatabaseConnector.
@Override @Override
public void onStringReturn(String data) { 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()); final AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
builder.setMessage(data); builder.setMessage(info);
builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { builder.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() {
@Override @Override
public void onClick(DialogInterface dialogInterface, int i) { public void onClick(DialogInterface dialogInterface, int i) {

View file

@ -61,6 +61,7 @@ public class EntriesFragment extends Fragment implements AsyncDatabaseConnector.
private Menu menu; private Menu menu;
private TableRow headerRow; private TableRow headerRow;
private int[] maxWidth;
@Override @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, public View onCreateView(LayoutInflater inflater, ViewGroup container,
@ -91,12 +92,12 @@ public class EntriesFragment extends Fragment implements AsyncDatabaseConnector.
private void initViewItems(View rootView){ private void initViewItems(View rootView){
headerFrame = (FrameLayout) rootView.findViewById(R.id.headerFrame); headerFrame = (FrameLayout) rootView.findViewById(R.id.headerFrame);
entriesTable = (TableLayout) rootView.findViewById(R.id.entriesTable);
entriesScrollView = (ScrollView) rootView.findViewById(R.id.entriesScrollView); entriesScrollView = (ScrollView) rootView.findViewById(R.id.entriesScrollView);
fakeScrollView = (CustomScrollView) rootView.findViewById(R.id.fakeScroll); fakeScrollView = (CustomScrollView) rootView.findViewById(R.id.fakeScroll);
progressBar = (ProgressBar) rootView.findViewById(R.id.loginProgressBar); progressBar = (ProgressBar) rootView.findViewById(R.id.loginProgressBar);
dummyView = rootView.findViewById(R.id.dummyView); dummyView = rootView.findViewById(R.id.dummyView);
horizontalScrollView = (HorizontalScrollView) rootView.findViewById(R.id.horizontalScrollView); horizontalScrollView = (HorizontalScrollView) rootView.findViewById(R.id.horizontalScrollView);
entriesTable = new TableLayout(getActivity());
fakeScrollView.setOnTouchEventListener(new CustomScrollView.OnTouchEventListener() { fakeScrollView.setOnTouchEventListener(new CustomScrollView.OnTouchEventListener() {
@Override @Override
@ -108,8 +109,6 @@ public class EntriesFragment extends Fragment implements AsyncDatabaseConnector.
}); });
layoutParams = new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.MATCH_PARENT); layoutParams = new TableRow.LayoutParams(TableRow.LayoutParams.WRAP_CONTENT, TableRow.LayoutParams.MATCH_PARENT);
headerFrame.setVisibility(View.INVISIBLE);
entriesTable.setVisibility(View.INVISIBLE);
} }
@Override @Override
@ -146,7 +145,9 @@ public class EntriesFragment extends Fragment implements AsyncDatabaseConnector.
private void loadAnotherPage(){ private void loadAnotherPage(){
changeMenus(page); changeMenus(page);
entriesTable.removeAllViews(); // clean table entriesScrollView.removeAllViews(); // clean table
entriesTable = new TableLayout(getActivity());
onPostExecuteListenerExecuted--;
setLoading(true); setLoading(true);
Static.asyncDatabaseConnector.getRows(tableName, entriesLimit, page); // get new entries Static.asyncDatabaseConnector.getRows(tableName, entriesLimit, page); // get new entries
@ -208,18 +209,12 @@ public class EntriesFragment extends Fragment implements AsyncDatabaseConnector.
newRow.setClickable(true); newRow.setClickable(true);
newRow.setOnClickListener(this); newRow.setOnClickListener(this);
entriesTable.addView(newRow); entriesTable.addView(newRow);
syncWidthsFirstStage();
} }
} else { } else {
TextView errorMessage = new TextView(getActivity()); entriesTable = null;
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);
} }
setLoading(false);
} }
@Override @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 private void syncWidthsFirstStage() { // TODO: Merge with adding columns maybe? Loops -= 3 should be quicker
int maxWidth[]= new int[headerRow.getChildCount()]; maxWidth = new int[headerRow.getChildCount()];
for(int i=0;i<headerRow.getChildCount();i++){ for (int i = 0; i < headerRow.getChildCount(); i++) {
TextView textView = (TextView) headerRow.getChildAt(i); TextView textView = (TextView) headerRow.getChildAt(i);
textView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); textView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
maxWidth[i] = textView.getMeasuredWidth(); 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); 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 textView = (TextView) tableRow.getChildAt(j);
textView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); textView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
int width = textView.getMeasuredWidth(); int width = textView.getMeasuredWidth();
if(width>maxWidth[j]) if (width > maxWidth[j])
maxWidth[j]=width; maxWidth[j] = width;
} }
} }
}
private void syncWidthsSecondStage() {
for(int i=0;i<headerRow.getChildCount();i++){ for(int i=0;i<headerRow.getChildCount();i++){
TableRow entriesRow = (TableRow) entriesTable.getChildAt(0); TableRow entriesRow = (TableRow) entriesTable.getChildAt(0);
@ -282,9 +279,6 @@ public class EntriesFragment extends Fragment implements AsyncDatabaseConnector.
tmpEntries.setWidth(maxWidth[i]); tmpEntries.setWidth(maxWidth[i]);
tmpHeader.setWidth(maxWidth[i]); tmpHeader.setWidth(maxWidth[i]);
} }
// headerFrame.setVisibility(View.VISIBLE);
// entriesTable.setVisibility(View.VISIBLE);
} }
private void fakeScroll(){ private void fakeScroll(){
@ -318,9 +312,20 @@ public class EntriesFragment extends Fragment implements AsyncDatabaseConnector.
@Override @Override
public void onPostExecute() { public void onPostExecute() {
if(++onPostExecuteListenerExecuted==3){ if(++onPostExecuteListenerExecuted==3){
headerFrame.addView(headerRow); if(entriesTable!=null) {
syncWidths(); syncWidthsSecondStage();
fakeScroll(); 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);
} }
} }
} }

View file

@ -26,11 +26,11 @@
android:id="@+id/entriesScrollView" android:id="@+id/entriesScrollView"
android:layout_below="@+id/headerFrame" android:layout_below="@+id/headerFrame"
android:scrollbars="none"> android:scrollbars="none">
<TableLayout <!--<TableLayout-->
android:layout_width="wrap_content" <!--android:layout_width="wrap_content"-->
android:layout_height="wrap_content" <!--android:layout_height="wrap_content"-->
android:id="@+id/entriesTable"> <!--android:id="@+id/entriesTable">-->
</TableLayout> <!--</TableLayout>-->
</ScrollView> </ScrollView>
</RelativeLayout> </RelativeLayout>
</HorizontalScrollView> </HorizontalScrollView>