0

所以這裏是我的問題,我只有一個活動從我啓動我的viewpager片段,在我的viewpager我有4個片段包含recyclerViews。每一個片段都包含網上數據填充的項目,當我點擊進入一個WebView片段時,但是當我點擊後退時,我失去了我的poisiton,導致它重新創建整個活動。RecyclerView通過活動得到的片段

我不知道如何重新創建活動並恢復舊的位置,或重新創建它,但不能更改項目的位置並恢復舊的位置。這是我的代碼。我應該放哪些東西?!一些幫助將會非常好。 謝謝!

我的動態類:

public class LauncherActivity extends AppCompatActivity implements ListFragment.OnNewSelectedInterface{ 

    public static final String VIEWPAGER_FRAGMENT = "view_pager"; 
    private ImageView mImageView; 

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

     RelativeLayout relativeLayout = (RelativeLayout) findViewById(R.id.activity_launcher); 
     mImageView = (ImageView) findViewById(R.id.logoImageView); 

     mImageView.startAnimation(AnimationUtils.loadAnimation(this, R.anim.rotate_indefinitely)); 

     if(!isNetworkAvailable()){ 

      alertUserAboutError(); 

     } else { 
      relativeLayout.postDelayed(new Runnable() { 
       @Override 
       public void run() { 

        ViewPagerFragment savedFragment = (ViewPagerFragment) 
          getSupportFragmentManager().findFragmentByTag(VIEWPAGER_FRAGMENT); 

        if(savedFragment == null) { 
         ViewPagerFragment viewPagerFragment = new ViewPagerFragment(); 
         FragmentManager fragmentManager = getSupportFragmentManager(); 
         FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
         fragmentTransaction.add(R.id.activity_launcher, viewPagerFragment, VIEWPAGER_FRAGMENT); 
         fragmentTransaction.addToBackStack(null); 
         fragmentTransaction.commit(); 
        } 
       } 
      }, 2000); 
     } 
    } 

    @Override 
    public void onListNewSelected(int index, ArrayList<Articles> articles) { 
     WebViewFragment webViewFragment = new WebViewFragment(); 
     Bundle bundle = new Bundle(); 
     bundle.putInt(ViewPagerFragment.KEY_NEW_INDEX, index); 
     bundle.putParcelableArrayList(ListFragment.KEY_LIST, articles); 
     webViewFragment.setArguments(bundle); 
     FragmentManager fragmentManager = getSupportFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
     fragmentTransaction.replace(R.id.activity_launcher, webViewFragment, WebViewFragment.WEBVIEWFRAGMENT); 
     fragmentTransaction.addToBackStack(null); 
     fragmentTransaction.commit(); 
    } 

    private boolean isNetworkAvailable() { 
     ConnectivityManager manager = (ConnectivityManager) 
       getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo networkInfo = manager.getActiveNetworkInfo(); 
     boolean isAvailable = false; 
     if (networkInfo != null && networkInfo.isConnected()) { 
      isAvailable = true; 
     } 
     return isAvailable; 
    } 

    private void alertUserAboutError() { 
     AlertDialogFragment alertDialogFragment = new AlertDialogFragment(); 
     alertDialogFragment.show(getFragmentManager(), "error_dialog"); 
    } 

} 

我ViewPagerClass:

public class ViewPagerFragment extends Fragment { 

    public static final String KEY_NEW_INDEX = "key_new_index"; 
    private ViewPager mViewPager; 
    private TabLayout mTabLayout; 

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

     final View view = inflater.inflate(R.layout.fragment_view_pager, container, false); 

     final OldFactFragment oldFactFragment = new OldFactFragment(); 

     final SportFragment sportFragment = new SportFragment(); 

     final BuzzFragment buzzFragment = new BuzzFragment(); 

     final NewsFragment newsFragment = new NewsFragment(); 

     mViewPager = (ViewPager) view.findViewById(R.id.viewPager); 
     mTabLayout = (TabLayout) view.findViewById(R.id.tabLayout); 
     mViewPager.setOffscreenPageLimit(4); 


     mViewPager.setAdapter(new FragmentPagerAdapter(getChildFragmentManager()) { 
      @Override 
      public Fragment getItem(int position) { 
       if(position == 0){ 
        return oldFactFragment; 
       } else if (position == 1) { 
        return newsFragment; 
       } else if (position == 2){ 
        return sportFragment; 
       } else return buzzFragment; 
      } 

      @Override 
      public CharSequence getPageTitle(int position) { 
       if(position == 0){ 
        return "Pastly"; 
       } else if (position == 1) { 
        return "politic"; 
       } else if (position == 2){ 
        return "sport"; 
       } else return "buzz"; 
      } 

      @Override 
      public int getCount() { 
       return 4; 
      } 

     }); 

     mTabLayout.setupWithViewPager(mViewPager); 

     return view; 
    } 
} 

我ListFragment(家長在ViewPager類的4個片段的):

public abstract class ListFragment extends Fragment { 

    public static final String KEY_LIST = "key_list"; 

    public interface OnNewSelectedInterface { 
     void onListNewSelected(int index, ArrayList<Articles> articles); 
    } 

    protected static final String TAG = ListFragment.class.getSimpleName(); 
    protected ArrayList<Articles> mArticlesList; 
    protected ItemAdapter mArticleAdapter; 
    protected RecyclerView mRecyclerView; 
    protected OnNewSelectedInterface mListener; 
    protected RecyclerView.LayoutManager mManager; 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 
     mListener = (OnNewSelectedInterface) getActivity(); 
     View view = inflater.inflate(R.layout.fragment_list, container, false); 
     mRecyclerView = (RecyclerView) view.findViewById(R.id.recyclerview); 
     getInfos(getUrl()); 
     return view; 
    } 

    protected abstract String[] getUrl(); 

    private void getInfos(String[] url) { 

     if (isNetworkAvailable()) { 

      OkHttpClient client = new OkHttpClient(); 
      for (int i = 0; i < getUrl().length; i++) { 
       Request request = new Request.Builder().url(url[i]).build(); 

       client.newCall(request).enqueue(new Callback() { 

        @Override 
        public void onResponse(Call call, Response response) throws IOException { 

         try { 
          String jsonData = response.body().string(); 
          if (response.isSuccessful()) { 
           Log.v(TAG, jsonData); 

           getMultipleUrls(jsonData); 

           getActivity().runOnUiThread(new Runnable() { 
            @Override 
            public void run() { 

             getCurrentArticles(mArticlesList); 
            } 
           }); 
          } else { 
           alertUserAboutError(); 
          } 
         } catch (IOException | JSONException e) { 
          e.printStackTrace(); 
         } 
        } 

        @Override 
        public void onFailure(Call call, IOException e) { 
         getActivity().runOnUiThread(new Runnable() { 
          @Override 
          public void run() { 
           alertUserAboutError(); 
          } 
         }); 
        } 
       }); 
      } 
     } else{ 
      alertUserAboutError(); 
     } 

    } 

    private void getMultipleUrls(String jsonData) throws JSONException { 
     if (mArticlesList == null) { 
      mArticlesList = getArticleForecast(jsonData); 
     } else { 
      mArticlesList.addAll(getArticleForecast(jsonData)); 
     } 
    } 

    private void getCurrentArticles(ArrayList<Articles> articles) { 

     mArticleAdapter = new ItemAdapter(getActivity(), articles, mListener); 

     mRecyclerView.setAdapter(mArticleAdapter); 
     mManager = new LinearLayoutManager(getActivity()); 
     mRecyclerView.setLayoutManager(mManager); 

    } 

    private boolean isNetworkAvailable() { 
     ConnectivityManager manager = (ConnectivityManager) getActivity(). 
       getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo networkInfo = manager.getActiveNetworkInfo(); 
     boolean isAvailable = false; 
     if (networkInfo != null && networkInfo.isConnected()) { 
      isAvailable = true; 
     } 
     return isAvailable; 
    } 

    private void alertUserAboutError() { 
     AlertDialogFragment alertDialogFragment = new AlertDialogFragment(); 
     alertDialogFragment.show(getActivity().getFragmentManager(), "error_dialog"); 
    } 

    private ArrayList<Articles> getArticleForecast(String jsonData) throws JSONException { 
     JSONObject forecast = new JSONObject(jsonData); 
     JSONArray articles = forecast.getJSONArray("articles"); 

     ArrayList<Articles> listArticles = new ArrayList<>(articles.length()); 

     for (int i = 0; i < articles.length(); i++) { 
      JSONObject jsonArticle = articles.getJSONObject(i); 
      Articles article = new Articles(); 

      String urlImage = jsonArticle.getString("urlToImage"); 

      article.setTitle(jsonArticle.getString("title")); 
      article.setDescription(jsonArticle.getString("description")); 
      article.setImageView(urlImage); 
      article.setArticleUrl(jsonArticle.getString("url")); 

      listArticles.add(i, article); 
     } 

     return listArticles; 
    } 
} 

而我ItemAdapter(適配器類):

public class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.ArticleViewHolder> { 

    private final ListFragment.OnNewSelectedInterface mListener; 
    protected ArrayList<Articles> mArticlesList; 
    protected Context mContext; 
    private int mPosition; 
    private int lastPosition = -1; 


    public ItemAdapter(Context contexts, ArrayList<Articles> mArticleLi, ListFragment.OnNewSelectedInterface listener){ 
     mContext = contexts; 
     mArticlesList = mArticleLi; 
     mListener = listener; 
    } 

    @Override 
    public ArticleViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.list_item_linear, parent, false); 

     view.findViewById(R.id.textView).setSelected(true); 
     ArticleViewHolder articleViewHolder = new ArticleViewHolder(view); 
     articleViewHolder.setIsRecyclable(false); 

     return articleViewHolder; 
    } 

    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP) 
    @Override 
    public void onBindViewHolder(ArticleViewHolder holder, int position) { 
     mPosition = position; 
     holder.bindArticle(mArticlesList.get(position)); 
     setAnimation(holder.itemView, position); 
     holder.mImageView.setClipToOutline(true); 


    } 

    private void setAnimation(View viewToAnimate, int position) { 
     if (position > lastPosition) { 
      Animation animation = AnimationUtils.loadAnimation(viewToAnimate.getContext(), android.R.anim.slide_in_left); 
      viewToAnimate.startAnimation(animation); 
      lastPosition = position; 
     } 
    } 

    @Override 
    public int getItemCount() { 
     return mArticlesList.size(); 
    } 

    public class ArticleViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener{ 

     private TextView mTitle, mArticle; 
     private ImageView mImageView; 

     private ArticleViewHolder(View itemView) { 
      super(itemView); 

      mTitle = (TextView) itemView.findViewById(R.id.textView); 
      mArticle = (TextView) itemView.findViewById(R.id.showTextView); 
      mImageView = (ImageView) itemView.findViewById(R.id.imageView2); 

      itemView.setOnClickListener(this); 
      itemView.setOnLongClickListener(this); 
     } 

     private void bindArticle(Articles article) { 

      mTitle.setText(article.getTitle()); 
      mArticle.setText(article.getDescription()); 
      mArticle.setVisibility(View.INVISIBLE); 
      Glide.with(mContext).load(article.getImageView()).into(mImageView); 
     } 


     @Override 
     public void onClick(View view) { 
      mListener.onListNewSelected(getLayoutPosition(), mArticlesList); 
     } 

     @Override 
     public boolean onLongClick(View view) { 

      String desc = mArticlesList.get(getAdapterPosition()).getDescription(); 
      mArticle.setVisibility(View.VISIBLE); 
      mArticle.setText(desc); 
      mArticle.postDelayed(new Runnable() { 
       public void run() { 
        mArticle.setVisibility(View.INVISIBLE); 
       } 
      }, 3000); 
      return true; 
     } 

    } 
} 
+0

你嘗試在「onListNewSelected」添加該片段,而不是替換它 –

+0

不,我沒有我會嘗試,並告訴你。 Thx –

+0

該死的,我試了很多東西,只是這個..非常感謝。你能解釋爲什麼替換不起作用,但它適用於添加?請 ! –

回答

0

在方法onListNewSelected您正在使用舊更換新片段在這一行

fragmentTransaction.replace(R.id.activity_launcher, webViewFragment, WebViewFragment.WEBVIEWFRAGMENT);

聲明來自Google Documentaion

替換已添加到容器的現有片段。這與爲所有當前添加的片段調用remove(Fragment)相同的containerViewId,然後使用此處給出的相同參數添加(int,Fragment,String)基本相同。

所以要刪除的舊片段然後加入新的,當你回去拿老片段,它已不存在,它會從頭開始創建的,所以位置已經去掉片段

當使用add方法,將添加新片段高於前一個,當你回到上一個已經存在有它的狀態「位置」