2012-03-29 9 views
2

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

答えて

1

あなたのrow.xmlファイルに2つのテキストビューとチェックボックスがあり、(EditText +いくつかのボタン)がありますが、EditTextとButtonsのデフォルトはandroid:visibility="gone"になります。次にonItemClickListener()を適切なビューでview.setVisibility()を呼び出して可視/不可視にするListView。これは、新しい項目がリストのその行の古い項目を置き換えているかのように、ユーザーに表示されます。

+0

あなたの答えをありがとう。はい、私は可視性で遊ぶことができますが、まだどのリストの項目が現在選択されているかの位置を保存しなければならないので、どの位置で可視性を変更する必要があるかを知る必要があります。 – mayuri

2

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

ちょっと別の解決策かもしれませんが、ティムの答えも適切です。

1

あなたonItemClick()は次のようになります。一つだけのアイテムが同時にビューを変更することができる場合

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

、:

@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()メソッドをオーバーライドアダプタに選択したフラグを保存する方が良いでしょう:

@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パターンを適用することを忘れないでください。 here

+0

ありがとう@biegleux。アダプタの選択項目を設定するあなたの解決策は:) :) :) – mayuri

関連する問題