【问题标题】:ListActivity with custom layout does not call getview具有自定义布局的 ListActivity 不会调用 getview
【发布时间】:2011-02-14 02:34:12
【问题描述】:

我有一个带有自定义行布局的 ListActivity。行布局由一个复选框、一个文本视图和一个图像按钮组成。

这后面是一个自定义对象的 ArrayList,它只包含一个字符串和一个布尔值。我想复选框反映布尔值,文本视图反映 Sting,右侧的按钮将启动一个动作。

我使用 ArrayAdapter 页面上列出的最后一个构造函数来尝试将它们绑定在一起。 ArrayAdapter(Context context, int resource, int textViewResourceId, List<T> objects)

由于某种原因,textView 由对象 toString() 填充,而不是由 getView 填充。因此,复选框根本不会获得布尔值。有什么想法吗?

public class ListSelection extends ListActivity {
    private ArrayList<ListItem> list;
    private ArrayList<String> deleted;  

    static private final String TAG = "kinder";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "ListSelection.onCreate");   

        list = new ArrayList<ListItem>();
        deleted = new ArrayList<String>();

        Intent temp = getIntent();
        String[] listNames = temp.getStringArrayExtra("listNames");
        boolean[] listStatus = temp.getBooleanArrayExtra("listStatus");
        for (int i = 0; i < listNames.length; i++) {
            list.add(new ListItem(listNames[i], listStatus[i]));
        }

        **setListAdapter(new ArrayAdapter<ListItem>(this, R.layout.selectionlistitem, R.id.text, list));**

    }

    private class ListItem {
        String listName;
        Boolean listStatus;     
        public ListItem(String name, boolean status) {
            listName = name;
            listStatus = status;
        }
        @Override
        public String toString() {
            return listName;
        }
    }

    public class ListItemArrayAdapter extends ArrayAdapter<ListItem> {
        int resource;
        LayoutInflater vi;
        private List<ListItem> items;

        public ListItemArrayAdapter(Context context, int _resource, List<ListItem> listitems) {
            super(context, _resource, listitems);
            Log.d(TAG, "listItemArrayAdapter");
            vi = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            resource = _resource;
            this.items = listitems;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            Log.d(TAG, "listItemArrayAdapter.getView");
            LinearLayout newView;

            ListItem item = getItem(position);

            if (convertView == null) {
                newView = new LinearLayout(getContext());
                vi.inflate(resource, newView);
            } else {
                newView = (LinearLayout)convertView;
            }

            TextView textview = (TextView)newView.findViewById(R.id.text);
            Log.d(TAG, item.listName);
            textview.setText(item.listName);

            CheckBox checkbox = (CheckBox)newView.findViewById(R.id.checkbox);
            checkbox.setChecked(item.listStatus);
            return newView;
        }
    }

}

【问题讨论】:

    标签: android listactivity android-arrayadapter


    【解决方案1】:

    在我看来你应该替换这一行:

    setListAdapter(new ArrayAdapter<ListItem>(this, R.layout.selectionlistitem, R.id.text, list));
    

    用这个:

    setListAdapter(new ListItemArrayAdapter<ListItem>(this, R.layout.selectionlistitem, list));
    

    就目前而言,您正在使用ArrayAdapter 的默认视图生成逻辑,即将每个数组元素的toString() 提供给TextView

    【讨论】:

    • 你是绝对正确的。你不会相信我在没有看到那个错误的情况下花了多少时间。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2015-10-22
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多