ListView
中的项目需要加载时间,因此我创建了加载它们的线程,从而使加载操作异步。我在列表中有10个项目。可以加载第10项,但是第9项正在加载。
我使用 ArrayList 制作了自定义适配器,初始化为10个元素(数据为空)。
在 getView()函数中,我检查它是否正在加载(data empty
)我返回null,并在加载项目时通知。
但它会在ListView
的 onLayout 函数中报告异常。
请帮我解决此案。
更新:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final Item model = arrayList.get(position / 3);
if(model.getId()==null) return null;
if (convertView == null || convertView.getTag() == null || ! (convertView.getTag() instanceof ViewHolderHeader)) {
.......
}
......
}
更新日志文件:
java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.ViewGroup$LayoutParams android.view.View.getLayoutParams()' on a null object reference
at com.packed.customviews.LoadMoreListView.createPinnedShadow(LoadMoreListView.java:269)
at com.packed.customviews.LoadMoreListView.ensureShadowForPosition(LoadMoreListView.java:325)
at com.packed.customviews.LoadMoreListView$2.onScroll(LoadMoreListView.java:160)
at android.widget.AbsListView.invokeOnItemScrollListener(AbsListView.java:1938)
at android.widget.AbsListView.trackMotionScroll(AbsListView.java:7065)
at android.widget.AbsListView$FlingRunnable.run(AbsListView.java:6484)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:777)
at android.view.Choreographer.doCallbacks(Choreographer.java:590)
at android.view.Choreographer.doFrame(Choreographer.java:559)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:763)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:5942)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)
答案 0 :(得分:0)
您可以创建另一个包含文本的视图(正在加载...)或使用现有的convertView(稍微改变一下,如设置文本加载......或者用户可以理解此项目正在加载的内容)
if(model.getId()==null){
LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
loadingView= inflater.inflate(R.layout.custom_row_branch_location,parent,false);
return loadingView;
}
并在完成加载原始项目的后台进程时设置此逻辑,然后将替换loadingView并通知