Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android ListFragment未使用notifydatasetChanged更新_Android_Listview_Android Listfragment_Notifydatasetchanged - Fatal编程技术网

Android ListFragment未使用notifydatasetChanged更新

Android ListFragment未使用notifydatasetChanged更新,android,listview,android-listfragment,notifydatasetchanged,Android,Listview,Android Listfragment,Notifydatasetchanged,我一直使用listfragment,因为在allData arrayalist中,fragment listview没有使用添加的新项进行更新。数据来自服务器,在接口的帮助下传递给listfragment类,结果到达passDataArrayList allData。我已经检查了大小,在passData()方法中没有问题,但是listfragemtn仍然没有更新。 我尝试了各种方法使listfragment与notifyDataSetChanged()和notifyDataSetValidate

我一直使用listfragment,因为在allData arrayalist中,fragment listview没有使用添加的新项进行更新。数据来自服务器,在接口的帮助下传递给listfragment类,结果到达passData
ArrayList allData
。我已经检查了大小,在
passData()
方法中没有问题,但是listfragemtn仍然没有更新。 我尝试了各种方法使listfragment与
notifyDataSetChanged()
notifyDataSetValidated()
一起工作,但都不起作用

片段:

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();
        }
    }
}
公共类ViewFeedback扩展ListFragment实现PassDataToFeedback
{
arraylistalldata;
自定义适配器自定义适配器;
@凌驾
公共事务主任(活动){
//TODO自动生成的方法存根
超级转速计(活动);
上下文=活动;
((活动\视图反馈)上下文);
}
@凌驾
已创建ActivityState上的公共无效(Bundle savedInstanceState){
super.onActivityCreated(savedInstanceState);
/*db=新数据库管理器(getActivity());
lists=db.getAllLists();
pAdapter=newpaylistadapter(getActivity(),lists);
setListAdapter(pAdapter);
registerForContextMenu(getListView())*/
allData=newarraylist();
customAdapter=新的customAdapter(allData);
setListAdapter(自定义适配器);
SetListShowed(真);
SetListShownAnimation(真);
}
适配器:

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();
        }
    }
}
公共类CustomAdapter扩展了BaseAdapter
{
arraylistalldata;
公共CustomAdapter(最终ArrayList allData)
{
//TODO自动生成的构造函数存根
if(allData!=null&&allData.size()>0)
this.allData=allData;
其他的
this.allData=newArrayList();
}
@凌驾
public int getCount(){
//TODO自动生成的方法存根
返回allData.size();
}
@凌驾
公共对象getItem(int arg0){
//TODO自动生成的方法存根
返回arg0;
}
@凌驾
公共长getItemId(int arg0){
//TODO自动生成的方法存根
返回arg0;
}
@凌驾
公共视图getView(int arg0、视图arg1、视图组arg2){
//TODO自动生成的方法存根
ViewHolder ViewHolder=null;
如果(arg1==null)
{
arg1=LayoutInflater.from(arg2.getContext()).flate(R.layout.row\u layout\u view\u反馈,arg2,false);
viewHolder=新的viewHolder(arg1);
arg1.setTag(视图持有者);
}否则
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_当.setSelected(真)时;
返回arg1;
}
公共类视图持有者
{
TextView-tv_-msg;
文本查看电视;
text查看电视节目时;
公共视图持有者(最终视图)
{
tv_msg=(TextView)view.findviewbyd(R.id.avf_tv_email);
tv_from=(TextView)view.findviewbyd(R.id.avf_tv_from);
tv_-when=(TextView)view.findViewById(R.id.avf_-tv_-when);
}
}
}
@凌驾
public void passData(ArrayList allData){
//TODO自动生成的方法存根
如果(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" />

问题在于,您正在通过调用
this.allData=new ArrayList()将数据源设置为适配器内的新引用

初始化
allData
列表并将其设置为适配器的数据源后,决不能更改对新列表的引用

无需执行空检查,因为您在将其传递到适配器之前对其进行了初始化,并且您应该设置
allData
数据源,即使它是一个空列表,也应该在创建时设置它

它保证不为空,因为在馈送到
CustomAdapter
构造函数之前,您在此处初始化它:

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

然后,您可以根据需要修改
allData
,并调用
notifyDataSetChanged()
来更新列表视图。

我想说的是,如果您在主线程之外的另一个线程上更新数据集,可能需要在UI线程上调用notifyDataSetChanged(),谢谢,请解释以下几行:-不需要执行空检查,因为您在将其传递到适配器之前对其进行了初始化,并且您应该设置allData数据源,即使它是一个空列表,这将是在创建的时候。@Vikrami下一步当然,我只是更新了更多信息的答案!让我知道这是否足够!谢谢,我想知道更多信息,因为万一我也会将null发送给customadapter(null),那么它将崩溃,这就是为什么我添加了以下行。allData=new ArrayList()@DanielNugent如果在异步线程(后台线程,不在主线程上运行)中调用passData(列表数据),那么该方法不会在主线程(UI线程)之外调用。事实上,我猜是的