2010-08-30 69 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(); 



}