【问题标题】:How to update a list adapter如何更新列表适配器
【发布时间】:2013-08-01 13:00:39
【问题描述】:

我正在创建一个 android 应用程序,我在其中显示项目列表,用户可以从中进行选择。我正在尝试更新列表,如果项目但应用程序一直在崩溃,无论我写什么代码。以下是我正在做的事情

在 OnCreate 方法中我有以下代码

adapter = new ArrayAdapter<String>(getActivity(), layout, showArray);
setListAdapter(adapter);

目前,showArray 是一个空数组,目前该应用程序有效。

接下来,我在 showArray 中插入数据,并尝试用另一种方法更新列表适配器。我正在使用以下代码:

adapter = new ArrayAdapter<String>(getActivity(), layout, showArray);
setListAdapter(adapter);

但应用程序崩溃。我试图将我的代码更改为:

adapter = new ArrayAdapter<String>(getActivity(), layout, showArray);
adapter.notifyDataSetChanged();

但又一次没有运气。

我的完整代码如下:

public class Fragment_AllCommunities extends Fragment {
    OnHeadlineSelectedListener callBack;

    // The container Activity must implement this interface so the frag can deliver messages
    public interface OnHeadlineSelectedListener {
        public void onCommunitySelected(int position);
    }

    private ProgressDialog progress;
    private Activity activity;
    private JSONArray communities;
    private JSONObject[] commDetails;
    private String[] showArray = {""};
    private int layout = 0;
    private ArrayAdapter<String> adapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // We need to use a different list item layout for devices older than Honeycomb
        layout = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB ?
            android.R.layout.simple_list_item_activated_1 : android.R.layout.simple_list_item_1;

        adapter = new ArrayAdapter<String>(getActivity(), layout, showArray);
        setListAdapter(adapter);
    }

    public void updateAllCommunities(JSONObject[] commArr) throws JSONException {
        commDetails = commArr;

        showArray = new String[commDetails.length];

        for(int i=0;i<commDetails.length;i++)
        {
            showArray[i] =  commDetails[i].getString("name").toString();
        }

        //adapter = new ArrayAdapter<String>(getActivity(), layout, showArray);
        //adapter.notifyDataSetChanged();

        try
        {
            adapter.notifyDataSetChanged();
        }
        catch(Exception ex)
        {
            String s = ex.getMessage();
        }

  }


    @Override
    public void onStart() {
        super.onStart();
        if (getFragmentManager().findFragmentById(R.id.view_community_fragment) != null) {
            getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
            //getListView().setItemChecked(0, true);
        }
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        try {
            callBack = (OnHeadlineSelectedListener) activity;
        } catch (ClassCastException e) {
            throw new ClassCastException(activity.toString()
                + " must implement OnHeadlineSelectedListener");
        }
    }

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        callBack.onCommunitySelected(position);

        getListView().setItemChecked(position, true);
    }

    @Override
    public void onResume() {
        super.onResume();
        String a = "S";
    }
}

谁能告诉我我做错了什么?

提前致谢 感谢所有回复

克莱夫

【问题讨论】:

  • 我们需要来自 LogCat 的堆栈跟踪。
  • 添加有问题的堆栈跟踪。
  • 你能告诉我怎么做吗?我是android的初学者。抱歉,谢谢
  • 我用 try catch 包围了该代码,并且 stackTrace 为 null,而原因是 nullpointerexception。这是你想要的吗?

标签: android android-arrayadapter listadapter


【解决方案1】:

如果您想更新您的列表,只需输入此代码。它将更新您的列表视图更新数据的适配器。

adapter.notifyDataSetChanged();

【讨论】:

  • 在调用 adapter.notifyDataSetChanged() 之前检查适配器是否已初始化和数据是否已设置;
【解决方案2】:

我很确定问题在于您不止一次致电setListAdapter。您应该只在构建 ListFragment 时调用它。如果要修改列表,则必须通过调用适配器的add()remove() 方法将数据添加到底层数据结构中。

即:

adapter.add(object);
adapter.notifyDataSetChanged()

通常我会创建一个包装器方法来将数据添加到适配器。

【讨论】:

  • 空指针异常。我不知道为什么会这样。我可能会尝试改变整个班级,也许我会成功
  • @CliveCauchi NPE 有什么用?你能给我这方面的任何信息吗?
  • @CliveCauchi 我又想到了一件事。尝试将代码从onCreate 移动到onActivityCreated,如本教程所示:vogella.com/articles/AndroidListView/#listfragments NPE 的问题可能是它返回 null,因为尚未创建 Activity。
  • 我可以告诉你的是,当它进入第一行代码时,我会得到一个空指针异常。 detailMessage 为空,stackTrace 为空,所以我不知道我可以给你什么其他信息,除了第一个类似的代码给我带来了问题
  • @CliveCauchi 如果第一行的意思是adapter.add(object),那么我认为我在第二条评论中所说的将解决这个问题。您可能还需要编辑onCreateView。我会阅读更多关于 Fragment 生命周期的内容,因为它们与 Activity 之间存在一些差异。 developer.android.com/guide/components/fragments.html#Creating
猜你喜欢
  • 1970-01-01
  • 2021-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多