Android ListFragment未使用notifydatasetChanged更新
我一直使用listfragment,因为在allData arrayalist中,fragment listview没有使用添加的新项进行更新。数据来自服务器,在接口的帮助下传递给listfragment类,结果到达passDataAndroid 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
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线程)之外调用。事实上,我猜是的