2011-04-05 44 views
0

我覺得我錯過了一些基本的東西,而且我實際上有點尷尬地問這個問題。但這就是當你開始學習一個新的平臺時會發生什麼...ViewFlipper具有ListActivity的詳細視圖?

我有一個ListViewActivity通過CursorAdapter填充。點擊列表項目後,我開始一個新的活動來顯示該項目的詳細信息。我想要做的是啓用拋出/滑動來遍歷細節活動中的項目。我不想完全填充ViewFlipper,因爲List中的項目數量沒有硬編碼限制,而且看起來很浪費。是否有某種方法可以攔截投擲手勢/軌跡球移動,並用下一個/上一個項目詳細信息重置詳細活動?

我的ListViewActivity只是設置了一個Cursor(通過managedQuery)和相關的CursorAdapter,以及一個用適當的Intent調用startActivity的OnListItemClick。

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,用於根據Intent的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(); 
    } 

} 

回答

0

只需將當前記錄的ID傳遞給詳細信息活動即可。然後這將查詢給定ID的詳細信息並獲得該記錄的光標。

然後創建一個延伸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以檢測拖動/滑動,然後在檢測到水平滑動時使用下一個/上一個行ID調用setItemDetails - 您可能需要根據是否正在移動設置不同的動畫到下一個或上一個項目。

+0

好吧,我*想*我明白你在說什麼。我的問題是我想維護過濾器和訂購。這不是一個簡單的選擇......我也在努力變得聰明,我認爲我得到了非常錯誤的東西。無論如何,我如何利用ViewSwitcher?我是否在Activity.setContentView()中使用它?而對於OnTouchListener/GestureDetector,哪些類擴展了這些?對不起,我覺得自己像一個白癡,但這是我除了web窗體以外的第一個UI ...:P – 2011-04-05 19:12:50

+0

當然,但是當您選擇全部時,您的訂單由「ORDER BY」語句確定列表的行是不是?在這種情況下,在查詢中爲下一個/上一個記錄使用相同的'ORDER BY'子句並保留排序(如果排序可能發生變化,您可以將當前訂單傳遞給詳細信息活動)。以同樣的方式,您可以傳遞當前過濾器(where子句)並在檢索下一個/先前的ID時使用相同的where子句。 – 2011-04-05 19:26:52

+0

是的,你可以在setContentView中使用它。如果你有一個自定義視圖類,比如com.mycompany.myapp.CustomViewSwitcher,那麼你可以把它放在XML中,就像使用' 2011-04-05 19:29:57