Java 关于负载数据的表格布局问题
我在android上没有经验,我实现了Tablayout的代码,其中我有六个选项卡,每个选项卡都有一个ListView,其中数据将来自服务器。我正在使用截击响应获取数据,但所有选项卡的数据都是在打开时出现的。我需要的数据应该来刷卡,当用户将去之前的刷卡数据不应再次加载。所以,请指导我该怎么做? 下面是我的片段代码Java 关于负载数据的表格布局问题,java,android,android-tablayout,Java,Android,Android Tablayout,我在android上没有经验,我实现了Tablayout的代码,其中我有六个选项卡,每个选项卡都有一个ListView,其中数据将来自服务器。我正在使用截击响应获取数据,但所有选项卡的数据都是在打开时出现的。我需要的数据应该来刷卡,当用户将去之前的刷卡数据不应再次加载。所以,请指导我该怎么做? 下面是我的片段代码 private void setupViewPager(ViewPager viewPager) { int numberOfPages=7; ViewPager
private void setupViewPager(ViewPager viewPager) {
int numberOfPages=7;
ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager());
adapter.addFragment(new Matches_Tab(), "Matches");
adapter.addFragment(new NewMatches_Tab(), "New matches");
adapter.addFragment(new Similar_Matchs_Tab(), "Similar Matches");
adapter.addFragment(new ShortlistTab(), "ShortListed");
adapter.addFragment(new Viewed_My_Profile(), "View My Profile");
adapter.addFragment(new ShortListedMeTab(), "ShortListed Me");
adapter.addFragment(new Photo_Request_Received(), "Photo Request Received");
viewPager.setOffscreenPageLimit(numberOfPages);
viewPager.setAdapter(adapter);
}
片段类
public class Matches_Tab extends Fragment{
// Session Manager Class
SessionManager session;
String email;
public String JSON_URL;
private ListView listView;
public Matches_Tab() {}
private static Matches_Tab instance;
public static synchronized Matches_Tab getInstance(Bundle data){
if (instance == null) {
instance = new Matches_Tab();
instance.setArguments(data);
}
return instance;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TypefaceUtil.overrideFont(getContext(), "SERIF", "Peddana-Regular.ttf");
// Session class instance
session = new SessionManager(getActivity());
// get user data from session
HashMap<String, String> user = session.getUserDetails();
email = user.get(SessionManager.KEY_EMAIL);
JSON_URL = "https://www.maangal.com/maangal_mobile/matches.php?matri_id="+email;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// Inflate the layout for this fragment
View view= inflater.inflate(R.layout.matches_tab, container, false);
// ProgressBar progressbar = (ProgressBar) view.findViewById(R.id.progressBar);
listView = (ListView) view.findViewById(R.id.listView);
sendRequest();
//getArguments();
return view;
}
private void sendRequest(){
final ProgressDialog loading = ProgressDialog.show(getActivity(),"Loading Data", "Please wait...",false,false);
StringRequest stringRequest = new StringRequest(Request.Method.POST,JSON_URL,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
loading.dismiss();
showJSON(response);
Log.e("Broder Matches s----->",response);
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(getContext(),error.getMessage(), Toast.LENGTH_LONG).show();
}
});
int MY_SOCKET_TIMEOUT_MS = 30000;
stringRequest.setRetryPolicy(new DefaultRetryPolicy(
MY_SOCKET_TIMEOUT_MS, DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
RequestQueue requestQueue = Volley.newRequestQueue(getContext());
requestQueue.add(stringRequest);
}
protected void showJSON(String json){
ParseJSON pj = new ParseJSON(json);
pj.parseJSON();
Profile_Match_custom_List cl = new Profile_Match_custom_List(getActivity(), ParseJSON.ids,ParseJSON.ages, ParseJSON.heights, ParseJSON.communities,ParseJSON.castes,ParseJSON.educations,ParseJSON.occupations,ParseJSON.incomes,ParseJSON.pics,ParseJSON.locations,ParseJSON.shortlist,ParseJSON.expressinterest);
listView.setAdapter(cl);
}
}
公共类匹配\u选项卡扩展片段{
//会话管理器类
会话管理器会话;
字符串电子邮件;
公共字符串JSON_URL;
私有列表视图列表视图;
公共匹配项_Tab(){}
私有静态匹配\u选项卡实例;
公共静态同步匹配\u选项卡getInstance(捆绑数据){
if(实例==null){
实例=新匹配项_Tab();
setArguments(数据);
}
返回实例;
}
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
TypefaceUtil.overrideFont(getContext(),“SERIF”,“Peddana Regular.ttf”);
//会话类实例
session=newsessionmanager(getActivity());
//从会话获取用户数据
HashMap user=session.getUserDetails();
email=user.get(SessionManager.KEY_email);
JSON_URL=”https://www.maangal.com/maangal_mobile/matches.php?matri_id=“+电子邮件;
}
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态){
//为该碎片膨胀布局
视图=充气机。充气(R.layout.matches\u选项卡,容器,false);
//ProgressBar=(ProgressBar)view.findViewById(R.id.ProgressBar);
listView=(listView)view.findViewById(R.id.listView);
sendRequest();
//getArguments();
返回视图;
}
私有void sendRequest(){
final ProgressDialog loading=ProgressDialog.show(getActivity(),“正在加载数据”,“请稍候…”,false,false);
StringRequest StringRequest=新的StringRequest(Request.Method.POST、JSON\uURL、,
新的Response.Listener(){
@凌驾
公共void onResponse(字符串响应){
loading.dispose();
showJSON(响应);
Log.e(“Broder匹配s---------->”,响应);
}
},
新的Response.ErrorListener(){
@凌驾
公共无效onErrorResponse(截击错误){
Toast.makeText(getContext(),error.getMessage(),Toast.LENGTH_LONG.show();
}
});
int MY_SOCKET_TIMEOUT_MS=30000;
stringRequest.setRetryPolicy(新的DefaultRetryPolicy(
MY_SOCKET_TIMEOUT_MS,DefaultRetryPolicy.DEFAULT_MAX_RETRIES,
DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
RequestQueue RequestQueue=Volley.newRequestQueue(getContext());
添加(stringRequest);
}
受保护的void showJSON(字符串json){
ParseJSON pj=新的ParseJSON(json);
pj.parseJSON();
Profile_Match_custom_List cl=new Profile_Match_custom_List(getActivity()、ParseJSON.ids、ParseJSON.ages、ParseJSON.heights、ParseJSON.communities、ParseJSON.castes、ParseJSON.educations、ParseJSON.income、ParseJSON.pics、ParseJSON.locations、ParseJSON.shortlist、ParseJSON.expressinterest);
setAdapter(cl);
}
}
您可以扩展BaseFragment
public abstract class BaseFragment extends Fragment {
protected Activity mActivity;
/**
* isFragmentVisible
*/
private boolean isFragmentVisible;
/**
* View in onCreateView is ok
*/
private boolean isPrepared;
/**
* isFirstLoad
*/
private boolean isFirstLoad = true;
/**
* isForceLoad
*/
private boolean isForceLoad = false;
/**
* onAttach Activity
*
* @param context
*/
@Override
public void onAttach(Context context) {
super.onAttach(context);
this.mActivity = (Activity) context;
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container
, Bundle savedInstanceState) {
isFirstLoad = true;
View view = LayoutInflater.from(mActivity)
.inflate(getLayoutId(), container, false);
initView(view, savedInstanceState);
isPrepared = true;
lazyLoad();
return view;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
@Override
public void onDestroy() {
super.onDestroy();
}
/**
* want to load data ,need set in onCreateView
* isPrepared = true;
*/
protected void lazyLoad() {
if (isPrepared() && isFragmentVisible()) {
if (isForceLoad || isFirstLoad()) {
isForceLoad = false;
isFirstLoad = false;
initData();
}
}
}
public boolean isPrepared() {
return isPrepared;
}
public boolean isFirstLoad() {
return isFirstLoad;
}
public boolean isFragmentVisible() {
return isFragmentVisible;
}
/**
* use with viewpager
*
* @param isVisibleToUser is visible for user
*/
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (getUserVisibleHint()) {
onVisible();
} else {
onInvisible();
}
}
/**
* if you use show hide to set fragment ,do this
*
* @param hidden hidden True if the fragment is now hidden, false if it is not
* visible.
*/
@Override
public void onHiddenChanged(boolean hidden) {
super.onHiddenChanged(hidden);
if (!hidden) {
onVisible();
} else {
onInvisible();
}
}
protected void onVisible() {
isFragmentVisible = true;
lazyLoad();
}
protected void onInvisible() {
isFragmentVisible = false;
}
/**
* set force load
*/
public void setForceLoad(boolean forceLoad) {
this.isForceLoad = forceLoad;
}
/**
* getLayoutId ,like : R.layout.fragment
*
* @return
*/
protected abstract int getLayoutId();
/**
* initView
*
* @param view
* @param savedInstanceState
*/
protected abstract void initView(View view, Bundle savedInstanceState);
/**
* load data here
*/
protected abstract void initData();
}
然后在initData
方法中加载数据
@Override
protected void initData() {
// request here
}
注意
- 主要方法是
和setUserVisibleHint
onHiddenChanged
- 添加一些布尔标志以确定数据是否已加载、视图是否已创建等
viewPager.addOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
// Add your logic
}
});
如果您使用的是
ViewPager
,并且在一个API调用中获取所有选项卡的数据,那么我建议您将ViewPager的偏移量设置为选项卡的数量
ViewPager vp = ...;
vp.setOffscreenPageLimit(numberOfTabsHERE);
注意:只有在没有太多数据显示的情况下才使用此选项,否则您可能会得到一个memoryoutofeception
如果你有很多标签和数据。对片段使用Singleton
模式是一个很好的选择
public class MyFragment extends Fragment {
private static MyFragment instance;
public static synchronized MyFragment getInstance(Bundle data // if any){
if (instance == null) {
instance = new MyFragment();
instance.setArguments(data);
}
return instance;
}
}
...
onCreateView{.... getArguments()}
阿特酸盐溶液
主要问题是什么。。。。?顺便说一句,这里是TabLayout中选项卡布局教程的链接,您正在使用片段。在片段的setUserVisibleHInt()方法上获取数据,并设置任何标志以检查数据是否加载。您是否使用Viewpager加载所有片段?是的,我正在使用Viewpager加载所有选项卡@SamirYou可以检查我的答案。请检查我的更新代码,并告诉我应该将代码放在哪里。这是我在此处建议的逻辑。您可以在要添加带有视图寻呼机的tablayout的活动上实现此方法。View pager有一个方法addonPageChangeListener,当在viewpager中更改页面时调用该方法。您可以使用接口创建一个片段回调。我将在此处放置什么逻辑每当您在viewpager中滑动视图时,此事件将触发。因此,您可以在片段中为您的逻辑调用特定的方法,而不是
adapter.addFragment(newmatches_Tab(),“Matches”)现在使用,adapter.addFragment(Matches_Tab.getInstance(data.getMatchesData),“Matches”)代码>这将使用相关数据初始化所有片段,并且不会重新初始化片段。您所要做的就是在Fragment.onCreateView()中显示数据。
adapter.addFragment(Matches_Tab.getInstance(data.getmatches)上的数据ata),“匹配”))当我使用它时。有一个错误。无法解析符号数据。并检查我编辑的codeData是否是从服务器获得响应后使用的模型类。这将发生什么?假设您在tab1
上,并移动到tab2
上,则要执行tab2
基本调用上所需的操作
tabLayout.setupWithViewPager(mViewPager);
tabLayout.setOnTabSelectedListener(
new TabLayout.ViewPagerOnTabSelectedListener(mViewPager) {
@Override
public void onTabSelected(TabLayout.Tab tab) {
super.onTabSelected(tab);
//put your Logic here
}
});