片段中的Android ListView - 获取新数据后刷新表的问题

Posted

技术标签:

【中文标题】片段中的Android ListView - 获取新数据后刷新表的问题【英文标题】:Android ListView in fragment - problem with table refreshing after getting new data 【发布时间】:2021-09-11 17:53:21 【问题描述】:

正如我在主题中提到的,我在将我从 API 下载的数据直接更新到 ListView 时遇到了问题,所以有一个简单的解释:

我已经创建了带有搜索视图和列表视图的片段。 现在使用 onCreateView() 为我的表加载第一个数组数据。

public ArrayList<item_list> myListView;

然后我尝试用这样的代码实现搜索器:

      searchView = view.findViewById(R.id.searchBar);

        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() 
            @Override
            public boolean onQueryTextSubmit(String query) 
                    myListView.clear();
                CallMyFunction(query);
                return false;
            

            @Override
            public boolean onQueryTextChange(String newText) 
                return false;
            
        );

在 CallMyFunction 中,我有一个与初始函数相同的函数,用于为我的 ListView 构建第一个适配器。

好的,现在当我使用这个函数时,我得到了 200,我也得到了新的值,但它们只是没有添加到我的 ListView 中。

我的功能:

   public void CallMyFunction(String searchString)
        String token = this.token;
        Toast.makeText(getActivity(), "Loading the ListView...", Toast.LENGTH_SHORT).show();
        listOfData = new ArrayList<>();


        Call<List<ItemDataClass>> itemDataClassCall = ApiLoginInterface.ITEM_DATA_CLASS_CALL(searchString,token);

        itemDataClassCall.enqueue(new Callback<List<ItemDataClass>>() 
            @Override
            public void onResponse(Call<List<ItemDataClass>> call, Response<List<ItemDataClass>> response) 
                if(response.isSuccessful())
                    List<ItemDataClass> itemsResponse = response.body();

                    for(ItemDataClass getList : itemsResponse) 

                        response_item_list itemList = new response_item_list();
                        itemList.setDescription(getList.getDESCRIPTION());

                        ByteArrayOutputStream baos = new ByteArrayOutputStream();
                        byte[] imageBytes = baos.toByteArray();
                        imageBytes = Base64.decode(getList.getIMAGE(), Base64.DEFAULT);
                        Bitmap decodedImage = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length);

                        itemList.set_image(decodedImage);
                        itemList.set_name(getList.getPRODUCER());
                       itemList.set_content(getList.getCONTENT());
                        itemList.set_cost(getList.getCost());
                        itemList.set_contest(getList.getCONTEST());
                        itemList.set_content(getList.getRH_CONTENT());
                        itemList.set_weight(getList.getWEIGHT());
                        itemList.set_index(getList.getINDEX());
                       myListView.add(itemList);
                    
                 else 
                    Log.d(TAG, ""+ response.code());
                
                adapter.notifyDataSetChanged();
            
            @Override
            public void onFailure(Call<List<CatalystDataClass>> call, Throwable t) 
                Log.d(TAG, "onFailure: " + t.getMessage());
            
        );

    

而对于这些代码,奇怪的是我在调用搜索后得到一个空视图(所以在调用这个函数之后)或者我得到旧表值..

有人可以帮忙吗?

【问题讨论】:

【参考方案1】:

你的myListView只是List而不是ListView,那么什么都没有显示是正常的。您需要在您的 xml 中创建一个ListView,并使用将显示它的适配器将其链接到您的项目。

【讨论】:

嗨,我做到了 - myListView 只是我的 ListView 的项目列表:P 我在加载数据时没有问题,初始加载工作正常,但是当我在搜索器中输入内容时出现问题。【参考方案2】:

好的,我解决了我的问题。

要更改数据,您只需要刷新适配器,但这并不像我想的那么容易,不止adapter.notifyDataSetChanged();。您需要在适配器中创建一个简单的函数:

    public void clearlistview() 
       items.clear();
        this.notifyDataSetChanged();
    

然后在清除列表后,您必须再次调用适配器,以准备新的列表视图:

 adapter = new item_Adapter(getActivity(),listOfItems);
                listView = view.findViewById(R.id.items_tableView);
                listView.setAdapter(adapter);

这解决了我的问题。

【讨论】:

以上是关于片段中的Android ListView - 获取新数据后刷新表的问题的主要内容,如果未能解决你的问题,请参考以下文章

片段中的Android ListView

片段中的 Android ListView ArrayAdapter 不起作用

片段中ListView的android自定义适配器

Android - ListView 中的延迟点击

Android - 如何显示包含从片段中获取的字符串的快餐栏

Android - 片段中的 setAdapter [重复]