0

我觉得我错过了一些基本的东西,而且我实际上有点尴尬地问这个问题。但这就是当你开始学习一个新平台时会发生的事情......

我有一个通过 CursorAdapter 填充的 ListViewActivity。单击列表项时,我会启动一个新 Activity 以显示该项目的详细信息。我想要做的是启用投掷/滑动以遍历详细活动中的项目。我不想完全填充 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)));
        }
    }
}

我的详细活动似乎很简单;它只是一个相对布局,其中设置了许多视图,以根据 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();
    }

}
4

1 回答 1

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 来检测拖动/滑动,然后setItemDetails在检测到水平滑动时使用下一个/上一个行 ID 调用 - 您可能希望根据您是移动到下一个还是上一个来设置不同的动画物品。

于 2011-04-05T16:04:26.543 回答