2016-01-04 6 views
-2

У меня есть активность с TextBox, в ListView с некоторыми вариантами, которые могут быть размещены, если я нажимаю на него и кнопку для проверки данных на текстовом поле.Android Как изменить ListView адаптер

Он отлично работает. Моя проблема возникает, когда я хочу изменить адаптер ListView для изменения элементов, отображаемых на нем. И в этот момент я получаю LogCat Ошибка так:

01-04 16:29:00.157: E/AndroidRuntime(1825): FATAL EXCEPTION: main 
01-04 16:29:00.157: E/AndroidRuntime(1825): Process: es.sw.android, PID: 1825 
01-04 16:29:00.157: E/AndroidRuntime(1825): 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. Make sure your adapter calls notifyDataSetChanged() when its content changes. [in ListView(16908298, class android.widget.ListView) with Adapter(class es.tlsi.sw.ventanas.UbicacionAdapter)] 
01-04 16:29:00.157: E/AndroidRuntime(1825):  at android.widget.ListView.layoutChildren(ListView.java:1582) 
01-04 16:29:00.157: E/AndroidRuntime(1825):  at android.widget.AbsListView.onLayout(AbsListView.java:2206) 
01-04 16:29:00.157: E/AndroidRuntime(1825):  at android.view.View.layout(View.java:16075) 
01-04 16:29:00.157: E/AndroidRuntime(1825):  at android.view.ViewGroup.layout(ViewGroup.java:5300) 
01-04 16:29:00.157: E/AndroidRuntime(1825):  at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703) 
01-04 16:29:00.157: E/AndroidRuntime(1825):  at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1557) 
01-04 16:29:00.157: E/AndroidRuntime(1825):  at android.widget.LinearLayout.onLayout(LinearLayout.java:1466) 
01-04 16:29:00.157: E/AndroidRuntime(1825):  at android.view.View.layout(View.java:16075) 
01-04 16:29:00.157: E/AndroidRuntime(1825):  at android.view.ViewGroup.layout(ViewGroup.java:5300) 
01-04 16:29:00.157: E/AndroidRuntime(1825):  at android.widget.RelativeLayout.onLayout(RelativeLayout.java:1077) 
01-04 16:29:00.157: E/AndroidRuntime(1825):  at android.view.View.layout(View.java:16075) 
01-04 16:29:00.157: E/AndroidRuntime(1825):  at android.view.ViewGroup.layout(ViewGroup.java:5300) 
01-04 16:29:00.157: E/AndroidRuntime(1825):  at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579) 
01-04 16:29:00.157: E/AndroidRuntime(1825):  at android.widget.FrameLayout.onLayout(FrameLayout.java:514) 
01-04 16:29:00.157: E/AndroidRuntime(1825):  at android.view.View.layout(View.java:16075) 
01-04 16:29:00.157: E/AndroidRuntime(1825):  at android.view.ViewGroup.layout(ViewGroup.java:5300) 
01-04 16:29:00.157: E/AndroidRuntime(1825):  at com.android.internal.widget.ActionBarOverlayLayout.onLayout(ActionBarOverlayLayout.java:494) 
01-04 16:29:00.157: E/AndroidRuntime(1825):  at android.view.View.layout(View.java:16075) 
01-04 16:29:00.157: E/AndroidRuntime(1825):  at android.view.ViewGroup.layout(ViewGroup.java:5300) 
01-04 16:29:00.157: E/AndroidRuntime(1825):  at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579) 
01-04 16:29:00.157: E/AndroidRuntime(1825):  at android.widget.FrameLayout.onLayout(FrameLayout.java:514) 
01-04 16:29:00.157: E/AndroidRuntime(1825):  at android.view.View.layout(View.java:16075) 
01-04 16:29:00.157: E/AndroidRuntime(1825):  at android.view.ViewGroup.layout(ViewGroup.java:5300) 
01-04 16:29:00.157: E/AndroidRuntime(1825):  at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2119) 
01-04 16:29:00.157: E/AndroidRuntime(1825):  at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1873) 
01-04 16:29:00.157: E/AndroidRuntime(1825):  at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1073) 
01-04 16:29:00.157: E/AndroidRuntime(1825):  at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5988) 
01-04 16:29:00.157: E/AndroidRuntime(1825):  at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767) 
01-04 16:29:00.157: E/AndroidRuntime(1825):  at android.view.Choreographer.doCallbacks(Choreographer.java:580) 
01-04 16:29:00.157: E/AndroidRuntime(1825):  at android.view.Choreographer.doFrame(Choreographer.java:550) 
01-04 16:29:00.157: E/AndroidRuntime(1825):  at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753) 
01-04 16:29:00.157: E/AndroidRuntime(1825):  at android.os.Handler.handleCallback(Handler.java:739) 
01-04 16:29:00.157: E/AndroidRuntime(1825):  at android.os.Handler.dispatchMessage(Handler.java:95) 
01-04 16:29:00.157: E/AndroidRuntime(1825):  at android.os.Looper.loop(Looper.java:135) 
01-04 16:29:00.157: E/AndroidRuntime(1825):  at android.app.ActivityThread.main(ActivityThread.java:5910) 
01-04 16:29:00.157: E/AndroidRuntime(1825):  at java.lang.reflect.Method.invoke(Native Method) 
01-04 16:29:00.157: E/AndroidRuntime(1825):  at java.lang.reflect.Method.invoke(Method.java:372) 
01-04 16:29:00.157: E/AndroidRuntime(1825):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1405) 
01-04 16:29:00.157: E/AndroidRuntime(1825):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1200) 

В резюме, я хочу изменить адаптер ListView в зависимости от данных, которые я должен, чтобы ввести в этот момент.

Кто-то знает, как это сделать? Я не отправляю свой код, потому что он не работает. Мне нужен только справочник litte или ссылка, чтобы увидеть пример.

Спасибо!

EDIT 1

Вот код, который я должен Asign в ListView адаптер:

public void onEventMainThread(Event1 event){ 
    // Charge data list 
    this.setListAdapter(new Adapter1(getApplicationContext(),R.id.tv_items,event.getItems1())); 
} 

public void onEventMainThread(Event2 event){ 
    // Charge data list 
    this.setListAdapter(new Adapter2(getApplicationContext(),R.id.tv_items,event.getItems2())); 
} 

И адаптеры код:

public class Adapter1 extends ArrayAdapter<ObjectX>{ 
final Context context; 
final List<ObjectX> objectX; 

public Adapter1(Context context, int resource, List<ObjectX> objects){ 
    super(context,resource,objects); 
    this.context = context; 
    this.objectX = objects; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View rowView = convertView; 
    LayoutInflater inflater = (LayoutInflater) context 
      .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    rowView = inflater.inflate(R.layout.listView, null); 

    TextView location = (TextView) rowView.findViewById(R.id.tv_1); 
    TextView type = (TextView) rowView.findViewById(R.id.tv_2); 

    location.setText("Location: " + objectX.getLocation()); 
    type.setText("Type: " + objectX.getType()); 

    return rowView; 
} 
} 

Единственное, что изменить на нем - значения setText и опечатка объекта (вместо ObjectX - ObjectY)

+1

Привет, я отредактировал ваш вопрос, чтобы упростить чтение трассировки стека, но не могли бы вы добавить соответствующий код вашего проекта о своем списке? Потому что без этого нам будет очень сложно помочь вам найти проблему. Спасибо. (К сожалению, вы не должны просить руководства или учебные пособия с этого сайта, поэтому, если вы можете отредактировать эту часть и поместить в свой код, мы можем вам помочь.) – mawalker

+0

Вы пытаетесь изменить содержимое «ListView» из другой поток? –

+0

Текст ошибки достаточно ясен: 'ListView не получил уведомление ',' Убедитесь, что ваш адаптер вызывает notifyDataSetChanged() 'и' Убедитесь, что содержимое вашего адаптера не изменено из фонового потока'. Обеспечили ли вы, чтобы все 3 из этих вещей были надлежащим образом реализованы? – NoChinDeluxe

ответ

1

Вы проверили этот ответ?

Android, ListView IllegalStateException: "The content of the adapter has changed but ListView did not receive a notification"

Я отправляю в ответ, как у меня нет разрешения на комментарий пока.

+0

имел некоторую репутацию, затем юную;) Я был в этом положении, пока и ненавидел его. (плюс я был в процессе публикации комментария, говорящего точно так же, так что вы идете.) – mawalker

+1

Попытка получить некоторые :-) – Anuron

Смежные вопросы