【发布时间】:2015-09-19 09:59:51
【问题描述】:
我创建一个ListView 并在滚动到最后一项时设置动作 loadmore。
ListView 一直有效,直到我滚动到最后一项,然后操作 loadmore ListView 运行。我收到了这个错误:
07-01 22:48:10.792: E/AndroidRuntime(4691): java.lang.NullPointerException
07-01 22:48:10.792: E/AndroidRuntime(4691): at android.widget.ListView.clearRecycledState(ListView.java:516)
07-01 22:48:10.792: E/AndroidRuntime(4691): at android.widget.ListView.resetList(ListView.java:503)
07-01 22:48:10.792: E/AndroidRuntime(4691): at android.widget.ListView.setAdapter(ListView.java:445)
07-01 22:48:10.792: E/AndroidRuntime(4691): at com.example.MainActivity$1ProcessDataTask.onPostExecute(MainActivity.java:192)
07-01 22:48:10.792: E/AndroidRuntime(4691): at com.example.MainActivity$1ProcessDataTask.onPostExecute(MainActivity.java:1)
07-01 22:48:10.792: E/AndroidRuntime(4691): at android.os.AsyncTask.finish(AsyncTask.java:631)
07-01 22:48:10.792: E/AndroidRuntime(4691): at android.os.AsyncTask.access$600(AsyncTask.java:177)
07-01 22:48:10.792: E/AndroidRuntime(4691): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
07-01 22:48:10.792: E/AndroidRuntime(4691): at android.os.Handler.dispatchMessage(Handler.java:99)
07-01 22:48:10.792: E/AndroidRuntime(4691): at android.os.Looper.loop(Looper.java:137)
07-01 22:48:10.792: E/AndroidRuntime(4691): at android.app.ActivityThread.main(ActivityThread.java:5103)
07-01 22:48:10.792: E/AndroidRuntime(4691): at java.lang.reflect.Method.invokeNative(Native Method)
07-01 22:48:10.792: E/AndroidRuntime(4691): at java.lang.reflect.Method.invoke(Method.java:525)
07-01 22:48:10.792: E/AndroidRuntime(4691): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
07-01 22:48:10.792: E/AndroidRuntime(4691): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
07-01 22:48:10.792: E/AndroidRuntime(4691): at dalvik.system.NativeStart.main(Native Method)
NullPointException 我在onPostExcute 方法中进入listView.setAdapter(adapter);,在AsyncTask 中。
这是我的课:
public class MainActivity extends ActionBarActivity {
List<Person> listData;
ListView listView;
CustomAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.person_layout);
listView = (ListView) findViewById(R.id.list_view_person);
listView.setDivider(null);
listData = new ArrayList<Person>();
processData();
listView.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount,
int totalItemCount) {
if(totalItemCount > 0 && firstVisibleItem + visibleItemCount == totalItemCount) {
processData();
}
}
});
}
public void processData(){
class ProcessDataTask extends AsyncTask<Void, Void, String> {
public ProcessDataTask() {
super();
}
@Override
protected String doInBackground(Void... params) {
.........//add data to listData here
return null;
}
@Override
protected void onPostExecute(String result) {
if(listData.size() > 0){
adapter = new CustomAdapter(listData, MainActivity.this);
if(listView != null && adapter != null)
listView.setAdapter(adapter);
}
super.onPostExecute(result);
}
}
ProcessDataTask processData = new ProcessDataTask();
processData.execute();
}
}
有什么建议可以解决我的错误吗?
【问题讨论】:
-
在哪里调用 addHeaderView 或 addFooterView 方法?
-
adapter = new CustomAdapter(listData, MainActivity.this);这里应该是adapter = new CustomAdapter(MainActivity.this, listData); -
new CustomAdapter(listData, MainActivity.this);或new CustomAdapter(MainActivity.this, listData);在适配器 CustomAdapter 中是Constructor。我的Constructor是public customAdapter(List<Person> list, Context context)。所以我的代码的初始化是真的;
标签: android android-listview adapter android-adapter android-actionbaractivity