【问题标题】:ListFragment is not updated with notifydatasetChangedListFragment 未使用 notifydatasetChanged 更新
【发布时间】:2016-10-14 04:50:35
【问题描述】:

我被 listfragment 卡住了,因为片段列表视图没有在 allData arrayalist 中添加新项目进行更新。数据来自服务器,通过接口传递给 listfragment 类,结果到达 passDataArrayList<SparseArray<String>> allData。我检查了大小,在passData() 方法中没问题,但 listfragemtn 仍然没有更新。 我已经尝试了所有工作方法,使 listfragment 与 notifyDataSetChanged()notifydatasetinvalidated() 一起工作,但没有奏效。

片段:

public class ViewFeedback extends ListFragment implements PassDataToFeedback
{
    ArrayList<SparseArray<String>> allData;
    CustomAdapter customAdapter;

    @Override
    public void onAttach(Activity activity) {
        // TODO Auto-generated method stub
        super.onAttach(activity);
        Context context=activity;
        ((Activity_ViewFeedback)context).setListener(this);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
    /*  db = new DatabaseManager(getActivity());
        lists = db.getAllLists();
        pAdapter = new PayListAdapter(getActivity(), lists);
        setListAdapter(pAdapter);

        registerForContextMenu(getListView());*/
        allData=new ArrayList<SparseArray<String>>();
        customAdapter=new CustomAdapter(allData);
        setListAdapter(customAdapter);
        setListShown(true);
        setListShownNoAnimation(true);

    }

适配器:

    public class CustomAdapter extends BaseAdapter
    {
        ArrayList<SparseArray<String>> allData;

        public CustomAdapter(final ArrayList<SparseArray<String>> allData) 
        {
            // TODO Auto-generated constructor stub
            if(allData!=null && allData.size()>0)
                this.allData=allData;
            else
                this.allData=new ArrayList<SparseArray<String>>();
        }

        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return allData.size();
        }

        @Override
        public Object getItem(int arg0) {
            // TODO Auto-generated method stub
            return arg0;
        }

        @Override
        public long getItemId(int arg0) {
            // TODO Auto-generated method stub
            return arg0;
        }

        @Override
        public View getView(int arg0, View arg1, ViewGroup arg2) {
            // TODO Auto-generated method stub
            ViewHolder viewHolder=null;
            if(arg1==null)
            {
                arg1=LayoutInflater.from(arg2.getContext()).inflate(R.layout.row_layout_view_feedback, arg2, false);
                viewHolder=new ViewHolder(arg1);
                arg1.setTag(viewHolder);
            }else
                viewHolder=(ViewHolder)arg1.getTag();

            viewHolder.tv_msg.setText(allData.get(arg0).get(0));
            viewHolder.tv_from.setText(allData.get(arg0).get(1));
            viewHolder.tv_from.setSelected(true);
            viewHolder.tv_when.setText(allData.get(arg0).get(2));
            viewHolder.tv_when.setSelected(true);
            return arg1;
        }

        public class ViewHolder
        {
            TextView tv_msg;
            TextView tv_from;
            TextView tv_when;

            public ViewHolder(final View view)
            {
                tv_msg=(TextView)view.findViewById(R.id.avf_tv_email);
                tv_from=(TextView)view.findViewById(R.id.avf_tv_from);
                tv_when=(TextView)view.findViewById(R.id.avf_tv_when);
            }
        }
    }

    @Override
    public void passData(ArrayList<SparseArray<String>> allData) {
        // TODO Auto-generated method stub
        if(allData!=null)
        {
            if(this.allData.size()>0)
            {
                this.allData.clear();
                customAdapter.notifyDataSetInvalidated();
            }
            this.allData.addAll(allData);
            customAdapter.notifyDataSetChanged();
        }
    }
}

片段布局:

<fragment
                android:id="@+id/myfragment"
                android:name="android.support.v4.app.ListFragment"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_below="@id/avf_layout_linear"
                class="com.fragments.ViewFeedback" />

【问题讨论】:

    标签: android listview android-listfragment notifydatasetchanged


    【解决方案1】:

    问题是您通过调用this.allData=new ArrayList&lt;SparseArray&lt;String&gt;&gt;(); 将数据源设置为适配器内的新引用

    一旦初始化了allData 列表,并将其设置为适配器的数据源,就绝不能更改对新列表的引用。

    不需要做空检查,因为你在将它传递给适配器之前初始化它,你应该设置allData数据源,即使它是一个空列表,它会在当时的创造。

    保证不为空,因为您在将其初始化为CustomAdapter 构造函数之前:

     allData=new ArrayList<SparseArray<String>>();
     customAdapter=new CustomAdapter(allData);
    

    此外,从一个空列表作为适配器的数据源开始是完全有效的(此时它不会显示任何行)。将数据添加到 allData 并调用 notifyDataSetChanged() 后,该列表将在此时填充。

        public CustomAdapter(final ArrayList<SparseArray<String>> allData) 
        {
            // TODO Auto-generated constructor stub
            //if(allData!=null && allData.size()>0) //no need for this
    
                this.allData=allData;
    
            //This was your problem, remove this code:
            //else
                //this.allData=new ArrayList<SparseArray<String>>();
        }
    

    然后,您可以根据需要修改allData,并调用notifyDataSetChanged()更新ListView。

    【讨论】:

    • 我想提一下,如果您在主线程之外的另一个线程上更新数据集developer.android.com/reference/android/app/…,则可能需要在 UI 线程上调用 notifyDataSetChanged()
    • 谢谢,请解释以下几行:-不需要做空检查,因为你在将它传递给适配器之前初始化它,你应该设置allData数据源甚至如果它是一个空列表,它将在创建时。
    • @VikramInext 当然,我刚刚用更多信息更新了答案!让我知道这是否足够!
    • 谢谢,我想知道更多,因为如果我也可以将 null 发送到 customadapter(null),那么它会崩溃,这就是我添加以下行的原因 this.allData=new ArrayList>();
    • @DanielNugent 如果您在 AsyncThread (后台线程,不在主线程上运行)调用 passData(List data) 则不会在主线程之外调用该方法(UI线)。实际上,我猜它不会,因为他可能在 onPostExecute 中调用 passData,它在 UI 线程上运行
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    • 2014-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多