1

次の問題があります。追加の画像を含むテキストビューを表示するためのカスタムリスト設定を作成しました。次の問題を除いて、ほぼすべてが正常に機能します。

元のリスト設定は現在選択されている位置までスクロールしますが、カスタムリスト設定にはこの動作が表示されません。カスタムリストの設定をAndroidバージョン(または私の場合はholoeverywhereバージョン)に置き換えると、すべてが正常に機能します。したがって、バグはカスタムリスト設定の現在の実装にあるはずだと思います。

public class CustomListPreference extends ListPreference {
private CustomListPreferenceAdapter customListPreferenceAdapter = null;
private Context mContext;
private LayoutInflater mInflater;
private CharSequence[] entries;
private CharSequence[] entryValues;
private Map<String, Boolean> rButtonMapping = null;
private SharedPreferences prefs;
private SharedPreferences.Editor editor;

public CustomListPreference(Context context, AttributeSet attrs) {
    super(context, attrs);
    mContext = context;
    mInflater = LayoutInflater.from(context);
    rButtonMapping = new HashMap<String, Boolean>();
    prefs = PreferenceManager.getDefaultSharedPreferences(mContext);

    // init the button mapping with the default values
    for (int i = 0; i < Data.getData().length; i++) {
        rButtonMapping.put(Data.getData()[i], false);
    }

    // Set the current selected value to true
    String currentSelectedValue = prefs.getString(
            SettingsActivity.CUST_PREF_KEY, "TEST1");
    rButtonMapping.put(currentSelectedValue, true);

    editor = prefs.edit();
}

@Override
protected void onPrepareDialogBuilder(Builder builder) {
    entries = getEntries();
    entryValues = getEntryValues();

    if (entries == null || entryValues == null
            || entries.length != entryValues.length) {
        throw new IllegalStateException(
                "ListPreference requires an entries array and an entryValues array which are both the same length");
    }

    customListPreferenceAdapter = new CustomListPreferenceAdapter();

    builder.setAdapter(customListPreferenceAdapter,
            new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {

                }
            });
}

private class CustomListPreferenceAdapter extends BaseAdapter {

    public int getCount() {
        return entries.length;
    }

    public Object getItem(int position) {
        return position;
    }

    public long getItemId(int position) {
        return position;
    }

    public View getView(final int position, View convertView,
            ViewGroup parent) {
        View row = convertView;
        if (row == null) {
            row = mInflater.inflate(R.layout.custom_list_preference_row,
                    parent, false);
        }

        TextView text = (TextView) row
                .findViewById(R.id.settings_tv_test);
        text.setText(entries[position]);

        try {
            InputStream ims = mContext.getAssets().open(
                    "pics/" + entryValues[position] + ".png");
            BitmapDrawable d = new BitmapDrawable(mContext.getResources(),
                    ims);
            d.setTargetDensity(mContext.getResources().getDisplayMetrics().densityDpi);

            text.setCompoundDrawablesWithIntrinsicBounds(d, null, null,
                    null);
        } catch (IOException e) {
            text.setCompoundDrawablesWithIntrinsicBounds(null, null, null,
                    null);
        }

        RadioButton rButton = (RadioButton) row
                .findViewById(R.id.settings_rb);
        // If the current position is checked we also check the current
        // value
        rButton.setChecked(rButtonMapping.get(entryValues[position]));
        row.setClickable(true);
        row.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                for (String currentString : rButtonMapping.keySet()) {
                    rButtonMapping.put(currentString, false);
                }
                // Set the current selected value to true
                rButtonMapping.put((String) entryValues[position], true);

                // Also send the selected value to the editor
                editor.putString(SettingsActivity.CUST_PREF_KEY,
                        (String) entryValues[position]);
                editor.commit();

                getDialog().dismiss();
            }
        });

        rButton.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                for (String currentString : rButtonMapping.keySet()) {
                    rButtonMapping.put(currentString, false);
                }
                // Set the current selected value to true
                rButtonMapping.put((String) entryValues[position], true);

                // Also send the selected value to the editor
                editor.putString(SettingsActivity.CUST_PREF_KEY,
                        (String) entryValues[position]);
                editor.commit();

                getDialog().dismiss();
            }
        });

        return row;
    }
}

}

私もここでStackoverflowとGoogleについて調査しましたが、誰もこの問題を抱えていないようです。

誰かが問題が何であるかを見ていますか?

4

2 に答える 2

2

setAdapterの呼び出しをビルダーのsetSingleChoiceItemsメソッドの呼び出しに置き換えることをお勧めします。

builder.setSingleChoiceItems(adapter, adapter.getSelectedItem(), 
    new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {

            }
        });

adapter.getSelectedItem()は、現在選択されている行のインデックスを返すメソッドになります。

于 2013-01-28T18:12:17.483 に答える
0

で選択したアイテムにスクロールするには、カスタムクラスのメソッドでAndroidのメソッドをListPreference使用するだけです。例えば:setSelectionListViewonCreateDialogView()ListPreference

public class CustomListPreference extends ListPreference {
    @Override
    protected View onCreateDialogView() {            
        ListView mListView = (ListView) view.findViewById(android.R.id.list);
        // Scroll to selected item in ListView.
        mListView.setSelection(findIndexOfValue(getValue()));
    }
}
于 2014-12-20T19:44:22.677 に答える