【问题标题】:List elements are being added in AsyncTask even if I try to empty it即使我尝试清空它,列表元素也会被添加到 AsyncTask
【发布时间】:2015-12-08 20:02:03
【问题描述】:

所以,我有一些我认为远非很好的代码,但现在我有一个特别有趣的问题。

我使用 PkRSS 来填充列表。每次我来回更改 Fragment 时,List 都会在顶部添加新获取的项目,即使我在填充之前调用 Collections.emptyList()

代码如下:

public class UpcommingFragment extends Fragment {

    public static final String rss = "XYZ.RSS";
    public static List<Article> rssItems = Collections.emptyList();
    public RecyclerAdapter recAdapter;
    private RecyclerView recList;

    public UpcommingFragment() {
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.recycler, container, false);

        recList = (RecyclerView) rootView.findViewById(R.id.recyclerview);
//        recList.setHasFixedSize(true);
        LinearLayoutManager llm = new LinearLayoutManager(getActivity());
        llm.setOrientation(LinearLayoutManager.VERTICAL);
        recList.setLayoutManager(llm);
        recList.setItemAnimator(new DefaultItemAnimator());

        recAdapter = new RecyclerAdapter(rssItems);
        recList.setAdapter(recAdapter);


        recList.addOnItemTouchListener(
                new RecyclerItemClickListener(getActivity(), new RecyclerItemClickListener.OnItemClickListener() {
                    @Override
                    public void onItemClick(View view, int position) {
                        Article a;

                        a = rssItems.get(position);

                        String date = a.getDescription().substring(0, 12);
                        String uri = String.valueOf(a.getSource());

                        Intent i = new Intent(getActivity(), EventDetailActivity.class);
                        i.putExtra("date", date);
                        i.putExtra("head", a.getTitle());
                        i.putExtra("url", uri);
                        startActivity(i);
                    }
                })
        );

        new RSSget().execute();

        return rootView;
    }

    public void onDestroy() {
        super.onDestroy();
        rssItems = Collections.emptyList();
    }

    public boolean isOnline() {

        ConnectivityManager connectivity = (ConnectivityManager) getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
        if (connectivity != null) {
            NetworkInfo[] info = connectivity.getAllNetworkInfo();
            if (info != null)
                for (NetworkInfo anInfo : info)
                    if (anInfo.getState() == NetworkInfo.State.CONNECTED) {
                        return true;
                    }
        }
        return false;
    }

    // AsyncTask
    private class RSSget extends AsyncTask<Void, Void, Void> {

        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected Void doInBackground(Void... params) {

            try {

                rssItems = Collections.emptyList();
                rssItems = PkRSS.with(getActivity()).load(rss).get();
                Log.e("LISTCOUNTER", String.valueOf(rssItems.size()));

            } catch (Exception e) {
                Log.i("Error", "eror");
            }

            return null;
        }

        @Override
        protected void onPostExecute(Void result) {

            recAdapter = new RecyclerAdapter(rssItems);
            recList.setAdapter(recAdapter);
        }
    }

    public void onResume() {
        super.onResume();
    }
}

这是 LogCat

    09-12 11:33:08.050  23259-23329/com.mikebdev.douala E/LISTCOUNTER﹕ 12
09-12 11:33:11.701  23259-23306/com.mikebdev.douala E/LISTCOUNTER﹕ 24
09-12 11:33:15.017  23259-23323/com.mikebdev.douala E/LISTCOUNTER﹕ 36

如您所见,每次我来回更改片段时,列表都会在顶部添加这 12 个元素。

当然,如果您发现我可以在这段代码中做得更好,我将不胜感激

如果您需要查看其他内容,请告诉我。

提前致谢

【问题讨论】:

    标签: android list android-fragments android-asynctask


    【解决方案1】:

    不熟悉PkRSS,但快速浏览一下它的github页面,似乎这是某种有状态的RSS阅读器。也许你不能简单地调用它的加载方法而不清除它之前读取的数据?

    【讨论】:

    • if (rssItems.isEmpty()) { rssItems = PkRSS.with(getActivity()).load(rss).get(); }你是对的
    【解决方案2】:

    试试这个

           @Override
            protected void onPostExecute(Void result) {
    
            recAdapter = new RecyclerAdapter(rssItems);
            recList.setAdapter(recAdapter);
    recAdapter.notifyDataSetChange();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-07
      • 1970-01-01
      • 2020-08-17
      • 1970-01-01
      • 1970-01-01
      • 2017-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多