Java 如何在ListView列表项中添加节标题
我想开发“国家历史”Android应用程序。但我有个问题。我无法将国家/地区标题放在Listview列表项中。我想把标题放进去;例如“非洲:北非”、“撒哈拉以南非洲”、“亚洲”、“北亚”、“西亚和中亚”、“南亚和东南亚”、“欧洲”、“北美和中美洲”、“北美”、“大洋洲”、“南美”。Java 如何在ListView列表项中添加节标题,java,android,listview,Java,Android,Listview,我想开发“国家历史”Android应用程序。但我有个问题。我无法将国家/地区标题放在Listview列表项中。我想把标题放进去;例如“非洲:北非”、“撒哈拉以南非洲”、“亚洲”、“北亚”、“西亚和中亚”、“南亚和东南亚”、“欧洲”、“北美和中美洲”、“北美”、“大洋洲”、“南美”。 这里是我的源代码: 这里是我的示例代码: 搜索\u Country.java public class MainActivity extends ActionBarActivity { private L
这里是我的源代码:
这里是我的示例代码:
搜索\u Country.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;
}
}
}
package com.nasir.search;
导入java.util.ArrayList;
导入java.util.array;
导入android.app.Activity;
导入android.app.ListActivity;
导入android.content.Intent;
导入android.os.Bundle;
导入android.text.Editable;
导入android.text.TextWatcher;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.AdapterView;
导入android.widget.AdapterView.OnItemClickListener;
导入android.widget.BaseAdapter;
导入android.widget.EditText;
导入android.widget.ListView;
导入android.widget.TextView;
公共类搜索\u国家/地区扩展列表活动{
私人编辑文本搜索文本;
私有ListView ListText;
私有字符串[]编号\u列表={
//非洲:北非
“阿尔及利亚”、“埃及”、“利比亚”、“摩洛哥”、“突尼斯”、“西撒哈拉”,
//撒哈拉以南非洲
“安哥拉”、“贝宁”、“博茨瓦纳”、“布基纳法索”、“布隆迪”、“喀麦隆”、“佛得角”、“乍得”、“科摩罗”、“刚果”,
“科特迪瓦”、“吉布提”、“赤道几内亚”、“厄立特里亚”、“埃塞俄比亚”、“加蓬”、“冈比亚”、“加纳”、“几内亚”、“肯尼亚”,
“莱索托”、“利比里亚”、“马达加斯加”、“马拉维”、“马里”、“毛里塔尼亚”、“毛里求斯”、“马约特”、“莫桑比克”、“纳米比亚”,
“尼日尔”、“尼日利亚”、“卢旺达”、“塞内加尔”、“塞舌尔”、“塞拉利昂”、“索马里”、“南非”、“南苏丹”,
“苏丹”、“斯威士兰”、“乌干达”、“赞比亚”、“津巴布韦”,
//亚洲:
//东亚
“中国”、“香港”、“日本”、“韩国”、“澳门”、“蒙古”、“台湾”,
//北亚
“白俄罗斯”、“摩尔多瓦”、“俄罗斯联邦”、“乌克兰”,
//西亚和中亚
“阿富汗”、“亚美尼亚”、“阿塞拜疆”、“巴林”、“塞浦路斯”、“格鲁吉亚”、“伊朗”、“伊拉克”、“以色列”、“约旦”、“哈萨克斯坦”,
“科威特”、“吉尔吉斯斯坦”、“黎巴嫩”、“阿曼”、“巴基斯坦”、“卡塔尔”、“沙特阿拉伯”、“塔吉克斯坦”、“土耳其”、“土库曼斯坦”,
“阿拉伯联合酋长国”、“乌兹别克斯坦”、“也门”,
//南亚和东南亚
“孟加拉国”、“不丹”、“文莱”、“柬埔寨”、“印度”、“印度尼西亚”、“马来西亚”、“马尔代夫”、“缅甸”、“尼泊尔”,
“菲律宾”、“新加坡”、“斯里兰卡”、“泰国”、“东帝汶”、“越南”,
//欧洲
“奥兰群岛”、“阿尔巴尼亚”、“安道尔”、“奥地利”、“比利时”、“波斯尼亚和黑塞哥维那”、“保加利亚”、“克罗地亚”,
“捷克共和国”、“丹麦”、“爱沙尼亚”、“法罗群岛”、“芬兰”、“法国”、“德国”、“直布罗陀”、“希腊”,
格陵兰岛、根西岛、匈牙利、冰岛、爱尔兰、泽西岛、拉脱维亚、列支敦士登、,
“立陶宛”、“卢森堡”、“马其顿”、“摩纳哥”、“黑山”、“荷兰”、“挪威”、“波兰”、“葡萄牙”,
“罗马尼亚”、“圣马力诺”、“塞尔维亚”、“斯洛伐克”、“斯洛文尼亚”、“西班牙”、“斯瓦尔巴群岛和扬马延”、“瑞典”、“瑞士”,
“联合王国”,
//北美和中美洲
“加勒比群岛”、“安圭拉”、“安提瓜和巴布达”、“阿鲁巴”、“巴哈马”、“巴巴多斯”、“百慕大”、“开曼群岛”,
“博内尔”、“古巴”、“多米尼克”、“库拉索岛”、“瓜德罗普岛”、“海地”、“牙买加”、“马提尼克岛”、“蒙特塞拉特”、“波多黎各”,
“圣巴塞勒米”、“圣基茨和尼维斯”、“圣卢西亚”、“圣马丁(法语部分)”、“圣文森特和格林纳丁斯”,
“圣马丁岛(荷兰部分)”、“特立尼达和多巴哥”、“特克斯和凯科斯群岛”、“英属维尔京群岛”、“美国维尔京群岛”,
//中美洲(或中美洲)
“伯利兹”、“哥斯达黎加”、“萨尔瓦多”、“危地马拉”、“洪都拉斯”、“墨西哥”、“尼加拉瓜”、“巴拿马”,
//北美
“加拿大”、“圣皮埃尔和米克隆”、“美国”,
//大洋洲
“美属萨摩亚”、“澳大利亚”、“圣诞岛”、“科科斯(基林)群岛”、“库克群岛”、“斐济”、“关岛”、“基里巴斯”,
“马绍尔群岛”、“密克罗尼西亚”、“新喀里多尼亚”、“新西兰”、“纽埃岛”、“诺福克岛”、“北马里亚纳群岛”,
“帕劳”、“巴布亚新几内亚”、“皮特凯恩”、“萨摩亚”、“所罗门群岛”、“托克劳”、“汤加”、“图瓦卢”、“美国小离岛”,
“瓦努阿图”、“瓦利斯和富图纳”,
//南美洲
“阿根廷”、“玻利维亚”、“巴西”、“智利”、“哥伦比亚”、“厄瓜多尔”、“福克兰群岛(马尔维纳斯)”、“法属圭亚那”、“圭亚那”,
“巴拉圭”、“秘鲁”、“苏里南”、“乌拉圭”、“委内瑞拉”};
私有数组列表数组_排序;
int textlength=0;
创建时的公共void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.search_country);
SearchText=(EditText)findViewById(R.id.listview\u search);
ListText=(ListView)findViewById(android.R.id.list);
array_sort=newarraylist(Arrays.asList(Number_List));
setListAdapter(新bsAdapter(this));
SearchText.addTextChangedListener(新的TextWatcher()
{
公共无效后文本已更改(可编辑)
{
}
更改前文本之前的公共void(字符序列s、int start、int count、int after)
{
}
public void onTextChanged(字符序列、int start、int before、int count)
{
textlength=SearchText.getText().length();
数组_sort.clear();
对于(int i=0;i 如果(文本长度屏幕截图
活动\u 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>
<?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>
<?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>
<?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>
layout\u item.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>
<?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>
<?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>
<?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>
layout\u section.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>
<?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>
<?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>
<?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>
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;
}
}
}
公共类MainActivity扩展了ActionBarActivity{
国家私有列表视图;
私人编辑文本搜索;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
苏