2012-03-29 5 views
2

기본적으로 각 목록 항목과 함께 목록보기가 있습니다 (2 textviews 및 확인란). 특정 목록 항목을 클릭하면 해당 행을 새 편집 텍스트보기 및 일부 단추로 바꾸려고했습니다. 어떻게 구현하나요? 정수 변수를 사용하여 선택한 항목의 현재 위치를 저장하고 다른보기를로드해야합니까? 아니면 동작 모션 이벤트를 사용하여 현재 선택된 항목을 가져와야합니까?안드로이드리스트 뷰에서 바로 편집을 수행하는 방법은 무엇입니까?

답변

1

한 가지 가능한 해결책은 row.xml 파일에 텍스트 뷰 2 개와 체크 박스 2 개를 포함하고 EditText + 일부 버튼을 포함하는 것입니다. 그러나 EditText와 Buttons는 기본적으로 android:visibility="gone"이됩니다. onItemClickListener()를 설정할 수 있습니다. View.setVisibility()를 적절한 뷰에서 호출 해, 가시 또는 불가시 상태로하기위한 ListView입니다. 새 항목이 목록의 해당 행에있는 이전 항목을 대체하는 것처럼 사용자에게 표시됩니다.

+0

답장을 보내 주셔서 감사합니다. 네, 가시성을 가지고 놀 수는 있습니다. 그러나 어느 목록 항목이 현재 선택되어 있는지를 저장해야하므로 어떤 위치에서 가시성을 변경해야하는지 알 수 있습니다. – mayuri

2

EditViews는 실제로 TextView에서 서브 클래 싱되므로 실제로 EditText를 사방에 사용할 수 있으며 필요에 따라 edditable = true \ false를 설정할 수 있습니다.

또 다른 가능한 해결책이지만 팀의 대답도 적절합니다.

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() 메소드를 오버라이드 (override) :

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