0

我对 Android 很陌生,我需要一些指导。

到目前为止,我有两个活动。第一个包含一个 ActionBar 和一个 ListView。我希望 ListView 填充包含 TextView 和 CheckBox 的行。文本由从数据库读取的用户名表示。ActionBar 具有用于操作的按钮:“新建”和“删除”。“新”打开一个新活动,将新用户添加到数据库中,删除操作应从列表和数据库中删除选中的条目。屏幕:

主要活动:http: //imgur.com/ILljQ

创建个人资料活动:http: //imgur.com/EbpD3

为了获得这些,我使用了 SQLiteHelper 和数据库的数据源以及 ListView 的自定义 ArrayAdapter。我有一个问题和一些顾虑,如下所列。

1. 问题:当我添加一个新用户时,我只能在使用后退按钮退出应用程序后看到 ListView 中的更改。

2. 自定义 ArrayAdapter 是一个很好的解决方案,还是我应该使用 CursorAdapter?单击时,列表项应将与其关联的信息用于另一个活动/片段。下面是我的自定义适配器。它现在可以工作,但下一步是实现删除操作,我不完全确定我是如何做到的。这是我需要建议的地方。谢谢!

    public class CustomUserAdapter extends ArrayAdapter<UserProfile>{

        ArrayList<UserProfile> users;
        private LayoutInflater inflater;

        public CustomUserAdapter(Context context, ArrayList<UserProfile> users) {
        // TODO Auto-generated constructor stub
        super(context, R.layout.users_list_row, users);
        this.users = users;
        inflater = LayoutInflater.from(context);
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
        UserProfile user = users.get(position);
        CheckBox checkBox;
        TextView textView;

        if(convertView == null){
            convertView =  inflater.inflate(R.layout.users_list_row, null);
            checkBox = (CheckBox) convertView.findViewById(R.id.checkElement);
            textView = (TextView) convertView.findViewById(R.id.textElement);

            //tag row
            convertView.setTag(new UserHolder(textView, checkBox));
        } else {
            UserHolder userHolder = (UserHolder) convertView.getTag();
            checkBox = userHolder.getCheckBox();
            textView = userHolder.getUserText();
        }

        //tag checkbox
        checkBox.setTag(user);

        //checkbox listener
        checkBox.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
            }
        });

        checkBox.setChecked(false);
        textView.setText(user.getUsername());

        return convertView;
            }
      }
4

2 回答 2

1

1)改变你的arraylist后,记得调用“adapter.notifyDataSetChanged();” 在与列表视图链接的适配器上

2) arrayadapter 应该可以正常工作。请记住,当您从数组列表中删除联系人时,请在适配器上再次调用 notfiydatasetchanged。还要记住,为了删除对象的 Sql 条目,您需要一个 id 或某种可以引用 SQLite 数据库的 ID(id,自动增量是标准的)

这是一个使用对话框在每个项目上实现侦听器并删除的示例。

list.setOnItemClickListener(new OnItemClickListener() {

        public void onItemClick(AdapterView<?> arg0, View arg1, final int arg2, long arg3) {
            // TODO Auto-generated method stub
            AlertDialog.Builder dialog = new AlertDialog.Builder(ContactExampleActivity.this);
            dialog.setTitle("title");
            dialog.setMessage("message");
            dialog.setPositiveButton("delete", new DialogInterface.OnClickListener(){
                public void onClick(DialogInterface dialog, int which) {
                    //delete from array and delete from sqlite database here

                    adapter.notifyDataSetChanged();
                }
            });
于 2012-10-02T22:58:52.177 回答
0

问题:当我添加一个新用户时,我只能在使用后退按钮退出应用程序后看到 ListView 中的更改。

将新用户添加到 ArrayList ( users) 后,请务必调用notifyDataSetChanged()适配器。

自定义 ArrayAdapter 是一个很好的解决方案,还是我应该使用 CursorAdapter?

如果 UserProfile 相当轻量并且没有任何方法(即,它只是数据),那么 CursorAdapter 可能对您有一些不错的优势。否则,我会坚持使用 ArrayAdapter。

单击时,列表项应将与其关联的信息用于另一个活动/片段。下面是我的自定义适配器。它现在可以工作,但下一步是实现删除操作,我不完全确定我是如何做到的。这是我需要建议的地方。

如何实现删除按钮将取决于上面代码中不清楚的几个因素。您可以使用复选框侦听器跟踪已选择的项目,然后在单击垃圾桶图标时删除所有选中的项目。在这种情况下也一定notifyDataSetChanged()要这样做。

于 2012-10-02T22:58:33.847 回答