【发布时间】:2013-03-06 02:44:06
【问题描述】:
我需要具有可编辑字段的异构项目的动态列表。看起来有点复杂,但本质上用户可以添加/删除项目;每个项目可以是不同的类型(我有一个名为Action 的抽象类,每个单一类型都对其进行扩展),并且具有可编辑的字段(即EditText)。
我使用了ListView(这似乎是更自然的方式),我做了一个适配器,扩展ArrayAdapter,绑定到ArrayList<Action>,但我注意到对列表项的更改不支持ArrayList的对应项。
这很难解释,但我这样做:
启动应用程序,添加某种类型的元素,在 ID 为 R.id.action_add_text 的 EditText 上写一些东西,然后我期待
String text = ((EditText) actions.get(0).view.findViewById(R.id.action_add_text)).getText().toString();
反映我在那个 EditText 中写的内容,但它仍然是空的。
我哪里错了?我需要获取当前列表状态来保存它,但我不知道在哪里检索它,有没有办法“双向”绑定,以便将 UI 更改报告回适配器?或者我应该遍历 listview 子项(但是适配器的功能是什么)?
请耐心等待,我搜索了很多但找不到任何有用的东西(也许我找不到合适的词来搜索)
编辑:ArrayAdapter 实现 导入 java.util.ArrayList;
import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
public class ActionAdapter extends ArrayAdapter<Action> {
Context context;
int layoutResourceId;
ArrayList<Action> actions = null;
public ActionAdapter(Context context, int layoutResourceId, ArrayList<Action> actions) {
super(context, layoutResourceId, actions);
this.layoutResourceId = layoutResourceId;
this.context = context;
this.actions = actions;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
ActionHolder holder = null;
if(row == null)
{
LayoutInflater inflater = ((Activity)context).getLayoutInflater();
row = inflater.inflate(actions.get(position).viewId, parent, false);
holder = new ActionHolder();
holder.title = (TextView)row.findViewById(R.id.action_title);
row.setTag(holder);
}
else
{
holder = (ActionHolder)row.getTag();
}
Action action = actions.get(position);
holder.title.setText(action.title);
return row;
}
static class ActionHolder
{
TextView title;
}
}
同时我认为我需要重写 getItemViewType 和 getViewTypeCount,对吧?
【问题讨论】:
-
进行 ui 更改并在您的适配器上调用 notifyDataSetChanged()。
-
在此处添加 ArrayAdapter 的实现。
-
@Raghunandan 是 notifyDataSetChanged() 双向的吗?但如果是的话,那我怎么知道ui什么时候改变了?顺便说一下,我会看视频,谢谢。
-
@Sajmon 添加到问题
标签: android listview binding listviewitem