2

基本的に、各リスト項目を(2つのテキストビューとチェックボックス)として持つリストビューがあります。特定のリスト項目がクリックされたときに、その行を新しい編集テキスト ビューといくつかのボタンに置​​き換えたいと考えました。これを実装するにはどうすればよいですか? 整数変数を使用して選択したアイテムの現在の位置を保存し、別のビューをロードするか、アクションモーションイベントを使用して現在選択されているアイテムを取得する必要がありますか?

4

3 に答える 3

2

EditViews は実際には TextView からサブクラス化されているため、実際にはどこでも EditText を使用でき、必要に応じて edditable=true\false を設定できます。

別の可能な解決策ですが、ティムの答えも適切です。

于 2012-03-29T13:50:01.263 に答える
1

次のonItemClick()ようになります。

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    MyAdapter myAdapter = (MyAdapter) parent.getAdapter();
    MyItem myItem = (MyItem) myAdapter.getItem(position);
    myItem.setSelected(true);  // set selected flag

    // notify the data has been changed and the view should refresh itself
    myAdapter.notifyDataSetChanged();

    // you can obtain the item view type by calling
    // myAdapter.getItemViewType(position);
    ...
}

アダプタのメソッドとメソッドをオーバーライドgetViewTypeCount()します。getItemViewType()getView()

class MyAdapter extends ArrayAdapter<MyItem> {

    private LayoutInflater mInflater;
    private static final int VIEW_ITEM_NORMAL = 0;
    private static final int VIEW_ITEM_SELECTED = 1;
    ...

    @Override
    public int getItemViewType(int position) {
        return getItem(position).isSelected() ? VIEW_ITEM_SELECTED : VIEW_ITEM_NORMAL;
        // implement isSelected()
    }

    @Override
    public int getViewTypeCount() {
        return 2;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View v = convertView;

        int layoutId;
        int viewType = getItemViewType(position);
        if (v == null) {
            switch (viewType) {
                case VIEW_ITEM_NORMAL:
                    layoutId = R.layout.list_item;
                    break;
                case VIEW_ITEM_SELECTED:
                    layoutId = R.layout.list_item_selected;
                    break;
                default:
                    layoutId = R.layout.list_item;
                    break;
            }
            v = mInflater.inflate(layoutId, parent, false);
        } else {
            v = convertView;
        }
        ...

同時にビューを変更できるアイテムが 1 つだけの場合は、選択したフラグをアダプターに保存することをお勧めします。

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    MyAdapter myAdapter = (MyAdapter) parent.getAdapter();
    myAdapter.setSelected(position);
    myAdapter.notifyDataSetChanged();
    ...
}

class MyAdapter extends ArrayAdapter<MyItem> {

    private int mSelected = -1;
    ...

    public void setSelected(int position) {
        mSelected = position;
    }

    @Override
    public int getItemViewType(int position) {
        return (mSelected == position) ? VIEW_ITEM_SELECTED : VIEW_ITEM_NORMAL;
    }
    ...

ここで見ることができる ViewHolder パターンを適用することを忘れないでください。

于 2012-03-29T14:22:39.907 に答える
1

考えられる解決策の 1 つは、row.xml ファイルに (2 つのテキストビューとチェックボックス) と (EditText + いくつかのボタン) の両方を含めることですが、EditText とボタンのデフォルトandroid:visibility="gone"を適切なビューで view.setVisibility() を使用して、それらを表示/非表示にします。これは、リストのその行の古いアイテムが新しいアイテムに置き換わっているようにユーザーに表示されます。

于 2012-03-29T13:21:42.400 に答える