2012-10-02 16 views
0

我对Android非常陌生,需要一些指导。带有CheckBox指南的ListView SQLite

到目前为止我有两个活动。第一个包含一个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; 
      } 
     } 

回答

1

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

2)arrayadapter应该工作得很好。请记住,何时从阵列列表中删除联系人,然后再在适配器上再次调用notfiydataset更改。另外请记住,为了删除对象的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(); 
       } 
      }); 
0

的问题:当我添加一个新用户,我只能看到在ListView的变化后,我退出使用返回按钮的应用程序。

将新用户添加到您的ArrayList(users)后,请务必在您的适配器上拨打notifyDataSetChanged()

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

如果UserProfile相当轻便,并且不会有任何方法(即它只是数据),那么CursorAdapter可能对您有一些好处。否则,我会坚持ArrayAdapter。

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

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

+0

非常感谢。 – johnpeterman