0

我在活动中有片段视图寻呼机,它在之前创建了一些输入数字的页面。在每个片段中,我有回收者视图,每次用户移动到相关页面时都需要更新。在每个片段的resume()上我都有来自主要活动的数据获取者。在viewPager的片段中,recyclerView适配器notifyDataSetChanged不能在第一时间工作

我正在经历的是当我下一页第一次没有更新时,但是如果在一些页面移动之后,我会回到它,它会被更新,并使用相同的resume()代码。

更新数据后,我尝试了一些延迟,但没有帮助。因此,如果在更新数据之前,我会检查每个页面,它会按照我的计划工作,但如果页面以前没有创建(由于寻呼机适配器),但我仍然使用相同的代码进行更新,但它不起作用。

我很乐意提供一些帮助,已经放置了2天。

主要活动:

package com.slavafleer.tipcalculator02; 

import android.content.Intent; 
import android.os.Bundle; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.view.ViewPager; 
import android.support.v7.app.AppCompatActivity; 
import android.support.v7.widget.LinearLayoutManager; 
import android.support.v7.widget.RecyclerView; 
import android.util.Log; 

import com.slavafleer.tipcalculator02.recycler.PageHeaderAdapter; 

import java.util.ArrayList; 

public class ManualModeActivity extends AppCompatActivity implements 
     PageHeaderAdapter.Callbacks, DinerFragment.Callbacks { 

    private int mDinersAmount; 
    private ViewPager mViewPagerDiners; 
    private PageHeaderAdapter mHeaderAdapter; 
    private DinersPagerAdapter mDinersPagerAdapter; 
    private ArrayList<Order> mOrders; 

    public ArrayList<Order> getOrders() { 
     return mOrders; 
    } 

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

     mOrders = new ArrayList<>(); 

     // Get diners amount from previous activity 
     Intent intent = getIntent(); 
     mDinersAmount = intent.getIntExtra(Constants.KEY_DINNERS_AMOUNT, 1); 

     // Initialise PageHeader Recycler 
     mHeaderAdapter = new PageHeaderAdapter(this, mDinersAmount, this); 
     final RecyclerView recyclerPageHeader = (RecyclerView) findViewById(R.id.recyclerViewPagerHeader); 
     final LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false); 
     recyclerPageHeader.setLayoutManager(linearLayoutManager); 
     recyclerPageHeader.setAdapter(mHeaderAdapter); 

     // Initialise ViewPager 
     mViewPagerDiners = (ViewPager) findViewById(R.id.viewPagerDiners); 
     FragmentManager fragmentManager = getSupportFragmentManager(); 
     mDinersPagerAdapter = new DinersPagerAdapter(fragmentManager, mDinersAmount); 
     mViewPagerDiners.setAdapter(mDinersPagerAdapter); 

     // ViewPager Listener - synchronise with headers recycler 
     mViewPagerDiners.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { 

      @Override 
      public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 

      } 

      // Gets position for selected page 
      @Override 
      public void onPageSelected(int position) { 

       mHeaderAdapter.selectItem(position); 
       linearLayoutManager.smoothScrollToPosition(recyclerPageHeader, null,position); 
      } 

      @Override 
      public void onPageScrollStateChanged(int state) { 

      } 
     }); 
    } 

    // HeaderPage Adapter Callbacks 
    // Scroll ViewPager by clicked Header 
    @Override 
    public void onItemClick(int position) { 
     mViewPagerDiners.setCurrentItem(position, true); 
    } 

    // DinerFragment.OrderDialog.Callbacks 
    // Send data to PagerAdapter that would sent to each fragment 
    @Override 
    public void onDialogAddClick(Order order) { 

     Log.d("test", "onDialogAddClick"); 

     mOrders.add(order); 
     mDinersPagerAdapter.updateOrders(); 
    } 
} 

PagerAdapter

package com.slavafleer.tipcalculator02; 

import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 

import java.util.ArrayList; 

/** 
* PagerAdapter for ManualModeActivity ViewPager 
*/ 
public class DinersPagerAdapter extends FragmentPagerAdapter { 

    private int mDinersAmount; 
    private ArrayList<DinerFragment> mDinerFragments; 

    public DinersPagerAdapter(FragmentManager fm, int dinersAmount) { 
     super(fm); 

     mDinersAmount = dinersAmount; 
     mDinerFragments = new ArrayList<>(); 
    } 

    @Override 
    public Fragment getItem(int position) { 

     // Insert diners amount to fragment 
     Bundle bundle = new Bundle(); 
     bundle.putInt(Constants.KEY_DINNERS_AMOUNT, mDinersAmount); 
     bundle.putInt(Constants.KEY_CURRENT_PAGE, position); 
     DinerFragment dinerFragment = new DinerFragment(); 
     dinerFragment.setArguments(bundle); 
     mDinerFragments.add(dinerFragment); // save fragments references 

     return dinerFragment; 
    } 

    // Diners amount + All 
    @Override 
    public int getCount() { 
     return mDinersAmount + 1; 
    } 

    // Update order list in each fragment of view pager 
    public void updateOrders() { 

     for(DinerFragment dinerFragment : mDinerFragments) { 
      dinerFragment.onResume(); 
     } 
    } 
} 

片段

package com.slavafleer.tipcalculator02; 


import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.support.v7.widget.LinearLayoutManager; 
import android.support.v7.widget.RecyclerView; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ImageView; 

import com.slavafleer.tipcalculator02.recycler.OrdersAdapter; 

import java.util.ArrayList; 


/** 
* Diner Fragment Class 
*/ 
public class DinerFragment extends Fragment implements OrderDialog.Callbacks { 

    private ArrayList<Order> mOrders = new ArrayList<>(); 
    private RecyclerView mRecyclerViewOrders; 
    private ImageView mImageViewAddOrderButton; 
    private int mDinersAmount; 
    private OrdersAdapter mOrdersAdapter; 
    private int mDinerId; 
    private Callbacks mCallbacks; 

    public DinerFragment() { 
     // Required empty public constructor 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     Log.d("test", "onCreateView"); 

     // Inflate the layout for this fragment 
     View view = inflater.inflate(R.layout.fragment_diner, container, false); 

     mCallbacks = (Callbacks) inflater.getContext(); 

     // Get Diners Amount 
     final Bundle bundle = getArguments(); 
     if(bundle != null) { 
      mDinersAmount = bundle.getInt(Constants.KEY_DINNERS_AMOUNT); 
      mDinerId = bundle.getInt(Constants.KEY_CURRENT_PAGE); 

      Log.d("test", "onCreateView " + mDinerId); 
     } 

     mRecyclerViewOrders = (RecyclerView) view.findViewById(R.id.recyclerViewOrders); 

     mOrdersAdapter = new OrdersAdapter(getActivity(), mOrders); 
     LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity()); 
     mRecyclerViewOrders.setLayoutManager(linearLayoutManager); 
     mRecyclerViewOrders.setAdapter(mOrdersAdapter); 

     // Due to the bug, we could use just listener and not OnClick in Fragment 
     mImageViewAddOrderButton = (ImageView) view.findViewById(R.id.imageViewAddButton); 
     mImageViewAddOrderButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       ArrayList<Integer> currentPage = new ArrayList<>(); 
       currentPage.add(mDinerId); 
       OrderDialog orderDialog = new OrderDialog(getActivity(), 
         mDinersAmount, currentPage, DinerFragment.this); 
       orderDialog.show(); 
      } 
     }); 

     return view; 
    } 

    @Override 
    public void onResume() { 
     super.onResume(); 

     Log.d("test", "onResume " + mDinerId); 

     ManualModeActivity activity = (ManualModeActivity) getActivity(); 
     mOrders = activity.getOrders(); 

     for(Order order : mOrders) { 
      Log.d("test", order.getPrice() + ""); 
     } 

     int size = mOrders.size(); 
     mOrdersAdapter.notifyDataSetChanged(); 
     mRecyclerViewOrders.smoothScrollToPosition(size); 
    } 

    // Blank OrderDialog.Callbacks 
    // used due to Implements for creation OrderDialog 
    @Override 
    public void onDialogAddClick(Order order) { 

     mCallbacks.onDialogAddClick(order); 
    } 

    public interface Callbacks { 

     void onDialogAddClick(Order order); 
    } 
} 

回答

1

代替使用的onResume使用使用onPageSelected方法和所使用的传递片段为上下文来调用更新方法的在片段中。

+0

让我知道如果你得到它的工作,或者如果你需要更多的帮助! – fsebek

+0

抱歉,不明白onPageSelected需要做什么。你能否为此付出代价?非常感谢。 – Slava

0

最后,我所做的是在重新创建适配器时替换mOrdersAdapter.notifyDataSetChanged()。我知道这不是一个非常聪明的解决方案,但它在视觉上确实符合我的需要。

我不会将它标记为答案,因为我仍然想知道它为什么会像我之前写过的那样。

再次感谢。

//  mOrdersAdapter.notifyDataSetChanged(); 
     mOrdersAdapter = new OrdersAdapter(getActivity(), mOrders); 
     mRecyclerViewOrders.setAdapter(mOrdersAdapter); 
0

ViewPager适配器同时创建2个片段。例如当你在页面0上时,它也创建页面1(页面1的生命周期:OnCreate-> OnCreateView-> OnResume-> OnPause-> OnResume)。当你滑动页面1时,只有被调用的方法是SetMenuVisibility 。因此,为了对第1页更新数据调用setMenuVisibilty片段内:

@Override 
public void setMenuVisibility(boolean menuVisible) { 
    super.setMenuVisibility(menuVisible); 
    if(menuVisible && isResumed()){ 
      settingAdapter(); 
    } 
} 

所以这里settingAdapter里面我重新加载数据。到目前为止,这是我在viewpager中用回看片段制作片段的最佳技巧。但仍然有几个毫秒的延迟填充片段与新的数据))) 我希望这会帮助你

相关问题