java.lang.Throwable:ListView中带有SimpleDapter的addInArray
我有一个带有SimpleAdapter的ListView活动 活动:java.lang.Throwable:ListView中带有SimpleDapter的addInArray,java,android,listview,simpleadapter,Java,Android,Listview,Simpleadapter,我有一个带有SimpleAdapter的ListView活动 活动: public class TankListActivity extends FragmentActivity implements OnShowResult { private final String ATTRIBUTE_NUMBER = "Number"; private final String ATTRIBUTE_FUEL = "Fuel"; private final String ATTR
public class TankListActivity extends FragmentActivity implements OnShowResult {
private final String ATTRIBUTE_NUMBER = "Number";
private final String ATTRIBUTE_FUEL = "Fuel";
private final String ATTRIBUTE_CAPACITY = "Capacity";
private final String ATTRIBUTE_CAPACITY_CURRENT = "Capacity Current";
private SimpleAdapter adapter;
private ArrayList<Map<String, Object>> tankList;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tank_list);
tankList = new ArrayList<>();
String[] from = {ATTRIBUTE_NUMBER, ATTRIBUTE_FUEL, ATTRIBUTE_CAPACITY_CURRENT, ATTRIBUTE_CAPACITY};
int[] to = {R.id.textview_tankitem_number, R.id.textview_tankitem_fuel, R.id.textview_tankitem_capacity_current, R.id.textview_tankitem_capacity};
adapter = new SimpleAdapter(getApplicationContext(), tankList, R.layout.tank_list_item, from, to);
adapter.setViewBinder(new TankItemBinder());
ListView list = (ListView)findViewById(R.id.listview_tanklistactivity_list);
list.setAdapter(adapter);
list.setOnScrollListener(scrollListener);
list.setOnItemClickListener(onItemClickListener);
registerForContextMenu(list);
}
// ...
class TankItemBinder implements SimpleAdapter.ViewBinder {
@Override
public boolean setViewValue(View view, Object o, String s) {
switch (view.getId()) {
case R.id.textview_tankitem_number:
int i = (int)o;
((TextView)view).setText("№" + ((i < 0)?"":i));
return true;
case R.id.textview_tankitem_fuel:
((TextView)view).setText((String)o);
return true;
case R.id.textview_tankitem_capacity:
((TextView)view).setText(o + " л");
return true;
case R.id.textview_tankitem_capacity_current:
((TextView)view).setText(o + " л");
return true;
default: return false;
}
}
}
}
到目前为止,我注意到:如果在创建SimpleAdapter之前,
tankList
被某个值初始化,则不会出现以下消息:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tank_list);
tankList = new ArrayList<>();
// this solve the problem:
Map<String, Object> item = new HashMap<>();
item.put(ATTRIBUTE_NUMBER, -1);
item.put(ATTRIBUTE_FUEL, "Loading...");
item.put(ATTRIBUTE_CAPACITY_CURRENT, 0);
item.put(ATTRIBUTE_CAPACITY, 0);
tankList.add(item);
String[] from = {ATTRIBUTE_NUMBER, ATTRIBUTE_FUEL, ATTRIBUTE_CAPACITY_CURRENT, ATTRIBUTE_CAPACITY};
int[] to = {R.id.textview_tankitem_number, R.id.textview_tankitem_fuel, R.id.textview_tankitem_capacity_current, R.id.textview_tankitem_capacity};
adapter = new SimpleAdapter(getApplicationContext(), tankList, R.layout.tank_list_item, from, to);
adapter.setViewBinder(new TankItemBinder());
ListView list = (ListView)findViewById(R.id.listview_tanklistactivity_list);
list.setAdapter(adapter);
list.setOnScrollListener(scrollListener);
list.setOnItemClickListener(onItemClickListener);
registerForContextMenu(list);
}
@覆盖
创建时受保护的void(@Nullable Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(右布局、储罐清单);
tankList=新的ArrayList();
//这就解决了问题:
Map item=newhashmap();
物品放置(属性编号,-1);
物品放置(属性“装载…”);
项。放置(属性\容量\当前,0);
物品放置(属性为容量,0);
储罐清单。添加(项目);
字符串[]from={ATTRIBUTE_NUMBER,ATTRIBUTE_FUEL,ATTRIBUTE_CAPACITY_CURRENT,ATTRIBUTE_CAPACITY};
int[]to={R.id.textview_tankitem_编号,R.id.textview_tankitem_燃料,R.id.textview_tankitem_容量}当前,R.id.textview_tankitem_容量};
适配器=新的SimpleAdapter(getApplicationContext(),tankList,R.layout.tank\u list\u项,from,to);
setViewBinder(新的TankItemBinder());
ListView列表=(ListView)findViewById(R.id.ListView\u tanklistactivity\u列表);
list.setAdapter(适配器);
setOnScrollListener(scrollListener);
list.setOnItemClickListener(onItemClickListener);
registerForContextMenu(列表);
}
但我需要这个列表在加载时为空。如何修复此问题?请共享
TankItemBinder
@0X0nosugar的代码,已添加。这是我的内心世界activity@0X0nosugar,在不同的设备上,屏幕上有5-7个项目。但我不明白这有什么关系。请注意我在帖子中的注释:如果列表至少由一个值初始化,则无论屏幕大小、列表内容以及列表所包含的元素如何,都不会有消息(在我的应用程序中,有十多个不同的列表是根据这个原则建立的,它们都给出了这个错误消息)。
D/ViewGroup﹕ addInArray been called, this = android.widget.ListView{4224c658 VFED.VCL .F....ID 0,96-540,922 #7f0700af app:id/listview_tanklistactivity_list}call stack =
java.lang.Throwable: addInArray
at android.view.ViewGroup.addInArray(ViewGroup.java:3786)
at android.view.ViewGroup.addViewInner(ViewGroup.java:3740)
at android.view.ViewGroup.addViewInLayout(ViewGroup.java:3687)
at android.widget.ListView.setupChild(ListView.java:1862)
at android.widget.ListView.makeAndAddView(ListView.java:1815)
at android.widget.ListView.fillDown(ListView.java:698)
at android.widget.ListView.fillFromTop(ListView.java:759)
at android.widget.ListView.layoutChildren(ListView.java:1631)
at android.widget.AbsListView.onLayout(AbsListView.java:2149)
at android.view.View.layout(View.java:15125)
at android.view.ViewGroup.layout(ViewGroup.java:4862)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1888)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1742)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1651)
at android.view.View.layout(View.java:15125)
at android.view.ViewGroup.layout(ViewGroup.java:4862)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:515)
at android.widget.FrameLayout.onLayout(FrameLayout.java:450)
at android.view.View.layout(View.java:15125)
at android.view.ViewGroup.layout(ViewGroup.java:4862)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1888)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1742)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1651)
at android.view.View.layout(View.java:15125)
at android.view.ViewGroup.layout(ViewGroup.java:4862)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:515)
at android.widget.FrameLayout.onLayout(FrameLayout.java:450)
at android.view.View.layout(View.java:15125)
at android.view.ViewGroup.layout(ViewGroup.java:4862)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2317)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2023)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1189)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6223)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:788)
at android.view.Choreographer.doCallbacks(Choreographer.java:591)
at android.view.Choreographer.doFrame(Choreographer.java:560)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:774)
at android.os.Handler.handleCallback(Handler.java:808)
at android.os.Handler.dispatchMessage(Handler.java:103)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:5292)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:824)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:640)
at dalvik.system.NativeStart.main(Native Method)
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tank_list);
tankList = new ArrayList<>();
// this solve the problem:
Map<String, Object> item = new HashMap<>();
item.put(ATTRIBUTE_NUMBER, -1);
item.put(ATTRIBUTE_FUEL, "Loading...");
item.put(ATTRIBUTE_CAPACITY_CURRENT, 0);
item.put(ATTRIBUTE_CAPACITY, 0);
tankList.add(item);
String[] from = {ATTRIBUTE_NUMBER, ATTRIBUTE_FUEL, ATTRIBUTE_CAPACITY_CURRENT, ATTRIBUTE_CAPACITY};
int[] to = {R.id.textview_tankitem_number, R.id.textview_tankitem_fuel, R.id.textview_tankitem_capacity_current, R.id.textview_tankitem_capacity};
adapter = new SimpleAdapter(getApplicationContext(), tankList, R.layout.tank_list_item, from, to);
adapter.setViewBinder(new TankItemBinder());
ListView list = (ListView)findViewById(R.id.listview_tanklistactivity_list);
list.setAdapter(adapter);
list.setOnScrollListener(scrollListener);
list.setOnItemClickListener(onItemClickListener);
registerForContextMenu(list);
}