2011-04-05 9 views
0

나는 기본적인 것을 놓치고있는 것처럼 느껴진다. 나는 사실이 질문에 대해 당황 스럽다. 그러나 그것은 새로운 플랫폼을 배우기 시작할 때 발생합니다 ...ListActivity의 상세 뷰가있는 ViewFlipper?

CursorAdapter를 통해 채워지는 ListViewActivity가 있습니다. 목록 항목을 클릭하면 해당 항목의 세부 정보를 표시하는 새 활동이 시작됩니다. 내가하고 싶은 것은 flinging/swiping을 사용하여 세부 활동의 항목을 반복하는 것입니다. 목록의 항목 수에 하드 코딩 된 제한이 없기 때문에 ViewFlipper를 완전히 채우고 싶지 않으며 낭비입니다. fling 제스처/트랙볼 이동을 가로 채고 다음/이전 항목 세부 사항으로 세부 활동을 재설정 할 수있는 방법이 있습니까?

내 ListViewActivity는 (ManageQuery를 통해) 커서와 관련 Intsor와 startActivity를 호출하는 OnListItemClick이있는 관련 CursorAdapter를 설정하기 만합니다.

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))); 
     } 
    } 
} 

내 세부 활동은 매우 간단합니다. Intent의 Uri를 기반으로 항목의 세부 정보를 표시하기 위해 여러 뷰가 설정된 RelativeLayout입니다.

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 개의보기 만 필요함) 클래스를 만듭니다. 처음 setItemDetails 다음 호출되는 애니메이션이 ViewSwitcher에 setAnimateFirstView(false)을 사용하지 않으려면

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(); 
    } 
} 

: 사용자 정의보기 스위처 클래스에서와 유사한 방법을 추가 할 수 있습니다.

그런 다음 드래그/스 와이프를 감지하기 위해 OnTouchListener를 추가 한 다음 가로 스 와이프를 감지하면 setItemDetails을 다음/이전 행 ID와 함께 호출해야합니다. 이동 여부에 따라 다른 애니메이션을 설정할 수도 있습니다 다음 또는 이전 항목으로 이동하십시오.

+0

좋아요, 생각합니다. * 당신이 말하는 것을 봅니다. 내 문제는 내가 필터와 주문을 유지하고 싶다는 것이다. 그것은 단순한 선택이 아닙니다 ... 나는 또한 영리하려고 노력하고 있었고, 나는 끔찍한 잘못을 저질렀다고 생각합니다. 어쨌든 ViewSwitcher를 어떻게 활용합니까? 나는 Activity.setContentView()에서 그것을 사용합니까? OnTouchListener/GestureDetector의 경우 어떤 클래스가이를 확장합니까? 죄송합니다. 바보처럼 느껴지 긴하지만, 웹 양식 이외의 다른 도구로 작업 한 첫 UI ... : P –

+0

물론, 모든 항목을 선택하면 주문이 'ORDER BY'문에 의해 결정됩니다. 목록의 행은 그렇지 않습니까? 이 경우 다음/이전 레코드에 대한 쿼리에서 동일한 'ORDER BY' 절을 사용하고 주문이 유지됩니다 (주문이 변경 될 수있는 경우 주문의 현재 주문을 세부 정보 활동으로 전달할 수 있음). 같은 방법으로 현재 필터 (where 절)를 전달하고 다음/이전 ID를 검색 할 때 동일한 where 절을 사용할 수 있습니다. –

+0

예 setContentView에서 사용할 수 있습니다. com.mycompany.myapp.CustomViewSwitcher와 같은 커스텀 뷰 클래스가 있다면 ViewSwitcher와 같은 방식으로 XML에 넣을 수 있습니다. 단,'