gpt4 book ai didi

android - 无法刷新不同选项卡下使用的相同 fragment 中的 ListView 数据

转载 作者:行者123 更新时间:2023-11-30 00:48:25 29 4
gpt4 key购买 nike

我在我的 android 应用程序中通过 SmartTabLayout 库实现了选项卡功能。目前,我为我的两个选项卡 使用了与viewpager 相同的fragment。因为,唯一的区别是 View 是列表项的排序。下面是我的 HomeActivity 代码:

HomeActivity.java

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);

final ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
final SmartTabLayout viewPagerTab = (SmartTabLayout) findViewById(R.id.viewpagertab);
viewPagerTab.setCustomTabView(this);

FragmentPagerItems pages = new FragmentPagerItems(this);
pages.add(FragmentPagerItem.of("Test1", SampleFragment.class));
pages.add(FragmentPagerItem.of("Test2", SampleFragment.class));

FragmentStatePagerItemAdapter adapter = new FragmentStatePagerItemAdapter(
getSupportFragmentManager(), pages);

viewPager.setAdapter(adapter);
viewPager.setCurrentItem(0);
viewPagerTab.setViewPager(viewPager);
}

@Override
public View createTabView(ViewGroup container, int position, PagerAdapter adapter) {
LayoutInflater inflater = LayoutInflater.from(container.getContext());
View tab = inflater.inflate(R.layout.custom_tab_icon_and_notification_mark, container, false);
TextView txtTab=(TextView)tab.findViewById(R.id.txtTitle);
switch (position){
case 0:txtTab.setText("Test1");break;
case 1:txtTab.setText("Test2");break;
default:throw new IllegalStateException("Invalid pos - "+ position);
}
return tab;
}

我的 SampleFragment.java 如下所示,其中我对数据进行了一些服务器请求并更新了 listview 适配器。

SampleFragment.java

List<Items> lstItems=new ArrayList<>();
static ItemListAdapter mAdapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view= inflater.inflate(R.layout.fragment_sample, container, false);
ListView lstviewItems = (ListView) view.findViewById(R.id.lstItems);
int position = FragmentPagerItem.getPosition(getArguments());
View emptyView=view.findViewById(R.id.emptyList);
lstviewItems.setEmptyView(emptyView);
mAdapter = new ItemsListAdapter(getActivity(),lstItems);
lstviewItems.setAdapter(mAdapter);
switch (position){
case 0:
//JsonObjectRequest
loadItems();
break;
case 1:
//sort the loaded items
break;
}
return view;
}

private void loadItems(){
try {
JsonArrayRequest request = new JsonArrayRequest(Request.Method.GET,url, null,
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
lstItems.clear();
for (int i = 0; i < response.length(); i++) {
//Add item to lstItems
}
mAdapter.notifyDataSetChanged();
}
}
});
testApp.getInstance().addToRequestQueue(request);
} catch (Exception ex) {
ex.printStackTrace();
}
}

但即使在 mAdapter.notifyDataSetChanged() 之后,当前 viewPager tab 中的 listviewTest1 tab 是没有得到刷新。而当我导航到 Test2 选项卡时,我可以在 ListView 中看到更改,其中数据已正确加载。下面是 2 个不同选项卡的屏幕截图。

Tabs

我也搜索过这个问题并找到了其他对我不起作用的解决方案。解决方案之一是,在 ItemsAdapter 中添加刷新方法,如下所示:

public void refresh(List<Items> items)
{
this.items = items;
notifyDataSetChanged();
}

我使用了 mAdapter.refresh(lstItems); 而不是 mAdapter.notifyDataSetChanged()。但不幸的是它也没有用。我怎么可能克服这个。如果我必须为此添加更多详细信息,请告诉我。

最佳答案

我认为你的问题出在这里:

mAdapter = new ItemsListAdapter(getActivity(),lstItems);

您创建一个新的 ItemsListAdapter 实例并将其绑定(bind)到 ListView

lstviewItems.setAdapter(mAdapter);

问题是这个适配器是static。因此,如果您创建一个新实例,您将销毁旧适配器,并且另一个选项卡的 ListView 不再具有更新数据的适配器。

编辑:

我建议将数据加载到一个中心位置。将响应(您的数据对象)添加到管理器类。然后在使用此数据的每个 View 上实现回调(比方说 JsonDataChangedCallback)。使用 Manager.getInstance().registerCallback() 将实现回调的类注册到管理器。然后,每次您的数据更改时,在您的管理器中调用 updateCallbacks(),所有 View 都会更新。这就是在我的应用程序中实现该过程的方式,并且它有效。

示例代码:

public class CDMMovieManager {
private CDMMovieManager() {
m_Movies = new ArrayList<>();
m_MovieChangedCallbacks = new ArrayList<>();
}

public static synchronized CDMMovieManager getInstance() {
if(ms_Instance == null)
ms_Instance = new CDMMovieManager();

return ms_Instance;
}

public void addMovie(CDMMovie p_Movie) {
m_Movies.add(p_Movie);
notifyCallbacks();
}

/**
* Registers a movie changed callback
*
* @param p_MovieChangedCallback the callback to register
*/
public void registerMovieChangedCallback(IDMMovieChangedCallback p_MovieChangedCallback) {
m_MovieChangedCallbacks.add(p_MovieChangedCallback);
}

/**
* Removes a movie changed callback
*
* @param p_MovieChangedCallback the callback to remove
*/
public void removeMovieChangedCallback(IDMMovieChangedCallback p_MovieChangedCallback) {
m_MovieChangedCallbacks.remove(p_MovieChangedCallback);
}

private void notifyCallbacks() {
for(IDMMovieChangedCallback l_MovieChangedCallback : m_MovieChangedCallbacks) {
l_MovieChangedCallback.onMoviesChanged();
}
}
}

以及实现类:

public class CDMBasicMovieFragment extends Fragment implements IDMMovieChangedCallback {

//...
@Override
public void onMoviesChanged() {
m_Adapter.notifyDataSetChanged();
}
}

关于android - 无法刷新不同选项卡下使用的相同 fragment 中的 ListView 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41449017/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com