Android 在片段上更新listview

Android 在片段上更新listview,android,listview,swiperefreshlayout,Android,Listview,Swiperefreshlayout,我有一个ListView,它实现了一个SwipeRefreshLayout。我试图做的是在用户向下滑动时更新列表视图。我试图寻找不同的选择,但不幸的是,我无法找到解决方案 重新加载片段还是重新加载onCreate函数更好 这是我的代码 public class NewsTab extends Fragment implements OnRefreshListener{ final LinkedList<News> listnews = new LinkedList<News&g

我有一个
ListView
,它实现了一个
SwipeRefreshLayout
。我试图做的是在用户向下滑动时更新
列表视图。我试图寻找不同的选择,但不幸的是,我无法找到解决方案

重新加载
片段
还是重新加载
onCreate
函数更好

这是我的代码

public class NewsTab extends Fragment implements OnRefreshListener{
final LinkedList<News> listnews = new LinkedList<News>();


public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.news_tab, container, false);
        swipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.swipe_refresh_layout);
        swipeRefreshLayout.setOnRefreshListener(this);

        newslist = (ListView) view.findViewById(R.id.displaynews);

        populatelist(listnews);
        adapter = new CustomAdapter(getActivity(),listnews);
        newslist.setAdapter(adapter);
        return view; 
}

public void onRefresh() {
    swipeRefreshLayout.setRefreshing(true);
    new StartNewsLoad().execute("");
}

private class StartNewsLoad extends AsyncTask<String, Void, String> {
    //ProgressDialog pd = null;
    protected String doInBackground(String... params) {
        reloadNews();
        loadTopNews();
        //NewsTab.listnews = new LinkedList<News>();
        return null;
    }

    protected void onPostExecute(String result) {
        adapter = new CustomAdapter(getActivity(),listnews);
        adapter.notifyDataSetChanged();
        swipeRefreshLayout.setRefreshing(false);
    }
}
公共类NewsTab扩展了RefreshListener上的片段实现{
final LinkedList listnews=新LinkedList();
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图=充气机。充气(R.layout.news_选项卡,容器,false);
swipeRefreshLayout=(swipeRefreshLayout)view.findViewById(R.id.swipe\u refresh\u layout);
swipeRefreshLayout.setOnRefreshListener(此);
newslist=(ListView)view.findViewById(R.id.displaynews);
大众主义者(列表新闻);
adapter=新的CustomAdapter(getActivity(),listnews);
setAdapter(适配器);
返回视图;
}
公共void onRefresh(){
swipeRefreshLayout.setRefreshing(true);
新建StartNewsLoad()。执行(“”);
}
私有类StartNewsLoad扩展异步任务{
//ProgressDialog pd=null;
受保护的字符串doInBackground(字符串…参数){
重新加载新闻();
loadTopNews();
//NewsTab.listnews=新链接列表();
返回null;
}
受保护的void onPostExecute(字符串结果){
adapter=新的CustomAdapter(getActivity(),listnews);
adapter.notifyDataSetChanged();
swipeRefreshLayout.setRefreshing(false);
}
}
///回答

我找到了答案!我在costude适配器中添加了以下代码行,并在外部将其称为adapter.refresh()

公共无效刷新(LinkedList新闻列表)
{
this.results=新闻列表;
notifyDataSetChanged();
}

谢谢大家的帮助!

首先,无需在
onPostExecute()
中再次创建适配器,因为您已经在
onCreateView()
中对其进行了初始化。您只需将“listnews”中的更改通知适配器即可如果列表已更改。请确保在调用
notifyDataSetChanged()
之前列表确实已更改

另外,请使用调试器或日志检查是否调用了
onRefresh()
。在我看来,应该使用@override注释覆盖它,因为它是由片段(
swipeRefreshLayout.setonrefreshtlistener(this);
)实现的接口的方法。它应该类似于:

@Override
public void onRefresh() {
    swipeRefreshLayout.setRefreshing(true);
    new StartNewsLoad().execute("");
    }

首先,无需在
onPostExecute()
中再次创建适配器,因为您已经在
onCreateView()
中对其进行了初始化。如果“listnews”中发生了更改,只需通知适配器。在调用
notifyDataSetChanged()
之前,请确保您的列表确实发生了更改

另外,请使用调试器或日志检查是否调用了
onRefresh()
。在我看来,应该使用@override注释覆盖它,因为它是由片段(
swipeRefreshLayout.setonrefreshtlistener(this);
)实现的接口的方法。它应该类似于:

@Override
public void onRefresh() {
    swipeRefreshLayout.setRefreshing(true);
    new StartNewsLoad().execute("");
    }
在onCreateView()中,初始化listview并使用listener SwipereRefershLayout,然后将适配器设置为listview,如下所示-->

if(适配器==null&&listNews==null){
listnews=newarraylist();
adapter=新的CustomAdapter(getActivity(),listnews);
setAdapter(适配器);
adapter.notifyDataSetChanged();}
否则{
setAdapter(适配器);}
这样,它还可以处理保留listData的onOrientationchange

当你得到api响应或使用滑动布局引用listview时,不要创建新适配器,只需将listNews添加到适配器并调用适配器。notifyDataSetChanged();

在onCreateView()中初始化你的listview和SwipPerfereshLayout,并将适配器设置为你的listview,如下所示-->

if(适配器==null&&listNews==null){
listnews=newarraylist();
adapter=新的CustomAdapter(getActivity(),listnews);
setAdapter(适配器);
adapter.notifyDataSetChanged();}
否则{
setAdapter(适配器);}
这样,它还可以处理保留listData的onOrientationchange


当您得到api响应或使用滑动布局引用listview时,不要创建新适配器,只需将listNews添加到适配器并调用适配器。notifyDataSetChanged()

在通知它之前,您需要在列表视图上设置适配器。除此之外,
listnews
来自何处?请显示@cricket_007感谢您的回复listnews是我创建的一个全局链接列表,保存我的新闻类。请参见上面的编辑。在通知itOt之前,您需要在列表视图上设置适配器除此之外,
listnews
从何而来?请显示@cricket_007感谢您的回复listnews是我创建的一个保存我的新闻类的全局链接列表请参见上面的编辑感谢您的回复,adapter=new CustomAdapter(getActivity(),listnews);我这样添加它是为了添加新列表有什么方法可以只添加到我已经拥有的吗?@paul590您在创建适配器时做得很好,但是当您需要更新列表视图时,请不要再次创建它或在列表视图上重新设置它。当您的arraylist中的数据发生更改时,只需调用notifydatasetchanged即可。谢谢您为我提供w通过这些信息,我删除了listview.setadapter(适配器)行和ket NotifyDataSetChange,但我的列表没有使用新值更新,我测试了这些值是通过滚动到另一个选项卡添加的,该选项卡提取相同的信息,而新的信息已失效,我是否缺少提交行或启动列表更新的任何内容?感谢您的帮助我找到了我的an
if(adapter==null&& listNews==null){
listnews=new ArrayList<object>();
adapter=new CustomAdapter(getActivity(),listnews);
listView.setAdapter(adapter);
adapter.notifyDataSetChanged();}
else{
listView.setAdapter(adapter);}