片段中的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 ArrayAdapter 不起作用