【问题标题】:Android How to change ListView adapterAndroid 如何更改 ListView 适配器
【发布时间】:2016-01-04 15:57:04
【问题描述】:

我有一个带有 TextBox 的 Activity,一个带有一些选项的 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 适配器。

有人知道怎么做吗?我不发布我的代码,因为它不起作用。我只需要一个小指南或链接即可查看一些示例。

谢谢!

编辑 1

这是我必须分配给 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 值和 object 的拼写错误(ObjectX 是 ObjectY)

【问题讨论】:

  • 您好,我已经编辑了您的问题以使堆栈跟踪更易于阅读,但是您能否添加您的项目的相关代码关于您的列表视图?因为没有它,我们很难帮你找到问题。谢谢你。 (不幸的是,您不应该从该站点寻求指南或教程,因此如果您可以编辑该部分并输入您的代码,我们可以为您提供帮助。)
  • 您是否尝试从其他线程修改ListView 的内容?
  • 错误的文字很清楚:ListView did not receive a notification、Make sure your adapter calls notifyDataSetChanged()和Make sure the content of your adapter is not modified from a background thread。您是否确保所有这 3 件事都已正确实施?
  • 我用一些信息和代码编辑了帖子

标签: java android android-layout listview android-listview


【解决方案1】:

你检查过这个答案吗?

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

由于我还没有评论权限,因此我将发布作为答案。

【讨论】:

  • 有一些代表然后是年轻的;)我在那个位置上呆了一段时间并且讨厌它。 (另外我正在发表评论说完全相同的事情,所以你去吧。)
  • 试图得到一些:-)
猜你喜欢
  • 2016-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-25
  • 1970-01-01
  • 1970-01-01
  • 2013-09-07
  • 1970-01-01
相关资源
最近更新 更多