Java 关于负载数据的表格布局问题

Java 关于负载数据的表格布局问题,java,android,android-tablayout,Java,Android,Android Tablayout,我在android上没有经验,我实现了Tablayout的代码,其中我有六个选项卡,每个选项卡都有一个ListView,其中数据将来自服务器。我正在使用截击响应获取数据,但所有选项卡的数据都是在打开时出现的。我需要的数据应该来刷卡,当用户将去之前的刷卡数据不应再次加载。所以,请指导我该怎么做? 下面是我的片段代码 private void setupViewPager(ViewPager viewPager) { int numberOfPages=7; ViewPager

我在android上没有经验,我实现了Tablayout的代码,其中我有六个选项卡,每个选项卡都有一个ListView,其中数据将来自服务器。我正在使用截击响应获取数据,但所有选项卡的数据都是在打开时出现的。我需要的数据应该来刷卡,当用户将去之前的刷卡数据不应再次加载。所以,请指导我该怎么做? 下面是我的片段代码

   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.OnPageChangeListener获取页面可见时的回调。 检查下面的代码

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
    }
});