I have already asked a question about my issue, but I didn't get any proper solution, so I am adding the whole details here.
In my Activity, there is TabLayout and viewpager. On creating the activity, it fetch data from server and from that data it adds tabs dynamically. I am using single fragment for each tabs in a way that data corresponding to each tab will be populated in the list view in the fragment which will be shown in the view pager below tab layout.When directly clicking on the tab layout titles, data changes correctly. But when swiping the viewpager, it works, but for a small period of time after the tab title has changed ,the data shown in the list view will be of previous tab title.It only lasts for a fraction of second, but it creates a bad user experience.
My Activity
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_browse_tab);
sharedPreferences = this.getSharedPreferences(GlobalDeclarations.MY_PREFERENCE, Context.MODE_PRIVATE);
user_type = sharedPreferences.getString("user_type",null);
ab = getSupportActionBar();
ab.setHomeButtonEnabled(true);
ab.setDisplayHomeAsUpEnabled(true);
ab.setBackgroundDrawable(new ColorDrawable(Color.parseColor("#009FE3")));
ab.setTitle("Plans");
cd = new ConnectionDetector(this);
Intent intent = getIntent();
key_circle = intent.getStringExtra("key_circle");
value_circle = intent.getStringExtra("value_circle");
key_operator = intent.getStringExtra("key_operator");
value_operator = intent.getStringExtra("value_operator");
isMobile = intent.getBooleanExtra("isMobile", false);
if (isMobile) {
spinnerArray = getResources().getStringArray(R.array.recharge_plan_types);
plan_type = "1";
}
else {
spinnerArray = getResources().getStringArray(R.array.dth_plan_types);
plan_type = "1";
}
loadData();
mViewPager= (ViewPager)findViewById(R.id.viewpager);
mViewPager.setOffscreenPageLimit(1);
mTabLayout= (TabLayout)findViewById(R.id.tabs2);
mTabLayout.setSelectedTabIndicatorColor(Color.parseColor("#FF0000"));
mTabLayout.setSelectedTabIndicatorHeight((int) (5 * getResources().getDisplayMetrics().density));
mTabLayout.setTabTextColors(Color.parseColor("#727272"), Color.parseColor("#FF0000"));
mViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(mTabLayout));
mTabLayout.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(TabLayout.Tab tab) {
planList.clear();
mViewPager.setCurrentItem(tab.getPosition());
numTab = tab.getPosition();
plan_type = String.valueOf(numTab+1);
BrowsePlanModel model;
key = mylist.get(numTab);
try {
jsonArray = jsonObject.getJSONArray(key);
for (int i = 0; i < jsonArray.length(); i++) {
jsonObject2 = jsonArray.getJSONObject(i);
model = new BrowsePlanModel();
model.setTalkTime(jsonObject2.optString("talktime"));
model.setValidity(jsonObject2.optString("validity"));
model.setAmount(jsonObject2.optString("amount"));
model.setDescription(jsonObject2.optString("description"));
planList.add(model);
}
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
});
}
public ArrayList<BrowsePlanModel> getPlans(){
return planList;
}
@Override
public void onFragmentInteraction(Uri uri) {
}
private void setupViewPager(ViewPager mViewPager,String name) {
adapter.addFragment(new PlasFragment(), name);
mTabLayout.setSelectedTabIndicatorColor(Color.parseColor("#ff0000"));
}
public String getKey_circle() {
return key_circle;
}
public String getValue_circle(){
return value_circle;
}
public String getKey_operator() {
return key_operator;
}
public String getValue_operator(){
return value_operator;
}
public boolean getIsMobile(){
return isMobile;
}
public String getPlan(){
return plan_type;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
Intent intent = new Intent();
setResult(RESULT_OK, intent);
finish();
default:
return super.onOptionsItemSelected(item);
}
}
class ViewPagerAdapter extends FragmentStatePagerAdapter {
private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();
public ViewPagerAdapter(FragmentManager manager) {
super(manager);
}
@Override
public Fragment getItem(int position) {
return new PlasFragment().newInstance(position);
}
@Override
public int getItemPosition(Object object) {
return POSITION_NONE;
}
@Override
public int getCount() {
return mFragmentList.size();
}
public void addFragment(Fragment fragment, String title) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
}
@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitleList.get(position);
}
}
private void loadData() {
String url = null;
HashMap<String, String> data = new HashMap<>();
data.put("plan", plan_type);
data.put("operator", key_operator);
data.put("circle", key_circle);
if(cd.isConnectingToInternet()) {
if (isMobile) {
url = GlobalDeclarations.URL1;
} else {
url = GlobalDeclarations.URL2;
}
new HTTPRequest(BrowseTabActivity.this, data, null, HTTPRequest.METHOD.GET, BrowseTabActivity.this).execute(url);
}
else{
Toast.makeText(this, "No Internet Connection", Toast.LENGTH_SHORT).show();
}
}
@Override
public void onConnectionStarted() {
}
@Override
public void onConnectionFailed() {
}
@Override
public void onCompleted(JSONObject resultData) {
planList = new ArrayList<>();
mylist = new ArrayList<String>();
BrowsePlanModel model;
if (resultData.has("status")) {
String status = resultData.optString("status");
if (status.equalsIgnoreCase("failed")) {
Toast.makeText(this, resultData.optString("status"), Toast.LENGTH_SHORT).show();
}
else if (status.equalsIgnoreCase("success")) {
try {
jsonObject = resultData.getJSONObject("data");
planList.clear();
adapter = new ViewPagerAdapter(getSupportFragmentManager());
for(Iterator<String> iter = jsonObject.keys();iter.hasNext();) {
key = iter.next();
mylist.add(key);
mTabLayout.addTab(mTabLayout.newTab().setText(key));
mTabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
setupViewPager(mViewPager,key);
}
mViewPager.setAdapter(adapter);
} catch (Exception e) {
e.printStackTrace();
planList.clear();
}
}
}
}
}
My Fragment used for populating list view
public class PlasFragment extends Fragment implements HTTPCallback {
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
private String mParam1;
private String mParam2;
private Spinner spinner_plan_type;
private ListView listView;
private TextView textToast;
private String key_circle;
private String value_circle;
private String key_operator;
private String value_operator;
private String plan_type;
android.support.v7.app.ActionBar ab;
private boolean isMobile;
private SharedPreferences sharedPreferences;
private String userId;
private String apiKey;
private ArrayList<BrowsePlanModel> planList;
private BrowsePlanAdapter adapter ;
private String[] spinnerArray;
ProgressBar prgs;
private BroadcastReceiver mRegistrationBroadcastReceiver;
private android.support.v4.app.NavUtils NavUtils;
MediaPlayer mp;
String table_id;
Integer selected_radio_button;
String wallet_request,type;
JSONObject jsonResult;
ConnectionDetector cd;
View rootview;
private OnFragmentInteractionListener mListener;
public PlasFragment() {
}
public static PlasFragment newInstance(String param1, String param2) {
PlasFragment fragment = new PlasFragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
rootview = inflater.inflate(R.layout.fragment_plas, container, false);
cd = new ConnectionDetector(getContext());
prgs = (ProgressBar)rootview.findViewById(R.id.progressBar1);
listView = (ListView)rootview.findViewById(R.id.list_plan_type);
textToast = (TextView)rootview.findViewById(R.id.text_toast);
key_circle = ((BrowseTabActivity)getActivity()).getKey_circle();
value_circle = ((BrowseTabActivity)getActivity()).getValue_circle();
key_operator = ((BrowseTabActivity)getActivity()).getKey_operator();
value_operator =((BrowseTabActivity)getActivity()).getValue_operator();
isMobile = ((BrowseTabActivity)getActivity()).getIsMobile();
plan_type = ((BrowseTabActivity)getActivity()).getPlan();
loadData();
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
BrowsePlanModel browsePlan = (BrowsePlanModel) parent.getItemAtPosition(position);
Intent intent = new Intent();
intent.putExtra("amount", browsePlan.getAmount());
getActivity().setResult(Activity.RESULT_OK,intent);
getActivity().finish();
}
});
return rootview;
}
public void onButtonPressed(Uri uri) {
if (mListener != null) {
mListener.onFragmentInteraction(uri);
}
}
public interface OnFragmentInteractionListener {
void onFragmentInteraction(Uri uri);
}
private void loadData() {
BrowsePlanModel browsePlan;
textToast.setVisibility(View.GONE);
listView.setVisibility(View.VISIBLE);
planList = ((BrowseTabActivity)getActivity()).getPlans();
setAdapter();
}
@Override
public void onConnectionStarted() {
}
@Override
public void onConnectionFailed() {
}
@Override
public void onCompleted(JSONObject resultData) {
planList = new ArrayList<>();
JSONArray jsonArray;
JSONObject jsonObject;
BrowsePlanModel model;
if (resultData.has("status")) {
String status = resultData.optString("status");
if (status.equalsIgnoreCase("failed")) {
prgs.setVisibility(View.GONE);
textToast.setVisibility(View.VISIBLE);
listView.setVisibility(View.GONE);
Toast.makeText(getContext(), resultData.optString("status"), Toast.LENGTH_SHORT).show();
}
else if (status.equalsIgnoreCase("success")) {
try {
jsonArray = resultData.getJSONArray("data");
if (jsonArray.length() > 0 && jsonArray != null) {
for (int i = 0; i < jsonArray.length(); i++) {
jsonObject = jsonArray.getJSONObject(i);
model = new BrowsePlanModel();
model.setTalkTime(jsonObject.optString("talktime"));
model.setValidity(jsonObject.optString("validity"));
model.setAmount(jsonObject.optString("amount"));
model.setDescription(jsonObject.optString("description"));
planList.add(model);
}
textToast.setVisibility(View.GONE);
listView.setVisibility(View.VISIBLE);
setAdapter();
} else {
planList.clear();
setAdapter();
textToast.setVisibility(View.VISIBLE);
listView.setVisibility(View.GONE);
}
prgs.setVisibility(View.GONE);
} catch (Exception e) {
e.printStackTrace();
planList.clear();
setAdapter();
textToast.setVisibility(View.VISIBLE);
listView.setVisibility(View.GONE);
}
}
}
}
private void setAdapter() {
try {
adapter = new BrowsePlanAdapter(getContext(), planList);
listView.setAdapter(adapter);
Collections.sort(planList);
prgs.setVisibility(View.GONE);
}catch (Exception e){
}
}
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (isVisibleToUser) {
getFragmentManager().beginTransaction().detach(this).attach(this).commit();
}
}
}
When changing tabs by swiping on the viewpager,this error occure, i.e, first tab consists of top up data, and second tab of full talk time. but when swiping to change the tab ,data of previous tab is shown for a small duration of time. But this error is not when I change tabs by selecting tab directly, it happens only when swiping on viewpager. I have stuck with this issue for a long time, any one please suggest a solution.
来源:https://stackoverflow.com/questions/53801795/updating-data-on-viewpager-change-and-tablayout-click-creates-conflicts