기본적으로 각 목록 항목과 함께 목록보기가 있습니다 (2 textviews 및 확인란). 특정 목록 항목을 클릭하면 해당 행을 새 편집 텍스트보기 및 일부 단추로 바꾸려고했습니다. 어떻게 구현하나요? 정수 변수를 사용하여 선택한 항목의 현재 위치를 저장하고 다른보기를로드해야합니까? 아니면 동작 모션 이벤트를 사용하여 현재 선택된 항목을 가져와야합니까?안드로이드리스트 뷰에서 바로 편집을 수행하는 방법은 무엇입니까?
답변
한 가지 가능한 해결책은 row.xml 파일에 텍스트 뷰 2 개와 체크 박스 2 개를 포함하고 EditText + 일부 버튼을 포함하는 것입니다. 그러나 EditText와 Buttons는 기본적으로 android:visibility="gone"
이됩니다. onItemClickListener()를 설정할 수 있습니다. View.setVisibility()를 적절한 뷰에서 호출 해, 가시 또는 불가시 상태로하기위한 ListView입니다. 새 항목이 목록의 해당 행에있는 이전 항목을 대체하는 것처럼 사용자에게 표시됩니다.
EditViews는 실제로 TextView에서 서브 클래 싱되므로 실제로 EditText를 사방에 사용할 수 있으며 필요에 따라 edditable = true \ false를 설정할 수 있습니다.
또 다른 가능한 해결책이지만 팀의 대답도 적절합니다.
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.
감사합니다. @biegleux. 어댑터에 대해 선택한 항목을 설정하는 솔루션은 :) :) :) – mayuri
답장을 보내 주셔서 감사합니다. 네, 가시성을 가지고 놀 수는 있습니다. 그러나 어느 목록 항목이 현재 선택되어 있는지를 저장해야하므로 어떤 위치에서 가시성을 변경해야하는지 알 수 있습니다. – mayuri