不能引用内部类中的非final变量。如何实现onPreferenceClickListener?

时间:2012-03-15 13:59:58

标签: android preferenceactivity

虽然我已经意识到这个问题曾经被问过一两次但是我仍然不知道我应该如何通过为每个checkboxpreferences创建一个监听器来解决问题。

关于如何解决这个问题的任何建议?

private void setQueuePreferences(JSONObject[] qInfo) 
{
    PreferenceCategory QueueCategory = (PreferenceCategory)findPreference("category_queues");
    CheckBoxPreference[] cbox_queues = new CheckBoxPreference[qInfo.length];

    for(int i = 0; i < qInfo.length; i++)
    {
        cbox_queues[i] = new CheckBoxPreference(this);
        cbox_queues[i].setKey("queue_" + i);

        // Formatting the queue title
        String name = qInfo[i].optString("name").replace("-", " ");
        cbox_queues[i].setTitle(name);

        if(qInfo[i].optString("active").contentEquals("1"))
            cbox_queues[i].setChecked(true);
        else
            cbox_queues[i].setChecked(false);

        QueueCategory.addPreference(cbox_queues[i]);
        cbox_queues[i].setOnPreferenceClickListener(new OnPreferenceClickListener()
        {

            public boolean onPreferenceClick(Preference preference) 
            {
                final String[] param = new String[1];
                param[0] = qInfo[i].optString("name");

                if(cbox_queues[i].isChecked())
                {   
                    new JoinQueueTask().execute(param);
                }
                else
                    new LeaveQueueTask().execute(param);
            }

        });
    }
}

2 个答案:

答案 0 :(得分:1)

您可以将数组标记为final,并仍然更改其中的元素。但是,您无法为该变量分配不同的数组。

对于i变量,你可以在循环中创建一个新的final int,如下所示:

final int ii = i;

然后使用那个。

答案 1 :(得分:1)

试试这个:

private void setQueuePreferences(JSONObject[] qInfo) {
  PreferenceCategory QueueCategory = (PreferenceCategory)findPreference("category_queues");
  CheckBoxPreference[] cbox_queues = new CheckBoxPreference[qInfo.length];

  for(int i = 0; i < qInfo.length; i++) {
    final JSONObject qInfoCurrent = qInfo[i];
    final CheckBoxPreference cbp = new CheckBoxPreference(this);
    cbox_queues[i] = cbp;
    cbp.setKey("queue_" + i);

    // Formatting the queue title
    String name = qInfoCurrent.optString("name").replace("-", " ");
    cbp.setTitle(name);

    if(qInfoCurrent.optString("active").contentEquals("1"))
        cbp.setChecked(true);
    else
        cbp.setChecked(false);

    QueueCategory.addPreference(cbp);
    cbp.setOnPreferenceClickListener(new OnPreferenceClickListener() {

        public boolean onPreferenceClick(Preference preference) {
            final String[] param = new String[1];
            param[0] = qInfoCurrent.optString("name");

            if(cbp.isChecked()) {   
                new JoinQueueTask().execute(param);
            } else
                new LeaveQueueTask().execute(param);
        }

    });
}

}