2010-08-30 63 views
0

我想在警报对话框中显示多选单列表。如果我使用一个数组来存储项目的列表,然后将它工作正常:在警报对话框中使用带有setMultiChoiceItems的游标

d.setMultiChoiceItems(R.array.items, 
        new boolean[]{false, true, false, true, false, false, false}, 
        new DialogInterface.OnMultiChoiceClickListener() { 
         public void onClick(DialogInterface dialog, int whichButton, 
           boolean isChecked) { 

          /* User clicked on a check box do some stuff */ 
         } 
        }) 

但在我的情况下,项目列表是动态的,我是从一个数据库歌厅。数据库不断更新其内容,因此该列表也以固定的时间间隔更新。 因此,而不是使用数组,我想在setMultiChoiceItems的参数中使用游标。 任何人都可以请告诉我怎么做....?

回答

3

只需使用setMultiChoiceItems()的另一个版本,即将Cursor作为参数的版本。您还可以给它提供结果集中代表标签和布尔值复选框设置的列的名称。

0

我们JohnBryce耶路撒冷,当然ID 5124通过如下实现它自己解决了这个问题:

final Map<Long,Boolean> selectedContactsMap = new HashMap<Long,Boolean>(); 

@Override 
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) 
{ 
    AlertDialog.Builder builder = new AlertDialog.Builder(this); 
    builder.setTitle("Share link"); 
    View selectContactView = getLayoutInflater().inflate(R.layout.contact_select_layout, null); 
    builder.setView(selectContactView); 

    ListView contactsListView = (ListView)selectContactView.findViewById(R.id.selectContactListView); 

    CursorAdapter adapter = new CursorAdapter(this, cursor, true) 
    { 

     @Override 
     public void bindView(View view, Context arg1, Cursor cursor) 
     { 
      final long id = cursor.getLong(cursor.getColumnIndex(Contacts._ID)); 
      final String displayName = cursor.getString(cursor.getColumnIndex(Contacts.DISPLAY_NAME)); 

      TextView displayNameTextView = (TextView)view.findViewById(R.id.displayNameTextView); 
      final CheckBox selectContactCheckBox = (CheckBox)view.findViewById(R.id.selectContactCheckBox); 

      displayNameTextView.setText(displayName); 

      boolean isChecked = selectedContactsMap.containsKey(id)? 
         selectedContactsMap.get(id):false; 

      selectContactCheckBox.setChecked(isChecked); 

      selectContactCheckBox.setOnClickListener(new View.OnClickListener() { 

       @Override 
       public void onClick(View v) 
       { 
        boolean isChecked = selectContactCheckBox.isChecked(); 
        if(!isChecked && selectedContactsMap.containsKey(id)) 
        { 
         Log.d(TAG, "Remove id: "+id+": "+displayName); 
         selectedContactsMap.remove(id); 
        } 
        else 
        { 
         Log.d(TAG, "Select id: "+id+": "+displayName+" : "+isChecked); 
         selectedContactsMap.put(id, isChecked); 
        } 
       } 
      }); 

     } 

     @Override 
     public View newView(Context context, Cursor arg1, ViewGroup arg2) 
     { 
      View selectContactItemView = getLayoutInflater().inflate(R.layout.contact_select_item_layout, null); 
      return selectContactItemView; 
     } 

    }; 

    contactsListView.setOnItemClickListener(new OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> arg0, View view, int position, 
       long id) 
     { 
      WebViewerFragment webViewerFrag = (WebViewerFragment) 
        getFragmentManager().findFragmentById(R.id.web_viewer_fragment); 

      String currentLink = null; 
      if (webViewerFrag != null) 
      { 
       currentLink = webViewerFrag.getCurrentLink(); 
       long _id = (Long)view.getTag(); 
       share(_id, currentLink); 

      } 
      else 
      { 
       Toast.makeText(MainActivity.this,"No link is found", Toast.LENGTH_LONG).show(); 
      } 

      shareDialog.dismiss(); 

     } 
    }); 
    contactsListView.setAdapter(adapter); 

    builder.setView(selectContactView); 
    builder.setPositiveButton("Share!", new OnClickListener() { 

     @Override 
     public void onClick(DialogInterface dialog, int which) 
     { 

     } 
    }); 
    builder.setNegativeButton("Cancel", new OnClickListener() { 

     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      Toast.makeText(MainActivity.this,":-(",Toast.LENGTH_SHORT).show(); 
     } 
    }); 

    shareDialog = builder.create(); 



}