Прежде всего, спасибо CommonsWare
за этот замечательный компонент. Но у меня есть проблема, которая несколько раз меня огорчала. То есть -> java.lang.IllegalStateException: содержимое адаптера изменилось, но ListView не получил уведомления. Убедитесь, что содержимое вашего адаптера изменено не из фонового потока, а только из потока пользовательского интерфейса.
Вышеупомянутая ошибка, которую я иногда получаю, но иногда нет. Ниже мой код.
protected boolean cacheInBackground() {
JSONObject json = null;
if(results != null)
results.clear();
results = new ArrayList<DataSource>();// results is the global variable which is List<DataSource> results; and initialized it here.
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("postdata",passeddata));
params.add(new BasicNameValuePair("currentpage", (++index)+""));
json = jParser.makeHttpRequest(urlphp, "POST", params); // Here is the line that makes http request for paginated results based on index and gets the response.
try {
int success = json.getInt("success");
if (success == 1) {
rowcount = json.getInt("numrows");
Log.d("row count value is>>>>",""+rowcount); // Here rowcount is the total rows in the database
products = json.getJSONArray("products");
// looping through All Products
for (int i = 0; i < products.length(); i++) {
JSONObject c = products.getJSONObject(i);
// Storing each json item in variable
String id = c.getString(ID);
String price = c.getString(PRICE);
String name = c.getString(NAME);
DataSource data = new DataSource(id,name,price);
results.add(data);
}
}else{
// product not found
successpass = success;
message = json.getString("message");
return false;
}
} catch (JSONException e) {
e.printStackTrace();
}
return(getWrappedAdapter().getCount()<rowcount);
}
@Override
protected void appendCachedData() {
if (getWrappedAdapter().getCount()<rowcount) {
@SuppressWarnings("unchecked")
CustomListAdapter adapter = (CustomListAdapter)getWrappedAdapter();
//ArrayAdapter<Integer> a=(ArrayAdapter<Integer>)getWrappedAdapter();
for (DataSource d : results){
adapter.add(d);
}
}else{
}
}
Как вы можете видеть в коде, я сохраняю данные в объекте класса Bean, а затем сохраняю каждый объект в List. Я реализовал CustomListView, чтобы отображать детали в виде списка.
Однако иногда вышеупомянутая ошибка возникает, а иногда нет. Мы много искали это и обнаружили this и некоторые другие общие проблемы с адаптером, такие как this и т. д., но я понимаю это ошибка даже без нажатия на placeholder
и даже без вызова notifyDataSetChanged()
. Как вы можете видеть в моем коде, я никогда не вызывал notifyDataSetChanged (), но почему возникает эта ошибка? Что-то не так с моей кодировкой реализации? Может ли кто-нибудь помочь мне решить эту проблему? Поскольку я глубоко интегрировал этот компонент в свое приложение, мне сейчас страшно видеть альтернативы.
Ниже представлена трассировка стека:
03-13 16:12:07.662: E/AndroidRuntime(494): FATAL EXCEPTION: main
03-13 16:12:07.662: E/AndroidRuntime(494): java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread. [in ListView(2130968671, class android.widget.ListView) with Adapter(class com.example.onlinedata.ORAdsList$CustomisedEndlessAdapter)]
03-13 16:12:07.662: E/AndroidRuntime(494): at android.widget.ListView.layoutChildren(ListView.java:1492)
03-13 16:12:07.662: E/AndroidRuntime(494): at android.widget.AbsListView.onLayout(AbsListView.java:1147)
03-13 16:12:07.662: E/AndroidRuntime(494): at android.view.View.layout(View.java:7035)
03-13 16:12:07.662: E/AndroidRuntime(494): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1249)
03-13 16:12:07.662: E/AndroidRuntime(494): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1125)
03-13 16:12:07.662: E/AndroidRuntime(494): at android.widget.LinearLayout.onLayout(LinearLayout.java:1042)
03-13 16:12:07.662: E/AndroidRuntime(494): at android.view.View.layout(View.java:7035)
03-13 16:12:07.662: E/AndroidRuntime(494): at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
03-13 16:12:07.662: E/AndroidRuntime(494): at android.view.View.layout(View.java:7035)
03-13 16:12:07.662: E/AndroidRuntime(494): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1249)
03-13 16:12:07.662: E/AndroidRuntime(494): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1125)
03-13 16:12:07.662: E/AndroidRuntime(494): at android.widget.LinearLayout.onLayout(LinearLayout.java:1042)
03-13 16:12:07.662: E/AndroidRuntime(494): at android.view.View.layout(View.java:7035)
03-13 16:12:07.662: E/AndroidRuntime(494): at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
03-13 16:12:07.662: E/AndroidRuntime(494): at android.view.View.layout(View.java:7035)
03-13 16:12:07.662: E/AndroidRuntime(494): at android.widget.FrameLayout.onLayout(FrameLayout.java:333)
03-13 16:12:07.662: E/AndroidRuntime(494): at android.view.View.layout(View.java:7035)
03-13 16:12:07.662: E/AndroidRuntime(494): at android.view.ViewRoot.performTraversals(ViewRoot.java:1045)
03-13 16:12:07.662: E/AndroidRuntime(494): at android.view.ViewRoot.handleMessage(ViewRoot.java:1727)
03-13 16:12:07.662: E/AndroidRuntime(494): at android.os.Handler.dispatchMessage(Handler.java:99)
03-13 16:12:07.662: E/AndroidRuntime(494): at android.os.Looper.loop(Looper.java:123)
03-13 16:12:07.662: E/AndroidRuntime(494): at android.app.ActivityThread.main(ActivityThread.java:4627)
03-13 16:12:07.662: E/AndroidRuntime(494): at java.lang.reflect.Method.invokeNative(Native Method)
03-13 16:12:07.662: E/AndroidRuntime(494): at java.lang.reflect.Method.invoke(Method.java:521)
03-13 16:12:07.662: E/AndroidRuntime(494): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
03-13 16:12:07.662: E/AndroidRuntime(494): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
03-13 16:12:07.662: E/AndroidRuntime(494): at dalvik.system.NativeStart.main(Native Method)
EndlessAdapter
не должен этого делать, это означает, что либо вы делаете это сами в другом месте, либо вEndlessAdapter
есть ошибка. Чтобы иметь надежду исправить такую ошибку, мне нужен повторяемый тестовый пример. Если вам случится создать повторяемый тестовый пример, прикрепите его (вместе с шагами, которые мне нужно выполнить, чтобы использовать) на проблема, которую вы открыли. - person CommonsWare   schedule 13.03.2013