我在listview中有一个微调器(仅在第一行)。 作为微调器的适配器,我试图使用arrayadapter,但每次我将我的字符串添加到适配器时,应用程序崩溃。如果我只是在没有任何字符串的情况下设置适配器,它就会起作用并在第一个listrow中显示空的微调器。
我的活动:
public class TestView extends Activity implements OnItemClickListener, OnItemSelectedListener
{
private ListView testPersonList;
private DBManager dbManager;
private FileManager fileManager;
private FormularManager formularManager;
private TestPersonListAdapter testPersonListAdapter;
private String testName;
private Bundle configFile;
private String[] languages;
private String aktLanguagecode;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.test_view);
testPersonList = (ListView) findViewById(R.id.test_view_persons_listview);
Intent intent = getIntent();
testName = intent.getStringExtra(ConstantVariables.BUNDLE_TESTTRACK_NAME);
fileManager = new FileManager(this);
formularManager = new FormularManager(this);
configFile = fileManager.readConfigFile(testName);
languages = formularManager.getLanguagesOfOneFormular(configFile.getString(ConstantVariables.BUNDLE_FORMULAR));
dbManager = new DBManager(this, ConstantVariables.TESTTRACKS + testName + ConstantVariables.SERIAL, testName);
testPersonListAdapter = new TestPersonListAdapter(this, dbManager.getTestPersons());
testPersonList.addHeaderView(testPersonListHeader(languages));
testPersonList.setAdapter(testPersonListAdapter);
testPersonList.setOnItemClickListener(this);
}
private View testPersonListHeader(String[] languages)
{
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View header = new View(this);
header = inflater.inflate(R.layout.new_testperson_listrow, null);
Spinner languageSpinner = (Spinner) header.findViewById(R.id.new_testperson_languagespinner);
LanguageSpinnerAdapter spinnerAdapter = new LanguageSpinnerAdapter(this, R.layout.spinner_listrow, languages);
languageSpinner.setAdapter(spinnerAdapter);
languageSpinner.setOnItemSelectedListener(this);
return header;
}
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
}
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
}
}
我的列表适配器:
public class TestPersonListAdapter extends BaseAdapter {
private Cursor cursor;
private LayoutInflater inflater;
public TestPersonListAdapter(Context context, Cursor cursor)
{
this.cursor = cursor;
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount()
{
return (cursor.getCount() + 1);
}
@Override
public Object getItem(int position)
{
cursor.moveToPosition(position);
return cursor.getString(cursor.getColumnIndex(ConstantVariables.DB_COLUMN_PERSON));
}
@Override
public long getItemId(int position)
{
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View itemView = convertView;
itemView = inflater.inflate(R.layout.testperson_listrow, null);
TextView person = (TextView) itemView.findViewById(R.id.testperson_persontext);
TextView categories = (TextView) itemView.findViewById(R.id.testperson_categorytext);
if(cursor.moveToPosition(position-1))
{
person.setText(cursor.getString(cursor.getColumnIndex(ConstantVariables.DB_COLUMN_PERSON)));
}
return itemView;
}
}
我的自定义arrayadapter
public class LanguageSpinnerAdapter extends ArrayAdapter<String>
{
private String[] languages;
public LanguageSpinnerAdapter(Context context, int resource, String[] objects)
{
super(context, resource, objects);
this.languages = objects;
}
@Override
public View getDropDownView(int position, View convertView, ViewGroup parent) {
return super.getDropDownView(position, convertView, parent);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
return getCustomView(position, convertView, parent);
}
public View getCustomView(int position, View convertView, ViewGroup parent)
{
View row = convertView;
if (row == null) {
row = LayoutInflater.from(parent.getContext()).inflate(R.layout.spinner_listrow, parent, false);
}
TextView language_tv = (TextView) row.findViewById(R.id.spinner_row_language);
language_tv.setText(languages[position]);
return row;
}
}
new_testperson_listrow.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/list_large_bg_normal_selector" >
<ImageView
android:id="@+id/new_testperson_listicon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:paddingLeft="30dp"
android:paddingRight="30dp"
android:src="@drawable/list_icon_add_testperson_selector" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toRightOf="@+id/new_testperson_listicon"
android:orientation="vertical" >
<TextView
android:id="@+id/new_testperson_addtext"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Start Questionaire"
android:textColor="@drawable/list_text_selector"
android:textSize="15pt" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/new_testperson_listicon"
android:orientation="horizontal" >
<TextView
android:id="@+id/new_testperson_languagetext"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingRight="30dp"
android:text="Language"
android:textColor="@drawable/list_text_selector"
android:textSize="10pt" />
<Spinner
android:id="@+id/new_testperson_languagespinner"
android:layout_width="150dp"
android:layout_height="wrap_content"
android:background="@drawable/spinner_dropdown_selector"/>
</LinearLayout>
</LinearLayout>
<ImageView
android:id="@+id/new_testperson_listarrow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:paddingRight="30dp"
android:src="@drawable/list_icon_arrow_selector" />
</RelativeLayout>
spinner_listrow.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/spinner_background_selector" >
<TextView
android:id="@+id/spinner_row_language"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:paddingLeft="30dp"
android:paddingRight="30dp"
android:text="test"
style="@style/TextView_normal"/>
</RelativeLayout>
spinner_background_selector.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="false" android:color="@color/textcolor_orange"/>
<item android:state_pressed="true"><shape>
<solid android:color="@color/textcolor_white" />
<padding android:bottom="4dp" android:left="4dp" android:right="4dp" android:top="4dp" />
</shape></item>
<item android:state_pressed="true"><shape>
<solid android:color="@color/textcolor_orange" />
<padding android:bottom="4dp" android:left="4dp" android:right="4dp" android:top="4dp" />
</shape></item>
</selector>
日志
04-23 17:58:26.484: E/AndroidRuntime(29813): FATAL EXCEPTION: main
04-23 17:58:26.484: E/AndroidRuntime(29813): Process: com.example.questiohmnaire, PID: 29813
04-23 17:58:26.484: E/AndroidRuntime(29813): android.view.InflateException: Binary XML file line #2: Error inflating class <unknown>
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.view.LayoutInflater.createView(LayoutInflater.java:620)
04-23 17:58:26.484: E/AndroidRuntime(29813): at com.android.internal.policy.impl.PhoneLayoutInflater.onCreateView(PhoneLayoutInflater.java:56)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.view.LayoutInflater.onCreateView(LayoutInflater.java:669)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:694)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.view.LayoutInflater.inflate(LayoutInflater.java:469)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.view.LayoutInflater.inflate(LayoutInflater.java:397)
04-23 17:58:26.484: E/AndroidRuntime(29813): at com.example.questiohmnaire.adapter.LanguageSpinnerAdapter.getCustomView(LanguageSpinnerAdapter.java:36)
04-23 17:58:26.484: E/AndroidRuntime(29813): at com.example.questiohmnaire.adapter.LanguageSpinnerAdapter.getView(LanguageSpinnerAdapter.java:28)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.widget.AbsSpinner.onMeasure(AbsSpinner.java:193)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.widget.Spinner.onMeasure(Spinner.java:482)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.view.View.measure(View.java:16497)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1052)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.widget.LinearLayout.onMeasure(LinearLayout.java:590)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.view.View.measure(View.java:16497)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.view.View.measure(View.java:16497)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:719)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:455)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.view.View.measure(View.java:16497)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.widget.ListView.setupChild(ListView.java:1870)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.widget.ListView.makeAndAddView(ListView.java:1793)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.widget.ListView.fillDown(ListView.java:691)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.widget.ListView.fillFromTop(ListView.java:752)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.widget.ListView.layoutChildren(ListView.java:1630)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.widget.AbsListView.onLayout(AbsListView.java:2091)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.view.View.layout(View.java:14817)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.view.ViewGroup.layout(ViewGroup.java:4631)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1055)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.view.View.layout(View.java:14817)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.view.ViewGroup.layout(ViewGroup.java:4631)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.view.View.layout(View.java:14817)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.view.ViewGroup.layout(ViewGroup.java:4631)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1671)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1525)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.widget.LinearLayout.onLayout(LinearLayout.java:1434)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.view.View.layout(View.java:14817)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.view.ViewGroup.layout(ViewGroup.java:4631)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.widget.FrameLayout.layoutChildren(FrameLayout.java:453)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.widget.FrameLayout.onLayout(FrameLayout.java:388)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.view.View.layout(View.java:14817)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.view.ViewGroup.layout(ViewGroup.java:4631)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1987)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1744)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1000)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5670)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.view.Choreographer.doCallbacks(Choreographer.java:574)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.view.Choreographer.doFrame(Choreographer.java:544)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.os.Handler.handleCallback(Handler.java:733)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.os.Handler.dispatchMessage(Handler.java:95)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.os.Looper.loop(Looper.java:136)
04-23 17:58:26.484: E/AndroidRuntime(29813): at android.app.ActivityThread.main(ActivityThread.java:5017)
04-23 17:58:26.484: E/AndroidRuntime(29813): at java.lang.reflect
导致错误的行是:
row = LayoutInflater.from(parent.getContext()).inflate(R.layout.spinner_listrow, parent, false);
我感谢任何帮助。我现在已经试了好几个小时来解决这个错误,但没有任何效果...... 提前谢谢!
答案 0 :(得分:3)
在修复你拥有的内容之前,有一些非常重要的事情:当你的位置= 0时,在getView
上充气和设置适配器。这将是definitelly 杀死列表视图性能,请注意每当使用&#34; 0&#34;调用getView时,你总是会做非常非常非常重的事情。每次用户滚动时都会发生。
所以你需要重组你的程序。第一件事是,旋转器,创造&amp;只填充一次。 在getView之外。然后,如果position==0
您可以快速退回。
鉴于您只需要微调器作为第一行,我建议您使用listView.addHeaderView(view)
。这个方便的方法允许您为ListView定义一个始终作为第一个项目呈现的标题,从而消除getView
的复杂性,可以专注于渲染正常项而不是根据位置执行非正统的事物。在设置适配器之前,请务必致电addHeaderView
。
如果您不喜欢Header方法并按照自己的方式行事,那么还有一个警告:您必须考虑这样一个事实:当Spinner行0退出屏幕时,该行视图将会在convertView
传递给您以呈现正常项目(又名View
回收)。然后,您必须销毁(稍后重新创建)微调器,或实现不同的项类型方法:getItemTypeCount
,getItemType
......否则会发生灾难。
所以在简历中:
ListView
Spinner
添加到ListView
作为标题视图getView
中删除与微调器相关的所有复杂性。让getView专注于普通的ListView
项目。您将获得正常运行的ListView!
答案 1 :(得分:1)
您为微调器创建了自定义布局,因此您需要创建一个扩展ArrayAdapter
或类似内容的自定义适配器。
或者,如果您只想显示包含单个TextView
的列表,则无需指定自定义布局,只需使用:
ArrayAdapter<String> adapter = ArrayAdapter.createFromResource(context, <your_string_array_in_xml>, android.R.layout.simple_spinner_item);
或
ArrayAdapter<String> adapter = new ArrayAdapter(context, android.R.layout.simple_spinner_item, <your_string_array>);
如果您确实需要制作自定义Spinner,请点击此链接,确保它可以帮助您:http://mrbool.com/how-to-customize-spinner-in-android/28286