2016-12-21 20 views
0

の唯一の最後の項目は、これまでRecyclerViewがスクロールされたときの時間を示すのTextViewが表示され、DIS-表示されます意味時間の少しの断片の後、私の努力は、このようになると、ターゲットのTextViewはVisiblity.GONEとアダプタがRecyclerView.OnScrollListenerは()に影響を与え、なぜ私は私のアプリ</p> <p><a href="https://i.stack.imgur.com/fRaTl.gif" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/fRaTl.gif" alt="enter image description here"></a></p> <p>でこの機能を持ちたいrecyclerview

public class ChatMessageAdapter extends RecyclerView.Adapter<ViewHolder> { 

    private List<ChatMessage> mMessageList; 
    private Context mContext; 
    private boolean isMe = false; 

    private ThemMessageHolder messageHolder; 

    public ChatMessageAdapter(Context mContext, List<ChatMessage> mMessageList){ 
     this.mContext = mContext; 
     this.mMessageList = mMessageList; 
    } 

    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View rootView = LayoutInflater.from(mContext).inflate(R.layout.chat_them_container, parent, false); 
     return new ThemMessageHolder(rootView); 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
     messageHolder = (ThemMessageHolder) holder; 
     messageHolder.mMessageTextView.setText(mMessageList.get(position).getMessage()); 
     messageHolder.mSentAtTextView.setText(mMessageList.get(position).getSentAt()); 
    } 

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

    public void showAndHideDate(){ 
     messageHolder.mSentAtTextView.setVisibility(View.VISIBLE); 
     Handler handler = new Handler(); 
     handler.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       messageHolder.mSentAtTextView.setVisibility(View.GONE); 
      } 
     },3500); 

    } 

} 

のように見えたとMainActivityに私は単に

を持っています上記のコードによる
@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main);   

     mMessageList = new CopyOnWriteArrayList<>(); 

     mChatMessagesRecyclerView = (RecyclerView) findViewById(R.id.chat_msg_rv); 
     mChatMessagesRecyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this)); 
     mChatMessageAdapter = new ChatMessageAdapter(MainActivity.this, mMessageList); 
     mChatMessagesRecyclerView.setAdapter(mChatMessageAdapter); 

     mChatMessagesRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() { 
      @Override 
      public void onScrollStateChanged(RecyclerView recyclerView, int newState) { 
       super.onScrollStateChanged(recyclerView, newState); 
       mChatMessageAdapter.showAndHideDate(); // Here I'm calling the method defined in Adapter class 
      } 

      @Override 
      public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
       super.onScrolled(recyclerView, dx, dy); 
      } 
     }); 
    } 

RecyclerViewの全ての項目にその所望の効果を適用する方法

enter image description here

示すように、私はRecyclerViewの唯一の最後の項目に対する所望の効果を得ますか?

答えて

2

問題は、ご使用のアダプターに変数ThemMessageHolderが1つだけ使用されていることです。それは、すべてのonBindViewHolder()呼び出しで変数が上書きされていることを意味します。その後、messageHolderは最後に作成された所有者を指しており、showAndHideDate()はそれだけで動作します。

ソリューションすべての可視保有者(擬似コード)を見つけることができます:あなたがしてください必要なすべてのコードを詳しく説明してさせていただきたいと思い

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

     if (initChatBarUI()){ 
      mSendImageButton.setOnClickListener(MainActivity.this); 
      mEmoImageButton.setOnClickListener(MainActivity.this); 
     } 

     mMessageList = new CopyOnWriteArrayList<>(); 

     final LinearLayoutManager layoutManager = new LinearLayoutManager(MainActivity.this); 
     mChatMessagesRecyclerView = (RecyclerView) findViewById(R.id.chat_msg_rv); 
     mChatMessagesRecyclerView.setLayoutManager(layoutManager); 
     mChatMessageAdapter = new ChatMessageAdapter(MainActivity.this, mMessageList); 
     mChatMessagesRecyclerView.setAdapter(mChatMessageAdapter); 

     mChatMessagesRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() { 
      @Override 
      public void onScrollStateChanged(RecyclerView recyclerView, int newState) { 
       super.onScrollStateChanged(recyclerView, newState); 
       final int firstVisibleItemPosition = layoutManager.findFirstVisibleItemPosition(); 
       final int lastVisibleItemPosition = layoutManager.findLastVisibleItemPosition(); 
       mChatMessageAdapter.showAndHideDate(mChatMessagesRecyclerView, firstVisibleItemPosition, lastVisibleItemPosition); // Here I'm calling the method defined in Adapter class 
      } 

      @Override 
      public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
       super.onScrolled(recyclerView, dx, dy); 
      } 
     }); 
    } 

とshowAndHideDateは()

public void showAndHideDate(RecyclerView mRecyclerView, int firstVisibleItemPosition, int lastVisibleItemPosition){ 

    for (int i = firstVisibleItemPosition; i <= lastVisibleItemPosition; ++i) { 
     final ThemMessageHolder holder = (ThemMessageHolder) mRecyclerView.findViewHolderForAdapterPosition(i); 
     holder.mSentAtTextView.setVisibility(View.VISIBLE); 
     Handler handler = new Handler(); 
     handler.postDelayed(new Runnable() { 
      @Override 
      public void run() { 
       holder.mSentAtTextView.setVisibility(View.GONE); 
      } 
     },3500); 
    }  

} 
+0

のように見えるかもしれませんか? –

+0

すべての目に見える保持者はどこに見つかるはずですか?そこでは?上のように 'onScrollStateChanged()'の中に –

+1

があります。 –

関連する問題

 関連する問題