2017-06-29 12 views
0

Firebaseデータベースからデータを取得する簡単な断片があります。 私はfirebaseリサイクラービューを使用してデータを取得します。また、スクロールや画面の回転後、私はリサイクラビュー(または線形レイアウトマネージャ)のスクロール位置を強制的に復元することはできません。スクロール位置を復元する

私はここでいくつかの答えを見つけましたが、動作しません。

私のコードは次のとおり

パブリッククラスNewsListFragment位置の実数を示しParentNewsFragment {

static int color_naval, color_black; 
private boolean mProcessLikes = false; 
private DatabaseReference mDatabaseLikes; 
private DatabaseReference mDatabaseViews; 
private FirebaseAuth mAuth; 
private int position = 0; 


public static NewsListFragment getInstance() { 
    return new NewsListFragment(); 
} 

@Override 
public void onCreate(@Nullable Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    mDatabaseReference = FirebaseDatabase.getInstance().getReference() 
      .child("App_news"); 
    mDatabaseLikes = FirebaseDatabase.getInstance().getReference().child("news_likes"); 
    mDatabaseViews = FirebaseDatabase.getInstance().getReference().child("news_views"); 
    mAuth = FirebaseAuth.getInstance(); 
    mQuery = mDatabaseReference.orderByChild("pos").startAt("100"); 
    color_naval = getResources().getColor(R.color.colorPrimary); 
    color_black = getResources().getColor(R.color.colorBlack); 
} 

@Nullable 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    View rootView = inflater.inflate(R.layout.rv_choose, container, false); 
    rv = (RecyclerView) rootView.findViewById(R.id.rv_choose); 
    lm = new LinearLayoutManager(getActivity()); 
    rv.setLayoutManager(lm); 
    rv.setHasFixedSize(true); 
    return rootView; 
} 

@Override 
public void onPause() { 
    super.onPause(); 
    position = lm.findFirstVisibleItemPosition(); 
} 

@Override 
public void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    outState.putInt("position", position); 
} 

@Override 
public void onViewStateRestored(@Nullable Bundle savedInstanceState) { 
    super.onViewStateRestored(savedInstanceState); 
    if(savedInstanceState != null) { 
     position = savedInstanceState.getInt("position"); 
    } 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    if (position != 0) { 
     lm.scrollToPosition(position); 
     showToast(position+""); 
    } 
} 

@Override 
public void onStart() { 
    super.onStart(); 
    FirebaseRecyclerAdapter<NewsList, NewsListViewHolder> adapter = 
      new FirebaseRecyclerAdapter<NewsList, NewsListViewHolder>(
        NewsList.class, 
        R.layout.frag_newslist_card_view, 
        NewsListViewHolder.class, 
        mQuery 
      ) { 
       @Override 
       protected void populateViewHolder(NewsListViewHolder viewHolder, final NewsList model, int position) { 
        final String post_key = getRef(position).getKey(); 
        viewHolder.setDate(model.getDate()+","); 
        viewHolder.setTime(model.getTime()); 
        viewHolder.setTitle(model.getTitle()); 
        viewHolder.setImage(getContext(), model.getImage()); 
        viewHolder.setEye(model.getCode()); 
        viewHolder.setThumb(post_key); 

        viewHolder.thumb.setOnClickListener(new View.OnClickListener() { 
         @Override 
         public void onClick(View view) { 
          mProcessLikes = true; 
          mDatabaseLikes.addValueEventListener(new ValueEventListener() { 
           @Override 
           public void onDataChange(DataSnapshot dataSnapshot) { 
            if (mProcessLikes){ 
             if (dataSnapshot.child(post_key).hasChild(mAuth.getCurrentUser().getUid())){ 
              mDatabaseLikes.child(post_key).child(mAuth.getCurrentUser().getUid()) 
                .removeValue(); 
              mProcessLikes = false; 
             } 
             else { 
              mDatabaseLikes.child(post_key).child(mAuth.getCurrentUser().getUid()) 
                .setValue("like"); 
              mProcessLikes = false; 
             } 
            } 
           } 
           @Override 
           public void onCancelled(DatabaseError databaseError) { 

           } 
          }); 
         } 
        }); 

        viewHolder.mView.setOnClickListener(new View.OnClickListener() { 
         @Override 
         public void onClick(View view) { 
          mDatabaseViews.addValueEventListener(new ValueEventListener() { 
           @Override 
           public void onDataChange(DataSnapshot dataSnapshot) { 
            if (!dataSnapshot.child(post_key).hasChild(mAuth.getCurrentUser().getUid())) { 
             mDatabaseViews.child(post_key).child(mAuth.getCurrentUser().getUid()) 
               .setValue("view"); 
            } 
           } 
           @Override 
           public void onCancelled(DatabaseError databaseError) { 

           } 
          }); 
          mChooserListener.chooseNews(model.getCode()); 
         } 
        }); 
       } 
      }; 
    rv.setAdapter(adapter); 
} 

public static class NewsListViewHolder extends RecyclerView.ViewHolder { 
     //some text here 
} 

}最後に

方法showToastを延びるが最初からrecyclerview始まります。

答えて

0

サーバーから、またはデータを取得している場所からデータを再ロードしないようにしてください。

 if(savedInstanceState != null){ 
    ... 
    }else{ 
    loadData(); 
} 
0

次のようなものを使用して線形のレイアウトマネージャを置き換えます 追加のようなあなたのフラグメントのonCreateViewやアクティビティの中のonCreateヌルのチェックではありません。 RecyclerViewを断片的に使用する場合、この実装を何度も使用しています。どうすればいいのか教えてください

LinearLayoutManager mLayoutManager = new LinearLayoutManager(getActivity()); 
mLayoutManager.setReverseLayout(true); 
mLayoutManager.setStackFromEnd(true); 
yourItem.setLayoutManager(mLayoutManager); 
関連する問題