android सेक्शन विभाजक/डिवाइडर को ListView में कैसे जोड़ें?




android-layout android-listview (2)

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

मुझे वर्तमान में सूची बनाने में कोई समस्या नहीं है, लेकिन अब यह अच्छा लग रहा है, मैं विभिन्न प्रकार के विकल्पों (यानी उपयोगकर्ता से संबंधित और एप्लिकेशन से संबंधित विकल्प) और मेनू के शीर्ष पर एक खोज बार के बीच विभाजक जोड़ना चाहता हूं।

मेरे वर्तमान ArrayAdaptor उपclass का कोड निम्नानुसार है:

public class DrawerMenuAdapter extends ArrayAdapter<String>{
    private Context context;
    private String[] values;
    private int resId;

    public DrawerMenuAdapter(Context context, int textViewResourceId, String[] values) {
        super(context, textViewResourceId, values);
        this.context = context;
        this.values = values;
        this.resId = textViewResourceId;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent){
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View rowView = inflater.inflate(this.resId, parent, false);

        TextView elementText = (TextView)rowView.findViewById(R.id.element_text);
        ImageView elementImage = (ImageView)rowView.findViewById(R.id.element_icon);
        String textValue = values[position];

        elementText.setText(textValue);

        //This switch adds the icons to the related elements
        switch (position){
            case 0:
                elementImage.setImageResource(R.drawable.search);
                break;
            case 1:
                elementImage.setImageResource(R.drawable.facebook_friends);
                break;
            case 2:
                elementImage.setImageResource(R.drawable.flirts_history);
                break;
            case 3:
                elementImage.setImageResource(R.drawable.premium);
                break;
            case 4:
                elementImage.setImageResource(R.drawable.settings);
                break;
            case 5:
                elementImage.setImageResource(R.drawable.share_app);
                break;
            case 6:
                elementImage.setImageResource(R.drawable.cgu);
                break;
        }


        return rowView;
    }
}

मुझे लगता है कि मुझे getView फ़ंक्शन को कॉल करके ListView को पॉप्युलेट करने वाले फ़ंक्शन को ओवरराइड करना है, लेकिन मुझे यह नहीं मिल रहा है कि यह कौन सा फ़ंक्शन है।


यदि आप अपनी सूची दृश्य में सरल अनुभाग चाहते हैं, तो इस ट्यूटोरियल पर एक नज़र डालें:

http://cyrilmottier.com/2011/07/05/listview-tips-tricks-2-section-your-listview/

या यह ट्यूटोरियल:

http://bartinger.at/listview-with-sectionsseparators/

दूसरा एक विस्तृत नहीं है, लेकिन समझना आसान / आसान रखना आसान है।

मूल विचार यह है कि आप अपनी ListAdapter के विभिन्न प्रकार के विचार करते हैं। उदाहरण के लिए दो अलग-अलग दृश्य जहां एक प्रकार वास्तविक सूची आइटम जानकारी प्रदर्शित करता है, और अन्य प्रकार का दृश्य अनुभाग विभाजक होता है।

ट्यूटोरियल से:

ListViews और अधिक विशेष रूप से एडाप्टर कई प्रकार के दृश्यों को संभाल सकते हैं । यदि आप एडाप्टर इंटरफ़ेस पर एक नज़र डालते हैं तो आपको पता चलेगा कि इसमें दो विशिष्ट विधियां हैं:

  • getViewTypeCount() जो आपके एडाप्टर व्यू मैनेज के दृश्यों की संख्या देता है। अधिकांश समय यह विधि 1 लौटाती है क्योंकि ListView के सभी आइटम समान होते हैं। इस मामले में, 2 लौटकर, ListView दो प्रकार के दृश्यों को संभालेगा: नियमित आइटम दृश्य और विभाजक दृश्य
  • getItemViewType(int) को 0 (समावेशी) और getViewTypeCount() (अनन्य) के बीच एक पूर्णांक वापस करना होगा। दी गई संख्या दी गई स्थिति पर दृश्य के प्रकार को व्यक्त करती है। उदाहरण के लिए, हम यह सुनिश्चित कर सकते हैं कि लौटाए गए मूल्य नियमित आइटम दृश्यों के लिए 0 और विभाजक के लिए 1 हैं

मैं यहां एक जवाब जोड़ रहा हूं क्योंकि मैंने इस पर एक और तरीका लगाया है। यह @ फिल पोस्ट किए गए लिंक की तरह दिखता है।

सबसे पहले मैं उस मेनू की एक स्ट्रिंग सरणी सेट करता हूं जिसे मैं प्रदर्शित करना चाहता हूं। मैंने व्यक्तिगत सुविधा के लिए इस सरणी को XML संसाधन फ़ाइल में लिखा है।

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array
            name="drawer_menu_options">
        <item>Username</item>
        <item>-sep-Flirter</item>
        <item>Recherche</item>
        <item>Amis Facebook</item>
        <item>Flirts</item>
        <item>Compte premium</item>
        <item>-sep-Menu</item>
        <item>Réglages</item>
        <item>Inviter des amis</item>
        <item>CGU</item>
    </string-array>
</resources>

ध्यान दें कि मेरे पास उपसर्ग -sep- का उपयोग कर दो तत्व हैं। ये हमारे विभाजक होंगे।

फिर मैंने पहले दिखाया गया ड्रॉवरमेनू एडाप्टर आता है, जो अभी भी एक ऐरे एडाप्टर है, जिस पर मैंने कुछ कार्यक्षमताओं को जोड़ा है:

public class DrawerMenuAdapter extends ArrayAdapter<String>{
    private Context context;
    private String[] values;
    private int resId;
    private int separatorId = 0;
    private int userbarId = 0;

    public DrawerMenuAdapter(Context context, int textViewResourceId, String[] values) {
        super(context, textViewResourceId, values);
        this.context = context;
        this.values = values;
        this.resId = textViewResourceId;
    }

    public void setSeparator(int resId){
        separatorId = resId;
    }

    public void setUserbarId(int resId){
        userbarId = resId;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent){
        View rowView;

        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        if(userbarId != 0 && values[position].equals("Username")){
            rowView = inflater.inflate(this.userbarId, parent, false);

        }else if(separatorId != 0 && values[position].startsWith("-sep-")){
            rowView = inflater.inflate(this.separatorId, parent, false);

        }else{
            rowView = inflater.inflate(this.resId, parent, false);
        }

        TextView elementText = (TextView)rowView.findViewById(R.id.element_text);
        String textValue = values[position];

        /* If the current line is a separator, just display a separator. Otherwise, set the
        matching picture
         */
        if(textValue.startsWith("-sep-")){
            elementText.setText(textValue.substring("-sep-".length()));

        }else{
            if(textValue.equals("Username")){
                elementText.setText(context.getSharedPreferences("LovRUserSettings", 0)
                        .getString("firstName", "Username"));
            }else{
                elementText.setText(textValue);
            }
            ImageView elementImage = (ImageView)rowView.findViewById(R.id.element_icon);
            switch (position){
                case 2:
                    elementImage.setImageResource(R.drawable.search);
                    break;
                case 3:
                    elementImage.setImageResource(R.drawable.facebook_friends);
                    break;
                case 4:
                    elementImage.setImageResource(R.drawable.flirts_history);
                    break;
                case 5:
                    elementImage.setImageResource(R.drawable.premium);
                    break;
                case 7:
                    elementImage.setImageResource(R.drawable.settings);
                    break;
                case 8:
                    elementImage.setImageResource(R.drawable.share_app);
                    break;
                case 9:
                    elementImage.setImageResource(R.drawable.cgu);
                    break;
            }
        }


        return rowView;
    }
}

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

यहां मुख्य बिंदु अलग-अलग के लिए कोड खोजता है, -sep- prefix के साथ तार। एक बार एक पाया जाता है, उपसर्ग हटा दिया जाता है, और मिलान लेआउट विभाजक को जिम्मेदार ठहराया जाता है।

ठीक है, यही वह है जो मैंने पाया है। इसके बाद, आपको क्लिक श्रोताओं को जोड़ने के लिए अपना रास्ता खोजना होगा। खानों को DrawerLayout.setOnCliclListener में कार्यान्वित किया DrawerLayout.setOnCliclListener जो मूल रूप से नौकरी को Google के दस्तावेज़ों के समान तरीके से करता है। लेकिन आप setOnclickListener का उपयोग अपने दृश्य में भी कर सकते हैं जैसे आप उन्हें जोड़ते हैं, और एक एक्सएमएल फ़ाइल का उपयोग करते हैं जहां आप अपना खुद का onClick विशेषताएं सेट कर सकते हैं ...

उम्मीद है कि यह मदद करेगा =)





separator