2013-02-13 61 views

回答

2

这是我想出了:

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 

    int myDialogChoice = getArguments().getInt("whichDialog"); 
    mSelectedItems = new ArrayList(); // Where we track the selected items 
    mCurrentFavoritesSelection = new ArrayList(); 

    myDataBaseAdapter = new AthleteDbAdapter(getActivity()); 
    //  int myAthleteId; 
    AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 

    switch(myDialogChoice) { 
     case Select_From_Favorites: 

      myCursorFromSqLite = myDataBaseAdapter.fetchAllFavorites(getActivity()); 

      // You need a Primative Boolean Array to specify which items were selected last time. 
      boolean[] booleanPrimativeArray = new boolean[myCursorFromSqLite.getCount()]; 

      final ArrayList mArrayListOfIDs    = new ArrayList(); 
      ArrayList<Boolean> myBooleanList = new ArrayList<Boolean>(); 

      // This array will be the choices that appear in the Dialog. 
      ArrayList<String> mArrayListOfNames = new ArrayList<String>(); 

      myCursorFromSqLite.moveToFirst(); 
      /* Populate Arrays 
      * 
      */ 
      int iCount = 0; 

      while(!myCursorFromSqLite.isAfterLast()) { 
       // put _id's from SqLite data into an array. 
       mArrayListOfIDs.add(Integer.valueOf(
                myCursorFromSqLite.getString(myCursorFromSqLite.getColumnIndex(KEY_ROWID)))); 


       // put series of booleans into Primative Array depending upon whether user selected them last time. 
       if(Integer.valueOf(myCursorFromSqLite.getString(myCursorFromSqLite.getColumnIndex("checked"))) == 1){ 
        booleanPrimativeArray[iCount] = true; 
        mSelectedItems.add(
             Integer.valueOf(myCursorFromSqLite.getString(myCursorFromSqLite.getColumnIndex(KEY_ROWID))) 
             ); 
        // I kept track of what selections from last time were. 
        mCurrentFavoritesSelection.add(
                Integer.valueOf(myCursorFromSqLite.getString(myCursorFromSqLite.getColumnIndex(KEY_ROWID))) 
                ); 
       } else booleanPrimativeArray[iCount] = false; 
       iCount++; 
       mArrayListOfNames.add(myCursorFromSqLite.getString(myCursorFromSqLite.getColumnIndex("fullName"))); 
       myCursorFromSqLite.moveToNext(); 
      } 

      // Change the ArrayList of names to a Char Sequence 
      CharSequence[] charSeqOfNames = mArrayListOfNames.toArray(new CharSequence[mArrayListOfNames.size()]); 
      try{ 
       myCursorFromSqLite.close(); 
      } catch (Throwable t) { 
       Log.e(APP_TAG,"Error closing myCursorFromSqLite Cursor " + t); 
      } 
      builder.setTitle(R.string.pick_athletes) 

      .setMultiChoiceItems(charSeqOfNames, booleanPrimativeArray, 
           new DialogInterface.OnMultiChoiceClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which, 
            boolean isChecked) { 
        if (isChecked) { 
         // If the user checked the item, build an array containing the selected items _id's. 
         mSelectedItems.add((Integer) mArrayListOfIDs.get(which)); 

        } else if (mSelectedItems.contains((Integer) mArrayListOfIDs.get(which))) { 
         // Else, if the user changes his mind and de-selects an item, remove it 
         mSelectedItems.remove((Integer) mArrayListOfIDs.get(which)); 
        } 
       } 
      }) 
      // Set the action buttons 
      .setPositiveButton(R.string.pullathletesbutton, new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int id) { 
        // User clicked OK, so save the mSelectedItems results somewhere 
        // or return them to the component that opened the dialog 
        Log.d(APP_TAG,"Call something"); 

        mListener.onDialogPositiveClick(PickListDialog.this, mSelectedItems, mCurrentFavoritesSelection); 
       } 
      }) 
      .setNegativeButton(R.string.cancelbutton, new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int id) { 

       } 
      }); 

这行之有效。用户可以在不影响底层数据库的情况下改变主意,并正确更新复选标记。一旦用户完成他的选择,他点击“正面”按钮并更新数据库。

+0

这正是我所需要的,谢谢。我实现了它有点不同寿。在DialogInterface.OnMultiChoiceClickListener()的onClick中,我直接更新了底层表格,当我完成选择项目时,我通过表格并执行需要使用选中值的操作!但名称和布尔数组的工作就像一个魅力! – Larphoid 2014-04-28 12:34:05

+0

良好的延伸,Laphoid。很高兴我能够提供帮助。 – PhillipOReilly 2014-05-20 04:35:28

相关问题