ListView 和 GridView 在选项卡切换之间被清除

Posted

技术标签:

【中文标题】ListView 和 GridView 在选项卡切换之间被清除【英文标题】:ListView and GridView gets cleared between tab switches 【发布时间】:2015-01-24 02:44:44 【问题描述】:

我有一个包含 3 个标签的活动。每次我在选项卡之间切换时,我的 ListView 和 GridView(在第一个选项卡上)都会被清除,有趣的是 ArrayList 包含之前下载的所有数据,如果我调用 addToGrid() 函数,ListView 会很好地填充。

为什么在选项卡之间切换时会清除列表和网格视图。是否在每个选项卡开关上重新创建包含的片段?我是否需要查询我的数据库并在每个选项卡切换之间重新填充我的视图?

谢谢!

顺便说一句 - 我在 onResume 函数中添加了一个“if”语句。如果我离开“if”语句,listview 会将行加倍,并在切换回来时一次又一次地重新填充它。但是使用“if”语句后,我的列表视图在 onResume 上保持空白,因为正如我所提到的,ArrayList 仍然包含所有数据。

摘自包含 ListView 的片段:

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) 
            // Inflate the layout for this fragment
            super.onCreateView(inflater, container, savedInstanceState);
            v = inflater.inflate(R.layout.offers_view, null, false);                                    

            SharedPreferences preferences = getActivity().getSharedPreferences("USERINFO", 
                    Context.MODE_PRIVATE);
            user = preferences.getString("name", null);


            Button showAllUserImages = (Button) v.findViewById(R.id.showAllUserImages);
            showAllUserImages.setOnClickListener(new OnClickListener()  
                @Override
                  public void onClick(View v)                      
                    Intent i = new Intent(getActivity(), AllUserImages.class);
                    startActivity(i);                      
                                
               ); 

            RelativeLayout topLoc = (RelativeLayout) v.findViewById(R.id.topLocationsBtn);
            topLoc.setOnClickListener(new OnClickListener()  
                @Override
                  public void onClick(View v)                      
                       Intent loc = new Intent(getActivity(), com.fideli.top.guide.TopLocations.class);
                       startActivity(loc);                         
                                    
               ); 

            RelativeLayout guide = (RelativeLayout) v.findViewById(R.id.guideBtn);
            guide.setOnClickListener(new OnClickListener()  
                @Override
                  public void onClick(View v)                      
                       Intent i= new Intent(getActivity(), com.fideli.top.guide.GloveGuide.class);
                       startActivity(i);                       
                                    
               ); 



          return v;          
    



    @Override
    public void onPause()      
        super.onPause();
        System.out.println("paused!");


    

    @Override
    public void onResume()         
        super.onResume();

        if(imageItems.isEmpty())
        getInfoFromDB();

        

        if(tasteMakersList.isEmpty())
        getTastemakers();
        

        if(feedList.isEmpty())
        downloadFeed();
        

    



   private void downloadFeed() 

       AsyncHttpClient client = new AsyncHttpClient();      
        System.out.println("Downloading Feed!!");
        client.get("http://www.edmondvarga.com/android_dev/fideli/get-relations.php?mainUser=" + user, null, 
                                    new JsonHttpResponseHandler()              
            @Override
            public void onSuccess(int statusCode, Header[] headers, JSONObject response) 
                try                                        
                    JSONArray contacts = response.getJSONArray("info");

                    for (int i=0; i< contacts.length();i++)
                        JSONObject json = contacts.getJSONObject(i);                            

                        String followedUser = json.getString("folwed_users");                       
                        getFeed(followedUser);

                                       
                 catch (JSONException e)                  
                    e.printStackTrace();
                       
              

         );


    



    public void getInfoFromDB()

        datasource = new SQLiteDataSource(getActivity());
        datasource.open();


        List<ImageItem> values = datasource.getAllImageItems();
        for (int i = 0; i < values.size(); i++) 

            ImageItem ii = new ImageItem(null, null);

            ii.setImage(values.get(i).getImage());
            ii.setUser(values.get(i).getUser());
            ii.setUserId(values.get(i).getUserId());
            ii.setLikes(values.get(i).getLikes());
            ii.setDescription(values.get(i).getDescription());
            ii.setLocation(values.get(i).getLocation());    
            ii.setAddress(values.get(i).getAddress());
            ii.setCity(values.get(i).getCity());
            ii.setLat(values.get(i).getLat());
            ii.setLng(values.get(i).getLng());          


            imageItems.add(ii);
            addToGrid();
        

    

            public void addToGrid() 
                gridView = (GridView) v.findViewById(R.id.gridView);
                customGridAdapter = new GridViewAdapter(getActivity(), R.layout.row_grid, imageItems);          
                gridView.setAdapter(customGridAdapter);         
                gridView.setOnItemClickListener(this); 
               

【问题讨论】:

【参考方案1】:

您的视图很可能会被破坏,但片段可能不会。我知道这发生在ViewPager 当用户导航超过一页时。因此,如果您的 imageItems 变量是实例变量,则不会重新创建它,因为仍会创建片段。请参阅Fragments 指南中的生命周期图。

【讨论】:

以上是关于ListView 和 GridView 在选项卡切换之间被清除的主要内容,如果未能解决你的问题,请参考以下文章

android listview里面能嵌套gridview吗

Flutter 布局问题(ListView 和 GridView)

Flutter 如何使用 ListView 水平和 GridView 垂直滚动屏幕

在 kotlin 中连接 Gridview 和 Listview

Listview或者GridView嵌套在ScrollView中只显示一行item解决方法。

listview在上gridview在下,如何能够一起滚动?