如何将listview项目更改为其后面的arraylist项目

时间:2013-03-17 19:47:12

标签: android listview binding listviewitem

我需要一个包含可编辑字段的异构项的动态列表。看起来有点复杂,但基本上用户可以添加/删除项目;每个项目可以是不同的类型(我有一个名为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实现     import 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,对吗?

1 个答案:

答案 0 :(得分:0)

答案出现在观看youtube.com/watch?v=wDBM6wVEO70:

虽然可以执行这样一个复杂的列表(具有非静态项目的异构动态列表,非静态,但不是像textviews这样的非读取项目) ,在这种情况下,最好避免使用listview。它们非常昂贵且复杂。

如果是一个小数据集和一堆特殊情况,就像我所面对的那样,将一个linearlayout放在一个scrollview中并以编程方式填充它会更简单。