How to add Section Header in ListView List Item

前端 未结 1 448
孤独总比滥情好
孤独总比滥情好 2020-12-29 00:35

I want to Develop \"History of Country\" Android Application. But I have a problem. I can not put Country Header in Listview List Item. I want to put Header; Such as \"Afric

相关标签:
1条回答
  • 2020-12-29 00:49

    Screen Shot

    enter image description here

    activity_main.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
    
        <EditText
            android:id="@+id/edtSearch"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_vertical"
            android:hint="Search..."
            android:padding="10dp" />
    
        <ListView
            android:id="@+id/lvCountry"
            android:layout_width="match_parent"
            android:layout_height="match_parent" >
        </ListView>
    
    </LinearLayout>
    

    layout_item.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
    
        <TextView
            android:id="@+id/tvItemTitle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="10dp"
            android:text="Item" />
    
    </LinearLayout>
    

    layout_section.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#D8D8D8"
        android:orientation="vertical" >
    
        <TextView
            android:id="@+id/tvSectionTitle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:padding="10dp"
            android:text="Section"
            android:textStyle="bold" />
    
    </LinearLayout>
    

    MainActivity.java

    public class MainActivity extends ActionBarActivity {
    
        private ListView lvCountry;
        private EditText edtSearch;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            edtSearch = (EditText) findViewById(R.id.edtSearch);
            lvCountry = (ListView) findViewById(R.id.lvCountry);
    
            ArrayList<Item> countryList = new ArrayList<MainActivity.Item>();
            // Header
            countryList.add(new SectionItem("Asia"));
            // State Name
            countryList.add(new EntryItem("India"));
            countryList.add(new EntryItem("China"));
            countryList.add(new EntryItem("Hong Kong"));
            countryList.add(new EntryItem("Nepal"));
    
            // Header
            countryList.add(new SectionItem("North Asia"));
            // State Name
            countryList.add(new EntryItem("Belarus"));
            countryList.add(new EntryItem("Moldova"));
            countryList.add(new EntryItem("Russian Federation"));
            countryList.add(new EntryItem("Ukraine"));
    
            // Header
            countryList.add(new SectionItem("North America"));
            // State Name
            countryList.add(new EntryItem("Canada"));
            countryList.add(new EntryItem("Saint Pierre and Miquelon"));
            countryList.add(new EntryItem("United States"));
    
            // Header
            countryList.add(new SectionItem("North & Central America"));
            // State Name
            countryList.add(new EntryItem("Caribbean Islands"));
            countryList.add(new EntryItem("Anguilla"));
            countryList.add(new EntryItem("Antigua and Barbuda"));
            countryList.add(new EntryItem("Aruba"));
    
            // set adapter
            final CountryAdapter adapter = new CountryAdapter(this, countryList);
            lvCountry.setAdapter(adapter);
            lvCountry.setTextFilterEnabled(true);
    
            // filter on text change
            edtSearch.addTextChangedListener(new TextWatcher() {
    
                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
                    if(adapter != null)
                    {
                        adapter.getFilter().filter(s.toString());
                    }
                }
    
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                }
    
                @Override
                public void afterTextChanged(Editable s) {
                }
            });
        }
    
        /**
         * row item
         */
        public interface Item {
            public boolean isSection();
            public String getTitle();
        }
    
        /**
         * Section Item
         */
        public class SectionItem implements Item {
            private final String title;
    
            public SectionItem(String title) {
                this.title = title;
            }
    
            public String getTitle() {
                return title;
            }
    
            @Override
            public boolean isSection() {
                return true;
            }
        }
    
        /**
         * Entry Item
         */
        public class EntryItem implements Item {
            public final String title;
    
            public EntryItem(String title) {
                this.title = title;
            }
    
            public String getTitle() {
                return title;
            }
    
            @Override
            public boolean isSection() {
                return false;
            }
        }
    
        /**
         * Adapter
         */
        public class CountryAdapter extends BaseAdapter {
            private Context context;
            private ArrayList<Item> item;
            private ArrayList<Item> originalItem;
    
            public CountryAdapter() {
                super();
            }
    
            public CountryAdapter(Context context, ArrayList<Item> item) {
                this.context = context;
                this.item = item;
                //this.originalItem = item;
            }
    
            @Override
            public int getCount() {
                return item.size();
            }
    
            @Override
            public Object getItem(int position) {
                return item.get(position);
            }
    
            @Override
            public long getItemId(int position) {
                return position;
            }
    
            @Override
            public View getView(int position, View convertView, ViewGroup parent)
            {
                LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                if (item.get(position).isSection()) {
                    // if section header
                    convertView = inflater.inflate(R.layout.layout_section, parent, false);
                    TextView tvSectionTitle = (TextView) convertView.findViewById(R.id.tvSectionTitle);
                    tvSectionTitle.setText(((SectionItem) item.get(position)).getTitle());
                }
                else
                {
                    // if item
                    convertView = inflater.inflate(R.layout.layout_item, parent, false);
                    TextView tvItemTitle = (TextView) convertView.findViewById(R.id.tvItemTitle);
                    tvItemTitle.setText(((EntryItem) item.get(position)).getTitle());
                }
    
                return convertView;
            }
    
            /**
             * Filter
             */
            public Filter getFilter()
            {
                Filter filter = new Filter() {
    
                    @SuppressWarnings("unchecked")
                    @Override
                    protected void publishResults(CharSequence constraint, FilterResults results) {
    
                        item = (ArrayList<Item>) results.values;
                        notifyDataSetChanged();
                    }
    
                    @SuppressWarnings("null")
                    @Override
                    protected FilterResults performFiltering(CharSequence constraint) {
    
                        FilterResults results = new FilterResults();
                        ArrayList<Item> filteredArrayList = new ArrayList<Item>();
    
    
                        if(originalItem == null || originalItem.size() == 0)
                        {
                            originalItem = new ArrayList<Item>(item);
                        }
    
                        /*
                         * if constraint is null then return original value
                         * else return filtered value
                         */
                        if(constraint == null && constraint.length() == 0)
                        {
                            results.count = originalItem.size();
                            results.values = originalItem;
                        }
                        else
                        {
                            constraint = constraint.toString().toLowerCase(Locale.ENGLISH);
                            for (int i = 0; i < originalItem.size(); i++) 
                            {
                                String title = originalItem.get(i).getTitle().toLowerCase(Locale.ENGLISH);
                                if(title.startsWith(constraint.toString()))
                                {
                                    filteredArrayList.add(originalItem.get(i));
                                }
                            }
                            results.count = filteredArrayList.size();
                            results.values = filteredArrayList;
                        }
    
                        return results;
                    }
                };
    
                return filter;
            }
        }
    
    }
    

    AndroidManifest.xml

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.sectionheader"
        android:versionCode="1"
        android:versionName="1.0" >
    
        <uses-sdk
            android:minSdkVersion="11"
            android:targetSdkVersion="21" />
    
        <application
            android:allowBackup="true"
            android:icon="@drawable/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/AppTheme" >
            <activity
                android:name=".MainActivity"
                android:windowSoftInputMode="stateHidden|adjustPan"
                android:label="@string/app_name" >
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    
    </manifest>
    
    0 讨论(0)
提交回复
热议问题