ViewFlipper с подробными представлениями из ListActivity?
Я чувствую, что упускаю что-то простое, и на самом деле мне немного стыдно задавать этот вопрос. Но вот что происходит, когда вы начинаете изучать новую платформу...
У меня есть ListViewActivity, который заполняется через CursorAdapter. При щелчке по элементу списка я запускаю новое действие, чтобы отобразить сведения об этом элементе. То, что я хочу сделать, это включить / переключить / пролистать, чтобы перебрать элементы из детализации. Я не хочу полностью заполнять ViewFlipper, поскольку нет жестко заданного ограничения на количество элементов в списке, и это просто кажется расточительным. Есть ли какой-нибудь способ перехватить движение жеста / трекбола и сбросить действие детализации с помощью детализации следующего / предыдущего элемента?
Моя ListViewActivity просто устанавливает Cursor (через managedQuery) и связанный CursorAdapter с OnListItemClick, который вызывает startActivity с соответствующим Intent.
public final class ModelList extends ListActivity {
private Cursor m_models = null;
private ModelAdapter m_adapter;
@Override
public void onCreate (Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if(m_models == null) {
m_models = managedQuery(Model.CONTENT_URI, Model.PROJECTION, null, null, Model.DEFAULT_SORT_ORDER);
}
m_adapter = new ModelAdapter(this, R.layout.modelitem, m_models);
setContentView(R.layout.forcelist);
setTitle(R.string.activity_list);
setListAdapter(m_adapter);
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
Log.d(getPackageName(), "Clicked item id:" + id);
if(id < 0) {
startActivity(new Intent(Intent.ACTION_EDIT, Model.CONTENT_URI));
} else {
startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(Model.CONTENT_URI + "/" + id)));
}
}
}
Моя деталь деятельности кажется довольно простой; это просто RelativeLayout с количеством представлений, настроенных для отображения деталей элемента на основе URI намерения.
public class ModelDetail extends Activity {
private Uri mUri;
private FactionHelper factionHelper;
private static String mCostFormat;
private static String mDescriptionFormat;
private ModelAdapter.MarAdapter marAdapter;
@Override
public void onCreate (Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.modeldetail);
setTitle(R.string.activity_detail);
mCostFormat = getBaseContext().getResources().getString(R.string.modelCostFormat);
mDescriptionFormat = getBaseContext().getResources().getString(R.string.modelDescriptionFormat);
mUri = getIntent().getData();
factionHelper = new FactionHelper(getBaseContext());
populateData();
}
protected void populateData() {
TextView name = (TextView) findViewById(R.id.modelName);
TextView description = (TextView) findViewById(R.id.modelDescription);
// ... More finding Views and populating data ...
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
populateData();
}
}
1 ответ
Просто передайте идентификатор текущей записи в операцию детализации. Затем он запросит данные для заданного идентификатора и получит курсор для этой записи.
Затем создайте класс, который расширяет ViewSwitcher
(пользователь сможет видеть только одну информацию за раз, поэтому нам нужно только 2 просмотра одновременно). В свой класс переключателя представления добавьте метод, подобный следующему:
class MySwitcher extends ViewSwitcher {
...
long currentRowId;
long nextRowId;
long previousRowId;
public void setItemDetails(long rowId) {
final View nextView = this.getNextView();
currentRowId = rowId;
/* Get the next/previous record IDs with a query like
* "SELECT row_id FROM table WHERE row_id < "+currentRowId+" ORDER BY row_id DESC LIMIT 1;" (Previous)
* "SELECT row_id FROM table WHERE row_id > "+currentRowId+" ORDER BY row_id ASC LIMIT 1;" (Next)
*/
// Do something with nextView, like set some text or something
// You could get a cursor based on the rowID with
// "SELECT * FROM table WHERE row_id = "+currentRowId+" LIMIT 1;"
((TextView) nextView.findViewById(R.id.myTextView)).setText("Details for item #" + rowId);
this.showNext();
}
}
Если вы не хотите анимацию в первый раз setItemDetails
называется тогда использовать setAnimateFirstView(false)
на ViewSwitcher.
Затем вам нужно добавить OnTouchListener для обнаружения перетаскивания / пролистывания, а затем вызвать setItemDetails
со следующим / предыдущим идентификатором строки при обнаружении горизонтального пролистывания - вы можете установить другую анимацию в зависимости от того, переходите ли вы к следующему или предыдущему элементу.