2010-12-28 9 views
20

मैं एक सूची प्रस्तुति बनाने की कोशिश कर रहा हूं लेकिन किसी भी तरह से आइटमों को अक्षम करता हूं। इसे भूरे रंग की तरह व्यवस्थित करें या कुछ और इसमें इसे चुनने की क्षमता नहीं है। यह एक आगामी सुविधा होगी और मैं इसे सूची में होना चाहता हूं बस चयन योग्य नहीं।कस्टम पंक्ति संदर्भ?

मैंने कस्टम सूची प्रस्तुति वर्ग बनाया है और उस वर्ग में कस्टम एडाप्टर बनाया है, जो कि मैं चाहता हूं कि एडाप्टर का उपयोग करने के लिए उपयोग कर रहा हो।

कोड काम करता है, और यह एडाप्टर सेट करता है, लेकिन एडाप्टर फ़ंक्शंस में से कोई भी नहीं कहा जाता है। मैंने getCount() जैसे विधियों पर ब्रेकपॉइंट सेट किए हैं लेकिन उन्हें कभी भी कॉल नहीं किया जाता है।

मेरा कोड यहां है। http://blog.350nice.com/wp/archives/240

import android.content.Context; 
import android.content.DialogInterface; 
import android.graphics.Color; 
import android.preference.ListPreference; 
import android.util.AttributeSet; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.app.AlertDialog.Builder; 

public class CustomListPreference extends ListPreference { 

    private boolean[] mClickedDialogEntryIndices; 
    CustomListPreferenceAdapter customListPreferenceAdapter = null; 
    Context mContext; 

    public CustomListPreference(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     mContext = context; 
     mClickedDialogEntryIndices = new boolean[getEntries().length]; 
    } 

    @Override 
    protected void onPrepareDialogBuilder(Builder builder) { 
     CharSequence[] entries = getEntries(); 
     CharSequence[] 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"); 
     } 
     builder.setMultiChoiceItems(entries, mClickedDialogEntryIndices, 
       new DialogInterface.OnMultiChoiceClickListener() { 

        public void onClick(DialogInterface dialog, int which, 
          boolean val) { 
         mClickedDialogEntryIndices[which] = val; 
        } 
       }); 
     // setting my custom list adapter 
     customListPreferenceAdapter = new CustomListPreferenceAdapter(mContext); 
     builder.setAdapter(customListPreferenceAdapter, null); 
    } 

    private class CustomListPreferenceAdapter extends BaseAdapter { 

     public CustomListPreferenceAdapter(Context context) {} 

     public int getCount() { 
      return 1; 
     } 

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

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

     public View getView(int position, View convertView, ViewGroup parent) { 
      convertView.setBackgroundColor(Color.BLUE); 
      return convertView; 
     } 
    } 
} 
+0

आप इस कस्टमलिस्ट Preference का उपयोग कैसे कर रहे हैं? क्या आप xml से अपनी वरीयता सक्रियता के लिए ui को बढ़ा रहे हैं? कोड में इसे बनाना? – CaseyB

+0

मैं xml के माध्यम से अपनी वरीयता सक्रियता के लिए प्राथमिकता को परिभाषित कर रहा हूं, और उस XML में मेरे पास एक ऐसा आइटम है जो इस कस्टम सूची है। इस वर्ग को संदर्भित करने के लिए पूर्ण पैकेज नाम का उपयोग करना। – Bob

+0

अपडेट: मुझे एडाप्टर को builder.setSingleChoiceItems() का उपयोग कर काम करने के लिए मिला है और मेरे एडाप्टर में पहले तर्क के रूप में गुजर रहा है। यह विधि कुछ बार ओवरलोड हो गई है, इसलिए यदि आप इसे पढ़ रहे हैं तो इसे दस्तावेज़ में देखें। इसे सब एक साथ बांधने पर काम करना। – Bob

उत्तर

33

ठीक से मुझे यह काम करने के लिए मिला, ठीक है। मुझे एक कस्टम परिभाषित वर्ग का उपयोग करना था जो ListPreference को बढ़ाता है। उसके अंदर मुझे एक कस्टम एडाप्टर क्लास बनाना था जैसे कि आप ListView के लिए और builder.setAdapter() का उपयोग करके निर्माता को सेट कर सकते थे। मुझे श्रोताओं को दोनों रेडियो बटन और सूची दृश्य पंक्तियों के लिए भी परिभाषित करना पड़ा जो रेडियो बटनों की अनचेकिंग को संभालने में कामयाब रहे। मेरे पास अभी भी एकमात्र समस्याएं हैं, मेरी कस्टम सूची प्रस्तुति में एक ठीक और एक रद्द बटन है जहां ListPreference में केवल रद्द बटन है। मुझे नहीं पता कि ओके बटन को कैसे हटाया जाए। साथ ही, जब मैं नियमित रूप से ListPreference में करता हूं, तो मैं उन पर क्लिक करते समय पंक्तियों को हाइलाइट नहीं कर सकता।

कस्टम ListPreference कक्षा के लिए जावा कोड। अपने पैकेज नाम, वरीयता नाम (कुंजी), सूची प्रविष्टि के लिए अपनी प्रविष्टियां और मान, और अपने एक्सएमएल आइटम्स के नाम जैसी चीजों को ध्यान में रखना सुनिश्चित करें।

package your.package.here; 

import java.util.ArrayList; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.content.SharedPreferences; 
import android.graphics.Color; 
import android.preference.ListPreference; 
import android.preference.PreferenceManager; 
import android.util.AttributeSet; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.CompoundButton; 
import android.widget.RadioButton; 
import android.widget.TextView; 
import android.app.Dialog; 
import android.app.AlertDialog.Builder; 

public class CustomListPreference extends ListPreference 
{ 
    CustomListPreferenceAdapter customListPreferenceAdapter = null; 
    Context mContext; 
    private LayoutInflater mInflater; 
    CharSequence[] entries; 
    CharSequence[] entryValues; 
    ArrayList<RadioButton> rButtonList; 
    SharedPreferences prefs; 
    SharedPreferences.Editor editor; 

    public CustomListPreference(Context context, AttributeSet attrs) 
    { 
     super(context, attrs); 
     mContext = context; 
     mInflater = LayoutInflater.from(context); 
     rButtonList = new ArrayList<RadioButton>(); 
     prefs = PreferenceManager.getDefaultSharedPreferences(mContext); 
     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(mContext); 

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

      } 
     }); 
    } 

    private class CustomListPreferenceAdapter extends BaseAdapter 
    {   
     public CustomListPreferenceAdapter(Context context) 
     { 

     } 

     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; 
      CustomHolder holder = null; 

      if(row == null) 
      {                 
       row = mInflater.inflate(R.layout.custom_list_preference_row, parent, false); 
       holder = new CustomHolder(row, position); 
       row.setTag(holder); 

       // do whatever you need here, for me I wanted the last item to be greyed out and unclickable 
       if(position != 3) 
       { 
        row.setClickable(true); 
        row.setOnClickListener(new View.OnClickListener() 
        { 
         public void onClick(View v) 
         { 
          for(RadioButton rb : rButtonList) 
          { 
           if(rb.getId() != position) 
            rb.setChecked(false); 
          } 

          int index = position; 
          int value = Integer.valueOf((String) entryValues[index]); 
          editor.putInt("yourPref", value); 

          Dialog mDialog = getDialog(); 
          mDialog.dismiss(); 
         } 
        }); 
       } 
      } 

      return row; 
     } 

     class CustomHolder 
     { 
      private TextView text = null; 
      private RadioButton rButton = null; 

      CustomHolder(View row, int position) 
      {  
       text = (TextView)row.findViewById(R.id.custom_list_view_row_text_view); 
       text.setText(entries[position]); 
       rButton = (RadioButton)row.findViewById(R.id.custom_list_view_row_radio_button); 
       rButton.setId(position); 

       // again do whatever you need to, for me I wanted this item to be greyed out and unclickable 
       if(position == 3) 
       { 
        text.setTextColor(Color.LTGRAY); 
        rButton.setClickable(false); 
       } 

       // also need to do something to check your preference and set the right button as checked 

       rButtonList.add(rButton); 
       rButton.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() 
       { 
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) 
        { 
         if(isChecked) 
         { 
          for(RadioButton rb : rButtonList) 
          { 
           if(rb != buttonView) 
            rb.setChecked(false); 
          } 

          int index = buttonView.getId(); 
          int value = Integer.valueOf((String) entryValues[index]); 
          editor.putInt("yourPref", value); 

          Dialog mDialog = getDialog(); 
          mDialog.dismiss(); 
         } 
        } 
       }); 
      } 
     } 
    } 
} 

मेरी प्राथमिकता के लिए xmlActivity। यह मेरा पूरा एक्सएमएल नहीं है, सादगी के लिए मेरी अन्य प्राथमिकता वस्तुओं को बाहर निकाला। फिर, पैकेज नाम को ध्यान में रखना सुनिश्चित करें, कस्टम सूची संदर्भ श्रेणी को पैकेज नाम से संदर्भित किया जाना चाहिए। वरीयताओं और सरणी नामों के नामों को भी ध्यान रखें जो प्रविष्टियों और मानों को धारण करते हैं।

<?xml version="1.0" encoding="utf-8"?> 

<PreferenceScreen 
    xmlns:android="http://schemas.android.com/apk/res/android"> 

     <PreferenceCategory 
       android:title="Your Title"> 

       <your.package.here.CustomListPreference 
        android:key="yourPref" 
        android:title="Your Title" 
        android:dialogTitle="Your Title" 
        android:summary="Your Summary" 
        android:defaultValue="1" 
        android:entries="@array/yourArray" 
        android:entryValues="@array/yourValues"/> 

     </PreferenceCategory> 
</PreferenceScreen> 

डायलॉग की सूची दृश्य पंक्ति के लिए मेरा एक्सएमएल। GetView विधि में इस xml फ़ाइल के नाम को उस पंक्ति में उपयोग करना सुनिश्चित करें जो इसे बढ़ाता है।

<?xml version="1.0" encoding="utf-8"?> 

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:paddingBottom="8dip" 
    android:paddingTop="8dip" 
    android:paddingLeft="10dip" 
    android:paddingRight="10dip"> 

    <TableLayout 
     android:id="@+id/custom_list_view_row_table_layout" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:stretchColumns="0"> 

     <TableRow 
      android:id="@+id/custom_list_view_row_table_row" 
      android:gravity="center_vertical" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content"> 

      <TextView 
       android:id="@+id/custom_list_view_row_text_view" 
       android:textSize="22sp" 
       android:textColor="#000000" 
       android:gravity="center_vertical" 
       android:layout_width="160dip" 
       android:layout_height="40dip" /> 

      <RadioButton 
       android:checked="false" 
       android:id="@+id/custom_list_view_row_radio_button"/> 
     </TableRow> 
    </TableLayout> 

</LinearLayout> 

अंत में, यहां res/values ​​के अंतर्गत मेरा array.xml है जिसमें ListPreference के लिए प्रविष्टि नाम और मान हैं। फिर, सादगी के लिए मेरा छोटा छोटा।

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <string-array name="yourArray"> 
     <item>Item 1</item> 
     <item>Item 2</item> 
     <item>Item 3</item> 
     <item>Item 4</item> 
    </string-array> 

    <string-array name="yourValues"> 
     <item>0</item> 
     <item>1</item> 
     <item>2</item> 
     <item>3</item> 
    </string-array> 
</resources> 
+4

ओके बटन को हटाने के लिए "builder.setPositiveButton (शून्य, शून्य);" "संरक्षित शून्य पर PrepareDialogBuilder (बिल्डर बिल्डर) {" – Intrications

+0

यह पूरी तरह से काम कर रहा है जब तक कि आइटमों की संख्या (आपके मामले में 4) स्क्रीन आकार से अधिक न हो; क्या आप कृपया एक बार देख सकते हैं? यदि तत्व स्क्रीन आकार से अधिक हो जाते हैं तो पुराने तत्व – Vamsi

+0

प्रविष्टियों को दोहराने के बजाय पुराने तत्व दोहराते हैं, जब प्रविष्टियों की संख्या स्क्रीन समायोजित प्रविष्टियों से अधिक होती है, तो कुछ समय में – Vamsi

1

फ़ंक्शन getcount() रिटर्न गलत है।

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

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

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

अरे, मैं फंस गया हूँ। मुझे वही समस्या है जैसा यह यहां है। लेकिन कार्यान्वयन थोड़ा अलग है। मेरा सवाल यहाँ है। क्या आप इसमें मेरी सहायता कर सकते है? http://stackoverflow.com/questions/38331665/disable-entries-in-listpreference-which-gets-inflated-in-extend-preferenceactivi – impossible

2

शायद editor.commit() जोड़ना होगा; प्रत्येक editor.putInt(...)

0

के बाद मुझे लगता है कि आप वास्तव में आप क्या चाहते हैं गलत पर ListPreference के सक्षम ध्वज की स्थापना करके प्राप्त कर सकते हैं:

ListPreference lp = (ListPreference) findPreference("YOUR_KEY"); 
lp.setEnabled(false); 

बाहर वर्णन इस grays और यह नहीं चयन करता है।

if(row == null) {                 
    row = mInflater.inflate(R.layout.custom_list_preference_row, parent, false); 
    holder = new CustomHolder(row, position); 
} else { 
    holder = row.getTag() 
} 
// update the holder with new Text/Drawables etc., 
row.setTag(holder); 
return row; 

पुनश्च - -

+3

यह संपूर्ण ListPreference को अक्षम कर देगा, और ओपी केवल कुछ आइटम को अक्षम करना चाहता है ListPreference – jfortunato

0

के रूप में नीचे दिए गए कोड को संशोधित किया NidhiGondhia, संशोधित कोड के लिए अनुरोध किया टिप्पणी में के रूप में इस फिट नहीं हो सकता है, यहां संशोधित कोड अपडेट।

+0

अरे, मैंने शीर्ष पर टिप्पणी की लेकिन यदि आपको काफी ध्यान नहीं दिया जाता है। मैं आपको अपनी समस्या के साथ मेरी मदद करने का अनुरोध कर रहा हूं http://stackoverflow.com/questions/38331665/disable-entries-in-listpreference-which-gets-inflated-in-extend-preferenceactivi – impossible

1

उस उत्तर के लिए धन्यवाद बॉब, और डुप्लिकेट प्रविष्टियों की बग को सही करने की कोशिश करने के लिए वाम्सी, लेकिन वामसी का फिक्स मेरे लिए काम नहीं करता था। मुझे विचारों की एक श्रृंखला रखना था और इसे स्थिति में वापस करना था अगर इसे पहले से ही बनाया गया था। तो यहां मेरा पूरा कस्टमलिस्ट प्रेफर एडाप्टर क्लास है। इसमें चयनित वरीयता मान को जांचने के लिए फिक्स भी शामिल है।

private class CustomListPreferenceAdapter extends BaseAdapter 
{ 
    View[] Views; 

    public CustomListPreferenceAdapter(Context context) 
    { 
     Views = new View[entries.length]; 
    } 

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

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

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

    public View getView(final int position, View convertView, ViewGroup parent) 
    { 
     View row = Views[position]; 
     CustomHolder holder = null; 

     if(row == null) 
     {                
      row = mInflater.inflate(R.layout.listrow, parent, false); 
      holder = new CustomHolder(row, position); 
      row.setTag(holder); 
      Views[position] = row; 
     } 

     return row; 
    } 

    class CustomHolder 
    { 
     private TextView text = null; 
     private RadioButton rButton = null; 

     CustomHolder(View row, int position) 
     {  
      text = (TextView)row.findViewById(R.id.custom_list_view_row_text_view); 
      text.setText(entries[position]); 

      rButton = (RadioButton)row.findViewById(R.id.custom_list_view_row_radio_button); 
      rButton.setId(position); 

      if(getPersistedString("").compareTo((String)entryValues[position])==0) 
       rButton.setChecked(true); 

      rButtonList.add(rButton); 
     } 
    } 
} 
0

आप इसे और अधिक आसानी से कर सकते हैं।

कदम:

  1. ProxyBuilder साथ DialogPreference में ListPreference

    public class CustomListPreference extends ListPreference 
    { 
        Context mContext; 
    
        public CustomListPreference(Context context, AttributeSet attrs) 
        { 
         super(context, attrs); 
         mContext = context; 
        } 
    } 
    
  2. अवहेलना onPrepareDialogBuilder बढ़ाएँ और की जगह mBuilder: ProxyBuilder-> AlertDialog- में

    @Override 
    protected void onPrepareDialogBuilder(android.app.AlertDialog.Builder builder){ 
        super.onPrepareDialogBuilder(builder); 
    
        if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.FROYO) { 
         return; 
        } 
    
        // Inject Builder Proxy for intercepting of getView. 
        try { 
         Field privateBuilderField = 
          DialogPreference.class.getDeclaredField("mBuilder"); 
         privateBuilderField.setAccessible(true); 
    
         privateBuilderField.set(this, new ProxyBuilder(mContext, (android.app.AlertDialog.Builder)privateBuilderField.get(this))); 
        } catch (NoSuchFieldException e) { 
         e.printStackTrace(); 
        } catch (IllegalAccessException e) { 
         e.printStackTrace(); 
        } 
    } 
    
  3. हैंडल getView> onShow-> getListView-> एडाप्टर

    private class ProxyBuilder extends android.app.AlertDialog.Builder{ 
    
        android.app.AlertDialog.Builder mBuilder; 
    
        private ProxyBuilder(Context context, AlertDialog.Builder builder) { 
         super(context); 
         mBuilder = builder; 
        } 
    
    
        @TargetApi(Build.VERSION_CODES.FROYO) 
        @Override 
        public AlertDialog create() { 
         AlertDialog alertDialog = mBuilder.create(); 
         alertDialog.setOnShowListener(new DialogInterface.OnShowListener() { 
          @Override 
          public void onShow(DialogInterface dialog) { 
           ListView listView = ((AlertDialog)dialog).getListView(); 
           final ListAdapter originalAdapter = listView.getAdapter(); 
    
           listView.setAdapter(new ListAdapter(){ 
            @Override 
            public int getCount() { 
             return originalAdapter.getCount(); 
            } 
    
            @Override 
            public Object getItem(int id) { 
             return originalAdapter.getItem(id); 
            } 
    
            @Override 
            public long getItemId(int id) { 
             return originalAdapter.getItemId(id); 
            } 
    
            @Override 
            public int getItemViewType(int id) { 
             return originalAdapter.getItemViewType(id); 
            } 
    
            @Override 
            public View getView(int position, View convertView, ViewGroup parent) { 
             View view = originalAdapter.getView(position, convertView, parent); 
             TextView textView = (TextView)view; 
             textView.setTextColor(Color.RED); 
             return view; 
            } 
    
            @Override 
            public int getViewTypeCount() { 
             return originalAdapter.getViewTypeCount(); 
            } 
    
            @Override 
            public boolean hasStableIds() { 
             return originalAdapter.hasStableIds(); 
            } 
    
            @Override 
            public boolean isEmpty() { 
             return originalAdapter.isEmpty(); 
            } 
    
            @Override 
            public void registerDataSetObserver(DataSetObserver observer) { 
             originalAdapter.registerDataSetObserver(observer); 
    
            } 
    
            @Override 
            public void unregisterDataSetObserver(DataSetObserver observer) { 
             originalAdapter.unregisterDataSetObserver(observer); 
    
            } 
    
            @Override 
            public boolean areAllItemsEnabled() { 
             return originalAdapter.areAllItemsEnabled(); 
            } 
    
            @Override 
            public boolean isEnabled(int position) { 
             return originalAdapter.isEnabled(position); 
            } 
    
           }); 
          } 
         }); 
         return alertDialog; 
        } 
    } 
    
0

यह मेरे लिए काम किया, लेकिन यह अच्छी तरह से काम नहीं किया है, तो सूची स्क्रीन पर फिट नहीं करता है (और स्क्रॉल की आवश्यकता है)। मुझे समाधान खोजने के लिए मुझे बहुत समय लगता है (लेकिन मैंने अंत में किया)।

सबसे पहले समस्या: के रूप में यहाँ वर्णित: getView called with wrong position when scrolling fast जब आप में एक onclick श्रोता का उपयोग आप अप्रत्याशित व्यवहार मिल जाएगा:

public View getView(final int position, View convertView, ViewGroup parent) 

मेरे मामले में, onClick ईवेंट स्मृति में संग्रहीत और होगा किया जाएगा जब उपयोगकर्ता स्क्रॉल करने की कोशिश करता है तो उसे निष्पादित किया जाए (थोड़ा)।

और अब समाधान: (कम से कम यह मेरे लिए काम किया) मुख्य वर्ग में onClick श्रोता रखो:

public class CustomListPreference extends ListPreference { 

// Other code (see above) 
@Override 
protected void onPrepareDialogBuilder(Builder builder) 
{ 
    builder.setPositiveButton(null, null); 

    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(mContext); 

    builder.setAdapter(customListPreferenceAdapter, new DialogInterface.OnClickListener() 
    { 
     public void onClick(DialogInterface dialog, int position) 
     { 
      // Code here, using position to indicate the row that was clicked... 
      dialog.dismiss(); 
     } 
    }); 

} 

इस पर waaaay बहुत अधिक समय खर्च, इसलिए आशा है कि यह किसी को मदद मिलेगी बाहर :)

सब कुछ, अभी भी इस कोड उदाहरण के साथ वास्तव में खुश है! (इसे रंग पिकर के रूप में उपयोग करें)।

पीएस अगर आपको यह पोस्ट पसंद है, तो कृपया उपयोगी वोट दें। धन्यवाद!

5

यह मेरे लिए अच्छा काम करता है। मैंने एक एडाप्टर दृष्टिकोण का उपयोग किया जो दृश्य में एक लपेटा एडाप्टर इंजेक्ट करता है।

import android.database.DataSetObserver; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ListAdapter; 
import android.widget.WrapperListAdapter; 

class ListPrefWrapperAdapter implements WrapperListAdapter { 
    private ListAdapter mOrigAdapter; 

    public ListPrefWrapperAdapter(ListAdapter origAdapter) { 
     mOrigAdapter = origAdapter; 
    } 

    @Override 
    public ListAdapter getWrappedAdapter() { 
     return mOrigAdapter; 
    } 

    @Override 
    public boolean areAllItemsEnabled() { 
     return getWrappedAdapter().areAllItemsEnabled(); 
    } 

    @Override 
    public boolean isEnabled(int position) { 
     return getWrappedAdapter().isEnabled(position); 
    } 

    @Override 
    public void registerDataSetObserver(DataSetObserver observer) { 
     getWrappedAdapter().registerDataSetObserver(observer); 
    } 

    @Override 
    public void unregisterDataSetObserver(DataSetObserver observer) { 
     getWrappedAdapter().unregisterDataSetObserver(observer); 
    } 

    @Override 
    public int getCount() { 
     return getWrappedAdapter().getCount(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return getWrappedAdapter().getItem(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return getWrappedAdapter().getItemId(position); 
    } 

    @Override 
    public boolean hasStableIds() { 
     return getWrappedAdapter().hasStableIds(); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     return getWrappedAdapter().getView(position, convertView, parent); 
    } 

    @Override 
    public int getItemViewType(int position) { 
     return getWrappedAdapter().getItemViewType(position); 
    } 

    @Override 
    public int getViewTypeCount() { 
     return getWrappedAdapter().getViewTypeCount(); 
    } 

    @Override 
    public boolean isEmpty() { 
     return getWrappedAdapter().isEmpty(); 
    } 
} 

यहाँ CustomListPreference आधार वर्ग ListPrefWrapperAdapter का उपयोग करता है:

यहाँ आधार लिपटे एडाप्टर वर्ग है

import android.app.AlertDialog; 
import android.content.Context; 
import android.os.Bundle; 
import android.util.AttributeSet; 
import android.widget.ListAdapter; 
import android.widget.ListView; 

public class CustomListPreference extends ListPreference { 
    public CustomListPreference(Context context) { 
     super(context); 
    } 

    public CustomListPreference(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    @Override 
    protected void showDialog(Bundle state) { 
     super.showDialog(state); 
     AlertDialog dialog = (AlertDialog) getDialog(); 
     ListView listView = dialog.getListView(); 
     ListAdapter adapter = listView.getAdapter(); 
     final ListPrefWrapperAdapter fontTypeAdapter = createWrapperAdapter(adapter); 

     // Adjust the selection because resetting the adapter loses the selection. 
     int selectedPosition = findIndexOfValue(getValue()); 
     listView.setAdapter(fontTypeAdapter); 
     if (selectedPosition != -1) { 
      listView.setItemChecked(selectedPosition, true); 
      listView.setSelection(selectedPosition); 
     } 
    } 

    protected ListPrefWrapperAdapter createWrapperAdapter(ListAdapter origAdapter) { 
     return new ListPrefWrapperAdapter(origAdapter); 
    } 

} 

अंत में, यहाँ व्युत्पन्न वर्ग कि अक्षम करने और सक्षम करने कर रहे हैं विशिष्ट पंक्तियों का:

import android.content.Context; 
import android.graphics.Color; 
import android.graphics.Typeface; 
import android.util.AttributeSet; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.CheckedTextView; 
import android.widget.ListAdapter; 

public class FontTypePreference extends CustomListPreference { 

    public FontTypePreference(Context context) { 
     super(context); 
    } 

    public FontTypePreference(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    @Override 
    protected ListPrefWrapperAdapter createWrapperAdapter(ListAdapter origAdapter) { 
     return new Adapter(origAdapter); 
    } 

    private class Adapter extends ListPrefWrapperAdapter { 
     private static final float TEXT_SIZE = 25.0f; 
     private static final int STARTING_UPGRADE_REQUIRED_INDEX = 8; 

     public Adapter(ListAdapter origAdapter) { 
      super(origAdapter); 
     } 

     @Override 
     public boolean areAllItemsEnabled() { 
      return false; 
     } 

     @Override 
     public boolean isEnabled(int position) { 
      return position < STARTING_UPGRADE_REQUIRED_INDEX; 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      CheckedTextView textView = (CheckedTextView) getWrappedAdapter() 
        .getView(position, convertView, parent); 
      textView.setTextColor(position < STARTING_UPGRADE_REQUIRED_INDEX ? 
        Color.BLACK : Color.RED); 
      return textView; 
     } 


    } 

} 

मेरे पास केवल टेस्ट है एसडीके संस्करण 15 और ऊपर इस कोड को डी।

संबंधित मुद्दे