我正在尝试撰写一个列表,其中包含一些可扩展的项目和一些单项。我希望这样,当单击一个项目或可扩展列表子项时,我可以根据项目的文本调用intent。
我认为可扩展列表可以工作,但有没有办法在可扩展列表中设置项目,以便它们没有可扩展列表图标?我应该使用字符串数组以外的东西吗?
这样做的最佳方式是什么?
由于
以下是我的不完整代码,我想在“亚特兰大”和“波士顿”之间插入项目“区域1”,“区域2”,“区域3”或作为亚特兰大的子集:
package test.lists.special;
import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
public class SpecialList extends ListActivity{
TextView toptext;
String[] items={"Atlanta", "Boston", "Chicago", "Dallas"};
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
setListAdapter(new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1,
items));
toptext=(TextView)findViewById(R.id.toptext);
}
public void onListItemClick(ListView parent, View v, int position,
long id) {
Intent intent = new Intent();
if (parent.getItemAtPosition(position)=="Atlanta")
{
//THIS IS WHERE I WISH TO INSERT "ZONE 1", "ZONE 2", "ZONE 3"
//between Atlanta and Boston in the list
}
else if (parent.getItemAtPosition(position)=="Boston")
{
intent.setClass(this, test.lists.special.Boston.class);
startActivity(intent);
}
else if (parent.getItemAtPosition(position)=="Chicago")
{
intent.setClass(this, test.lists.special.Chicago.class);
startActivity(intent);
}
else if (parent.getItemAtPosition(position)=="Dallas")
{
intent.setClass(this, test.lists.special.Dallas.class);
startActivity(intent);
}
else if (parent.getItemAtPosition(position)=="Zone 1")
{
intent.setClass(this, test.lists.special.Atlanta.Zone1.class);
startActivity(intent);
}
else if (parent.getItemAtPosition(position)=="Zone 2")
{
intent.setClass(this, test.lists.special.Atlanta.Zone2.class);
startActivity(intent);
}
else if (parent.getItemAtPosition(position)=="Zone 3")
{
intent.setClass(this, test.lists.special.Atlanta.Zone3.class);
startActivity(intent);
}
}
}
答案 0 :(得分:5)
下面的工作和测试代码:
import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
public class SpecialList extends ListActivity{
TextView toptext;
String[] items={"Atlanta", "Boston", "Chicago", "Dallas"};
private CityListAdapter mListOfCities;
boolean mAtlantaListExpanded;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
mAtlantaListExpanded = false;
mListOfCities = new CityListAdapter();
setListAdapter(mListOfCities);
for (int n=0; n < items.length; n++)
{
mListOfCities.add(items[n]);
}
}
public void onListItemClick(ListView parent, View v, int position, long id)
{
Intent intent = new Intent();
if (parent.getItemAtPosition(position)=="Atlanta")
{
mAtlantaListExpanded = !mAtlantaListExpanded;
mListOfCities.clear();
for (int n=0; n < items.length; n++)
{
mListOfCities.add(items[n]);
}
Log.i("SpecialList", "Atlanta");
}
else if (parent.getItemAtPosition(position)=="Boston")
{
Log.i("SpecialList", "Boston");
}
else if (parent.getItemAtPosition(position)=="Chicago")
{
Log.i("SpecialList", "Chicago");
}
else if (parent.getItemAtPosition(position)=="Dallas")
{
Log.i("SpecialList", "Dallas");
}
}
class CityListAdapter extends ArrayAdapter<String> {
CityListAdapter() {
super(SpecialList.this, R.layout.one_city_row);
}
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
View row = null;
LayoutInflater inflater = getLayoutInflater();
if ((position == 0) && (!mAtlantaListExpanded))
{
row = inflater.inflate(R.layout.expandable_city_row, parent, false);
TextView city = (TextView) row.findViewById(R.id.Expandable_TextView01);
city.setText(items[position]);
TextView cityZone1 = (TextView) row.findViewById(R.id.Zone_TextView01);
cityZone1.setText("Zone 1");
TextView cityZone2 = (TextView) row.findViewById(R.id.Zone_TextView02);
cityZone2.setText("Zone 2");
TextView cityZone3 = (TextView) row.findViewById(R.id.Zone_TextView03);
cityZone3.setText("Zone 3");
cityZone1.setOnClickListener(
new Button.OnClickListener() {
@Override
public void onClick(View v) {
Log.i("SpecialList", "Zone 1");
}
}
);
cityZone2.setOnClickListener(
new Button.OnClickListener() {
@Override
public void onClick(View v) {
Log.i("SpecialList", "Zone 2");
}
}
);
cityZone3.setOnClickListener(
new Button.OnClickListener() {
@Override
public void onClick(View v) {
Log.i("SpecialList", "Zone 3");
}
}
);
}
else
{
row = inflater.inflate(R.layout.one_city_row, parent, false);
TextView city = (TextView) row.findViewById(R.id.City_TextView01);
city.setText(items[position]);
}
return(row);
}
}
}
单击“亚特兰大”会导致重绘列表,在仅显示“亚特兰大”或扩展列表之间切换。 R.layout.one_city_row.xml
是带有一个TextView的简单布局,R.layout.Expandable_city_row.xml
有另外的子选项作为TextView元素,可以从附加的代码片段中得出结论。
使用此方法,您可以根据需要完全自定义列表。在我放置Log.i()
的地方,你应该把你的意图。
答案 1 :(得分:-1)
如果我已经理解了你的问题,那么你想要的是一行中包含不同元素的项目列表,具体取决于项目的类型。
我建议您扩展BaseAdapter类并创建自己的行。通过这种方式,您可以根据类型控制当前行的打印方式,显示或隐藏任何内容。
在官方Android文档中,API Demos - ImageSwitcher部分你会找到一个例子。