very basic expandable adapter row

pull/14/head
Tim Su 16 years ago
parent fe45e603a0
commit dcae53dce6

@ -57,7 +57,6 @@ public final class TaskDetail implements Parcelable {
// --- parcelable helpers // --- parcelable helpers
/** /**
* {@inheritDoc} * {@inheritDoc}
*/ */

@ -1,7 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<!-- See the file "LICENSE" for the full license governing this code. --> <!-- See the file "LICENSE" for the full license governing this code. -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:background="@android:drawable/list_selector_background" android:background="@android:drawable/list_selector_background"
android:paddingLeft="4dip" android:paddingLeft="4dip"
android:paddingRight="6dip" android:paddingRight="6dip"
@ -15,16 +14,18 @@
<CheckBox android:id="@+id/completeBox" <CheckBox android:id="@+id/completeBox"
android:layout_width="34dip" android:layout_width="34dip"
android:layout_height="fill_parent" android:layout_height="fill_parent"
android:layout_weight="1" android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:paddingLeft="5dip" android:paddingLeft="5dip"
android:button="@drawable/btn_check"/> android:button="@drawable/btn_check"/>
<LinearLayout android:id="@+id/details" <LinearLayout android:id="@+id/details"
android:layout_width="wrap_content" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_weight="100" android:layout_alignParentLeft="true"
android:paddingLeft="6dip" android:layout_alignParentTop="true"
android:paddingRight="2dip" android:paddingLeft="40dip"
android:paddingRight="6dip"
android:orientation="vertical"> android:orientation="vertical">
<!-- task name --> <!-- task name -->
@ -45,9 +46,21 @@
</LinearLayout> </LinearLayout>
<LinearLayout android:id="@+id/actions"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@id/details"
android:visibility="gone"
android:paddingLeft="40dip"
android:paddingRight="6dip"
android:orientation="vertical" />
<!-- importance --> <!-- importance -->
<View android:id="@+id/importance" <View android:id="@+id/importance"
android:layout_width="2dip" android:layout_width="2dip"
android:layout_height="fill_parent"/> android:layout_height="fill_parent"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true" />
</LinearLayout> </RelativeLayout>

@ -178,8 +178,8 @@ button: add task & go to the edit page.
<!-- indicates task was completed. %s => date or time ago --> <!-- indicates task was completed. %s => date or time ago -->
<string name="TAd_completed">Finished %s</string> <string name="TAd_completed">Finished %s</string>
<!-- placeholder for loading task detail --> <!-- Action Button: edit task -->
<string name="TAd_loading">Loading...</string> <string name="TAd_actionEditTask">Edit</string>
<!-- Context Item: edit task --> <!-- Context Item: edit task -->
<string name="TAd_contextEditTask">Edit Task</string> <string name="TAd_contextEditTask">Edit Task</string>

@ -19,26 +19,26 @@ import android.content.pm.ResolveInfo;
import android.database.Cursor; import android.database.Cursor;
import android.os.Bundle; import android.os.Bundle;
import android.view.ContextMenu; import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.Window;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
import android.view.View.OnKeyListener; import android.view.View.OnKeyListener;
import android.view.Window;
import android.view.inputmethod.EditorInfo; import android.view.inputmethod.EditorInfo;
import android.widget.AbsListView; import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.EditText; import android.widget.EditText;
import android.widget.ImageButton; import android.widget.ImageButton;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.ListView; import android.widget.ListView;
import android.widget.RemoteViews; import android.widget.RemoteViews;
import android.widget.TextView; import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener;
import android.widget.Toast; import android.widget.Toast;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.TextView.OnEditorActionListener;
import com.flurry.android.FlurryAgent; import com.flurry.android.FlurryAgent;
import com.timsu.astrid.R; import com.timsu.astrid.R;
@ -80,9 +80,9 @@ public class TaskListActivity extends ListActivity implements OnScrollListener {
// --- activities // --- activities
static final int ACTIVITY_EDIT_TASK = 0; public static final int ACTIVITY_EDIT_TASK = 0;
static final int ACTIVITY_SETTINGS = 1; public static final int ACTIVITY_SETTINGS = 1;
static final int ACTIVITY_PLUGINS = 2; public static final int ACTIVITY_PLUGINS = 2;
// --- menu codes // --- menu codes

@ -16,7 +16,9 @@ import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.ContextMenu.ContextMenuInfo; import android.view.ContextMenu.ContextMenuInfo;
import android.view.View.OnClickListener;
import android.view.View.OnCreateContextMenuListener; import android.view.View.OnCreateContextMenuListener;
import android.widget.Button;
import android.widget.CheckBox; import android.widget.CheckBox;
import android.widget.CursorAdapter; import android.widget.CursorAdapter;
import android.widget.LinearLayout; import android.widget.LinearLayout;
@ -31,6 +33,8 @@ import com.todoroo.andlib.service.DependencyInjectionService;
import com.todoroo.andlib.service.ExceptionService; import com.todoroo.andlib.service.ExceptionService;
import com.todoroo.andlib.utility.DateUtilities; import com.todoroo.andlib.utility.DateUtilities;
import com.todoroo.andlib.utility.DialogUtilities; import com.todoroo.andlib.utility.DialogUtilities;
import com.todoroo.astrid.activity.TaskEditActivity;
import com.todoroo.astrid.activity.TaskListActivity;
import com.todoroo.astrid.api.AstridApiConstants; import com.todoroo.astrid.api.AstridApiConstants;
import com.todoroo.astrid.api.TaskDetail; import com.todoroo.astrid.api.TaskDetail;
import com.todoroo.astrid.model.Task; import com.todoroo.astrid.model.Task;
@ -45,6 +49,14 @@ import com.todoroo.astrid.utility.Preferences;
*/ */
public class TaskAdapter extends CursorAdapter { public class TaskAdapter extends CursorAdapter {
private final class RowClickListener implements
OnClickListener {
@Override
public void onClick(View v) {
}
}
public interface OnCompletedTaskListener { public interface OnCompletedTaskListener {
public void onCompletedTask(Task item, boolean newState); public void onCompletedTask(Task item, boolean newState);
} }
@ -136,6 +148,7 @@ public class TaskAdapter extends CursorAdapter {
viewHolder.completeBox = (CheckBox)view.findViewById(R.id.completeBox); viewHolder.completeBox = (CheckBox)view.findViewById(R.id.completeBox);
viewHolder.dueDate = (TextView)view.findViewById(R.id.dueDate); viewHolder.dueDate = (TextView)view.findViewById(R.id.dueDate);
viewHolder.details = (LinearLayout)view.findViewById(R.id.details); viewHolder.details = (LinearLayout)view.findViewById(R.id.details);
viewHolder.actions = (LinearLayout)view.findViewById(R.id.actions);
viewHolder.importance = (View)view.findViewById(R.id.importance); viewHolder.importance = (View)view.findViewById(R.id.importance);
view.setTag(viewHolder); view.setTag(viewHolder);
@ -180,7 +193,8 @@ public class TaskAdapter extends CursorAdapter {
public TextView dueDate; public TextView dueDate;
public LinearLayout details; public LinearLayout details;
public View importance; public View importance;
public TextView loadingDetails; public LinearLayout actions;
public boolean expanded;
} }
/** Helper method to set the contents and visibility of each field */ /** Helper method to set the contents and visibility of each field */
@ -253,17 +267,13 @@ public class TaskAdapter extends CursorAdapter {
Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_REQUEST_DETAILS); Intent broadcastIntent = new Intent(AstridApiConstants.BROADCAST_REQUEST_DETAILS);
broadcastIntent.putExtra(AstridApiConstants.EXTRAS_TASK_ID, task.getId()); broadcastIntent.putExtra(AstridApiConstants.EXTRAS_TASK_ID, task.getId());
activity.sendOrderedBroadcast(broadcastIntent, AstridApiConstants.PERMISSION_READ); activity.sendOrderedBroadcast(broadcastIntent, AstridApiConstants.PERMISSION_READ);
/* add loading message
if(viewHolder.loadingDetails == null) {
viewHolder.loadingDetails = new TextView(activity);
viewHolder.loadingDetails.setTextAppearance(activity, R.style.TextAppearance_TAd_ItemDetails);
viewHolder.loadingDetails.setText(R.string.TAd_loading);
detailsView.addView(viewHolder.loadingDetails);
}*/
} }
} }
final LinearLayout actionsView = viewHolder.actions;
actionsView.setVisibility(View.GONE);
viewHolder.expanded = false;
// importance bar - must be set at end when view height is determined // importance bar - must be set at end when view height is determined
final View importanceView = viewHolder.importance; { final View importanceView = viewHolder.importance; {
int value = task.getValue(Task.IMPORTANCE); int value = task.getValue(Task.IMPORTANCE);
@ -294,14 +304,12 @@ public class TaskAdapter extends CursorAdapter {
if(viewHolder == null || viewHolder.task.getId() != taskId) if(viewHolder == null || viewHolder.task.getId() != taskId)
continue; continue;
viewHolder.details.addView(detailToView(detail)); TextView newView = detailToView(detail);
viewHolder.details.setVisibility(View.VISIBLE); for(int j = 0; j < viewHolder.details.getChildCount(); j++) {
if(newView.getText().equals(((TextView)viewHolder.details.getChildAt(j)).getText()))
if(viewHolder.loadingDetails != null) { return;
viewHolder.details.removeView(viewHolder.loadingDetails);
viewHolder.loadingDetails = null;
} }
viewHolder.details.addView(newView);
break; break;
} }
} }
@ -311,7 +319,7 @@ public class TaskAdapter extends CursorAdapter {
* *
* @param detail * @param detail
*/ */
private View detailToView(TaskDetail detail) { private TextView detailToView(TaskDetail detail) {
TextView textView = new TextView(activity); TextView textView = new TextView(activity);
textView.setTextAppearance(activity, R.style.TextAppearance_TAd_ItemDetails); textView.setTextAppearance(activity, R.style.TextAppearance_TAd_ItemDetails);
textView.setText(Html.fromHtml(detail.text)); textView.setText(Html.fromHtml(detail.text));
@ -343,19 +351,44 @@ public class TaskAdapter extends CursorAdapter {
// context menu listener // context menu listener
container.setOnCreateContextMenuListener(listener); container.setOnCreateContextMenuListener(listener);
// tap listener
container.setOnClickListener(listener);
} }
class ContextMenuListener implements OnCreateContextMenuListener { /* ======================================================================
* ======================================================= event handlers
* ====================================================================== */
class ContextMenuListener implements OnCreateContextMenuListener, OnClickListener {
public void onCreateContextMenu(ContextMenu menu, View v, public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) { ContextMenuInfo menuInfo) {
// this is all a big sham. it's actually handled in Task List Activity // this is all a big sham. it's actually handled in Task List Activity
} }
}
/* ====================================================================== @Override
* ======================================================= event handlers public void onClick(View v) {
* ====================================================================== */ final ViewHolder viewHolder = (ViewHolder)v.getTag();
viewHolder.expanded = !viewHolder.expanded;
LinearLayout actions = viewHolder.actions;
actions.setVisibility(viewHolder.expanded ? View.VISIBLE : View.GONE);
if(viewHolder.expanded && actions.getChildCount() == 0) {
Button edit = new Button(activity);
edit.setText(R.string.TAd_actionEditTask);
edit.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(activity, TaskEditActivity.class);
intent.putExtra(TaskEditActivity.ID_TOKEN, viewHolder.task.getId());
activity.startActivityForResult(intent, TaskListActivity.ACTIVITY_EDIT_TASK);
}
});
actions.addView(edit);
}
}
}
/** /**
* Call me when the parent presses trackpad * Call me when the parent presses trackpad

Loading…
Cancel
Save