כיצד למנוע מילד של תא RecyclerView לזוז בזמן שהמשתמש גולל

How Prevent Child Recyclerview Cell From Moving While User Scrolls



פִּתָרוֹן:

למרות שאפשר להשאיר את תצוגת הכותרת בתוךRecyclerView והפוך אותו לסטטי, אני מציע גישה חלופית.

הכותרת יכולה להמשיך להיות מיוצגת באופן פנימי בתוךRecyclerView, אך התצוגה תועבר החוצה לחלק העליון שלRecyclerView כדלקמן:



- כותרת (C)<-- We want that to be still - Recycler View (A) - - Cell (parent) (B) - - - Content  

לRecyclerView.OnScrollListener יקשיב למראה של פריטים חדשים וישנה את הכותרת בהתאם. בדרך זו, כפי שמופיעים פריטים חדשים, הכותרת שהיא אTextView תציג את הכותר החדש. הדברים הבאים מדגימים זאת.



הזן כאן תיאור תמונה



(זהו יישום עצם חשוף למטרות הדגמה. אפליקציה מלאה תציג תמונות מגזע הכלבים ואיזה סוג של תיאור משמעותי).

הנה הקוד שמשיג את האפקט הזה:

MainActivity.java



המעמד הציבורי MainActivity מרחיב את AppCompatActivity {private LinearLayoutManager mLayoutManager; פרטי RecyclerViewAdapter mAdapter; פרטי TextView mBreedNameTitle; int int mlastBreedTitlePosition = RecyclerView.NO_POSITION; חלל מוגן onCreate (Bundle savedInstanceState) {super.onCreate (saveInstanceState); setContentView (R.layout.activity_main); רשימת breedList = createBreedList (); // כאן מוצג שם הגזע. mBreedNameTitle = findViewById (R.id.breedNameTitle); // הגדר את RecyclerView. mLayoutManager = LinearLayoutManager חדש (זה, LinearLayoutManager.HORIZONTAL, שקר); RecyclerView recyclerView = findViewById (R.id.recyclerView); mAdapter = RecyclerViewAdapter חדש (breedList); recyclerView.setLayoutManager (mLayoutManager); recyclerView.setAdapter (mAdapter); // הוסף את OnScrollListener כדי שנדע מתי לשנות את כותרת הגזע. recyclerView.addOnScrollListener (new RecyclerView.OnScrollListener () {@Override public void onScrolled (RecyclerView recyclerView, int dx, int dy) {super.onScrolled (recyclerView, dx, dy); last lastVisible = mlayoutManLiveVisible = mlayoutManLiveVisible = mLayoutMan.Vindable.fm/ == RecyclerView.NO_POSITION) {return;} if (lastVisible! = MLastBreedTitlePosition) {mBreedNameTitle.setText (mAdapter.getItems (). Get (lastVisible)); mLastBreedTitlePosition = lastVisible;}}}); } רשימה פרטית createBreedList () {List breedList = new ArrayList (); breedList.add ('Affenpinscher'); breedList.add ('כלב אפגני'); breedList.add ('איירדייל טרייר'); breedList.add ('אקיטה'); breedList.add ('Alaskan Malamute'); breedList.add ('קוקר ספנייל אמריקאי'); breedList.add ('כלב אסקימו אמריקאי (מיניאטורה)'); breedList.add ('כלב אסקימו אמריקאי (סטנדרטי)'); breedList.add ('כלב אסקימו אמריקאי (צעצוע)'); breedList.add ('פוקסהאונד אמריקאי'); breedList.add ('אמריקן סטאפורדשייר טרייר'); breedList.add ('כלב אסקימו אמריקאי (סטנדרטי)'); החזר breedList; } @SuppressWarnings ('לא בשימוש') מחרוזת סטטית סופית פרטית TAG = 'MainActivity'; } class RecyclerViewAdapter מרחיב RecyclerView.Adapter {פרטי רשימה פרטיים סופיים; RecyclerViewAdapter (פריטי רשימה) {mItems = items; } @Override @NonNull public RecyclerView.ViewHolder onCreateViewHolder (@NonNull ViewGroup parent, int viewType) {View view; view = LayoutInflater.from (parent.getContext ()). לנפח (R.layout.item_layout, אב, שקר); החזר RecyclerViewAdapter.ItemViewHolder חדש (תצוגה); } @Override public void onBindViewHolder (@NonNull RecyclerView.ViewHolder holder, int position) {RecyclerViewAdapter.ItemViewHolder vh = (RecyclerViewAdapter.ItemViewHolder) מחזיק; vh.mBreedImage.setImageDrawable (holder.itemView.getResources (). getDrawable (R.drawable.no_image)); vh.mBreedName = mItems.get (מיקום); } @Override public int getItemCount () {return mItems.size (); } רשימה ציבורית getItems () {return mItems; } מחלקה סטטית ItemViewHolder מרחיבה את RecyclerView.ViewHolder {private ImageView mBreedImage; פרטי מחרוזת mBreedName; ItemViewHolder (הצג itemView) {super (itemView); mBreedImage = itemView.findViewById (R.id.breedImage); }}}

activity_main.xml

  

item_layout.xml

  

עדכון: להלן גישה נוספת הקובעת את הריפוד השמאלי של aTextView כדי להפוך את הכותרת לדביקה. קיזוז ה- x השלילי של ה-TextView נלקח כריפוד לכותרת בכדי לגרום לו להחליק ימינה בתוךTextView והישאר בצד השמאלי של המסך.

להלן התוצאה:

הזן כאן תיאור תמונה

MainActivity.java

המעמד הציבורי MainActivity מרחיב את AppCompatActivity {private LinearLayoutManager mLayoutManager; חלל מוגן onCreate (Bundle savedInstanceState) {super.onCreate (saveInstanceState); setContentView (R.layout.activity_main); רשימת breedList = createBreedList (); // הגדר את RecyclerView. mLayoutManager = LinearLayoutManager חדש (זה, LinearLayoutManager.HORIZONTAL, שקר); RecyclerView recyclerView = findViewById (R.id.recyclerView); מתאם RecyclerViewAdapter = RecyclerViewAdapter חדש (breedList); recyclerView.setLayoutManager (mLayoutManager); recyclerView.setAdapter (מתאם); recyclerView.addOnScrollListener (new RecyclerView.OnScrollListener () {@Override public void onScrolled (RecyclerView recyclerView, int dx, int dy) {super.onScrolled (recyclerView, dx, dy); // דחף את שמאל שם הגזע כך שהוא נשאר מיושר עם הצד השמאלי של התצוגה. int firstVisible = mLayoutManager.findFirstVisibleItemPosition (); הצג firstView = mLayoutManager.findViewByPosition (firstVisible); firstView.findViewById (R.id.itemBreedName) .setPadding ((int) -Vir ( , 0, 0, 0); // ודא שלשם הגזע האחר יש אפס ריפוד כי יתכן ששינינו אותו int lastVisible = mLayoutManager.findLastVisibleItemPosition (); הצג lastView = mLayoutManager.findViewByPosition (lastVisible); lastView.findViewById (R .id.itemBreedName) .setPadding (0, 0, 0, 0);}}); } רשימה פרטית createBreedList () {List breedList = new ArrayList (); breedList.add ('Affenpinscher'); breedList.add ('כלב אפגני'); breedList.add ('איירדייל טרייר'); breedList.add ('אקיטה'); breedList.add ('Alaskan Malamute'); breedList.add ('קוקר ספנייל אמריקאי'); breedList.add ('כלב אסקימו אמריקאי (מיניאטורה)'); breedList.add ('כלב אסקימו אמריקאי (סטנדרטי)'); breedList.add ('כלב אסקימו אמריקאי (צעצוע)'); breedList.add ('פוקסהאונד אמריקאי'); breedList.add ('אמריקן סטאפורדשייר טרייר'); breedList.add ('כלב אסקימו אמריקאי (סטנדרטי)'); החזר breedList; } @SuppressWarnings ('לא בשימוש') מחרוזת סטטית סופית פרטית TAG = 'MainActivity'; } class RecyclerViewAdapter מרחיב RecyclerView.Adapter {פרטי רשימה פרטיים סופיים; RecyclerViewAdapter (פריטי רשימה) {mItems = items; } @Override @NonNull public RecyclerView.ViewHolder onCreateViewHolder (@NonNull ViewGroup parent, int viewType) {View view; view = LayoutInflater.from (parent.getContext ()). לנפח (R.layout.item_layout, אב, שקר); החזר RecyclerViewAdapter.ItemViewHolder חדש (תצוגה); } @Override public void onBindViewHolder (@NonNull RecyclerView.ViewHolder holder, int position) {RecyclerViewAdapter.ItemViewHolder vh = (RecyclerViewAdapter.ItemViewHolder) מחזיק; vh.mBreedImage.setImageDrawable (holder.itemView.getResources (). getDrawable (R.drawable.no_image)); vh.mBreedName.setPadding (0, 0, 0, 0); vh.mBreedName.setText (mItems.get (מיקום)); } @Override public int getItemCount () {return mItems.size (); } מחלקה סטטית ItemViewHolder מרחיבה את RecyclerView.ViewHolder {private ImageView mBreedImage; פרטי TextView mBreedName; ItemViewHolder (הצג itemView) {super (itemView); mBreedImage = itemView.findViewById (R.id.breedImage); mBreedName = itemView.findViewById (R.id.itemBreedName); }}}

activity_main.xml

  

item_layout.xml