如何在android listview中进行就地编辑?
基本上我有一个列表视图,每个列表项都是(2个文本视图和一个复选框)。单击特定列表项时,我想用新的编辑文本视图和一些按钮替换该行。 我如何实现这一点?如何在android listview中进行就地编辑?,android,listview,inplace-editing,Android,Listview,Inplace Editing,基本上我有一个列表视图,每个列表项都是(2个文本视图和一个复选框)。单击特定列表项时,我想用新的编辑文本视图和一些按钮替换该行。 我如何实现这一点? 我应该使用整数变量来存储所选项目的当前位置并加载其他视图,还是使用动作动作事件来获取当前所选项目?一种可能的解决方案是让row.xml文件同时包含(2个文本视图和一个复选框)和(编辑文本+一些按钮)但是,如果将EditText和按钮默认设置为android:visibility=“gone”,则可以为ListView设置一个onItemClickL
我应该使用整数变量来存储所选项目的当前位置并加载其他视图,还是使用动作动作事件来获取当前所选项目?一种可能的解决方案是让row.xml文件同时包含(2个文本视图和一个复选框)和(编辑文本+一些按钮)但是,如果将EditText和按钮默认设置为
android:visibility=“gone”
,则可以为ListView设置一个onItemClickListener(),该ListView将在适当的视图上调用view.setVisibility(),以使它们可见/不可见。在用户看来,这就好像新项目正在替换列表中该行中的旧项目一样。一个可能的解决方案是让row.xml文件同时包含(2个文本视图和一个复选框)和(EditText+一些按钮),但将EditText和按钮默认为android:visibility=“gone”
然后可以为ListView设置一个onItemClickListener(),该ListView将在适当的视图上调用view.setVisibility(),以使它们可见/不可见。在用户看来,这就好像新项目正在替换列表中该行的旧项目一样。EditView实际上是从TextView中派生出来的,因此您可以在任何地方使用EditText,然后根据需要设置edditable=true\false
这只是另一种可能的解决方案,但Tim的答案也是合适的。EditView实际上是从TextView中派生出来的,因此您可以在任何地方使用EditText,然后根据需要设置edditable=true\false 这只是另一个可能的解决方案,但Tim的答案也是合适的。您的
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);
...
}
如果只有一个项目可以同时更改视图,则最好将选定标志存储在适配器中:
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;
}
...
@覆盖
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
MyAdapter MyAdapter=(MyAdapter)parent.getAdapter();
myAdapter.setSelected(位置);
myAdapter.notifyDataSetChanged();
...
}
类MyAdapter扩展了ArrayAdapter{
private int mSelected=-1;
...
公共职位(国际职位){
mSelected=位置;
}
@凌驾
public int getItemViewType(int位置){
返回(mSelected==位置)?查看所选项目:查看项目正常;
}
...
不要忘记应用您可以看到的ViewHolder模式,例如:您的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);
...
}
如果只有一个项目可以同时更改视图,则最好将选定标志存储在适配器中:
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;
}
...
@覆盖
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
MyAdapter MyAdapter=(MyAdapter)parent.getAdapter();
myAdapter.setSelected(位置);
myAdapter.notifyDataSetChanged();
...
}
类MyAdapter扩展了ArrayAdapter{
private int mSelected=-1;
...
公共职位(国际职位){
mSelected=位置;
}
@凌驾
public int getItemViewType(int位置){
返回(mSelected==位置)?查看所选项目:查看项目正常;
}
...
不要忘记应用您可以看到的ViewHolder模式,例如…谢谢@biegleux。您为适配器设置所选项目的解决方案有效:):)谢谢@biegleux。您为适配器设置所选项目的解决方案有效:):)谢谢您的回答。是的,我可以使用可见性,但我仍然必须存储列表的位置项目当前已选定,以便知道在哪个位置必须更改可见性。感谢您的回答。是的,我可以使用可见性,但我仍必须存储当前选定列表项目的位置,以便知道在哪个位置必须更改可见性。