I have a ListView and a SwipeRefreshLayout. Everything is working fine, I can scroll up/down and on the top of the list the refreshing is working too.
But if I select an item from the listview my application show me another fragment. After that I would like to go back to the listview without scroll to the top.
I solved this with save/restore listview state, but if I dont wait 1-2 seconds after I go back to listview and I would like to scroll up the swipe refresh is showing but not srolling up.
If I wait a little bit before I scroll up, everything is ok.
On Android 4.4.2 its not problem. On Android 5.0.2 and 6.0.0 its problem.
Use this xml code for ListView with Swipe Refresh
<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="#+id/swipe_refresh_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ListView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="#+id/listView">
</ListView>
</android.support.v4.widget.SwipeRefreshLayout>
Your description isn't enough.I think it's your listview and swipelayout are reset,such as setAdapter, when return from fragment.
Related
I created a RecyclerView in a ScrollView inside a Fragment to display multiple notifications. On Android API 28 it's working perfectly, but on API 22 it's not scrolling, unless I close the fragment and open it again, then it shows the RecyclerView in the new position (as if I scrolled, it doesn't scroll while the fragment is shown).
I tried:
1- Changing the ScrollView to NestedScrollView
2- Removing the ScrollView completely and working with the RecyclerView only
3- Removing the onClickListeners of the RecyclerView elements
Here is the code for the fragment
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.RecyclerView
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="#color/common_google_signin_btn_text_dark_default"
app:layout_behavior="#string/appbar_scrolling_view_behavior"
android:padding="20dp"
android:id="#+id/my_recycler_view_fragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
Edit: I removed the scroll layout, but the problem still persists. I also tried it and it works perfectly on android API 23 and later. The scrolling only stops working on android API 22 and earlier.
I just tried leaving the recycler view on its own, and it's still not scrolling.
Turns out the problem was in another file where I used the fragment, there was an AppBarLayout there which prevented the scrolling in older APIs for some reason.
Removed the AppBarLayout and it worked fine.
Edit: I found a better solution that didn't require removing AppBarLayout
Instead of hiding and unhiding the fragment normally, I used setVisibility(GONE/VISIVILE) and it also somehow worked.
I have a collapsing toolbar within an appbar layout. It contains a view pager as it's collapsing content and a pinned action toolbar. The activity also has a nested scroll view below the collapsing toolbar. The nested scroll view contains a google map fragment.
On start of the activity, the collapsing toolbar collapses automatically in some of the cases without programmatically collapsing it.
I have tried a combination of different scroll flags for my view with scroll|exitUntilCollapsed|enterAlways.
I have also tried not showing the google map fragment but I can still reproduce it.
How can I stop it from collapsing automatically? Any help would be appreciated!
I know its late but still..
The reason collapsing toolbar automatically collapses on actvity start is because there may a view in <include layout="#layout/content_scrolling" /> like edittext which gain its focus when activity is started..
To overcome this issue you can add the tag
android:focusableInTouchMode="true"
to or
<android.support.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:focusable="true"
android:focusableInTouchMode="true"
xmlns:app="http://schemas.android.com/apk/res-auto"
app:layout_behavior="#string/appbar_scrolling_view_behavior"
xmlns:android="http://schemas.android.com/apk/res/android">
Hope it helps..:)
Happy Coding..:)
I have added RecyclerView inside my NestedScrollView. Basically I want RecyclerView to scroll with other Views. The problem that I am facing is that for a small set of data, it is working fine, but for a large set of data(200 entries) whenever I launch the activity, it freezes for about about 3-5 seconds and then loads. I removed the NestedScrollView and it is working flawlessly, but it doesn't provide me the behaviour I want.
(For extra info, I am loading the data from SQLite database. There is no problem in scrolling, as it is smooth. The only problem is the activity is freezing for a while)
<android.support.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<... Some other Views ...>
<android.support.v7.widget.RecyclerView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="vertical">
</android.support.v7.widget.RecyclerView>
</LinearLayout>
</android.support.v4.widget.NestedScrollView>
This case of RecyclerView inside NestedScrollView.
RecyclerView is calling onCreateViewHolder() times equal to your data size.
If data has 200 items, it freezes for onCreateViewHolder() to be called 200 times.
The problem as said above is because RecyclerView as a child or subChild in NestedScrollView measures its height as infinitive when you use WRAP_CONTENT or MATCH_PARENT for height of RecyclerView.
one solution that solved this problem for me was setting the RecyclerView Height to a fixed size. you could set height to a dp value, or you could set it to a pixel value matching devices height if your requirements needs a vertical infinitive RecyclerView.
here is a snippet for setting the recyclerView size in kotlin
val params = recyclerView.layoutParams
params.apply {
width = context.resources.displayMetrics.widthPixels
height = context.resources.displayMetrics.heightPixels
}
recyclerView.layoutParams = params
I faced the same problem!
The solution was to change NestedScrollView to SwipeRefreshLayout.
add this for enable/disable ToolBar Scrolling:
ViewCompat.setNestedScrollingEnabled(recyclerView, true);
As said by Nancy , recyclerview.setNestedScrollingEnabled(false); will solve scroll stuck issue. i too faced this type of issue and solved by false the NestedScroll.
I want to create a ListView and a few other text boxes for filtering the list.
Is there a way to make it happen using one activity (i.e at the same page)?
One more question:
May I modify a ListView directly without creating a ListActivity? and how do I make the ListView in my ListActivity visible? (how do I link it with the xml?).
Yes. ListActivity seems to cause a lot of confusion for people, when all it is, is a regular activity with a ListView as the content, some helper methods, and that's it.
To add your own, create a new layout file and add all the widgets you need like you would any other layout file. Example:
<LinearLayout xmlns:android="http://schemas.android.com/res/apk/android"
android:weightSum="1.0"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="#string/whatever"
android:layout_weight="0" />
<ListView
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1" />
</LinearLayout>
You certainly can create a layout which contains both a ListView and other controls! Make your Activity have a layout which contains both your ListView and your other controls.
<RelativeLayout>
<ListView android:id="#+id/listy"/>
<Button android:id="#+id/buttony"
android:layout_below="#id/listy"/>
</RelativeLayout>
In your Activity, you'll still need to hook up your data adapter to the ListView and so forth.
Yes, you can have ListView together with some other required views with in the same Activity. The way I would do this is to define an Activity and add ListView (with width and height set to fill_parent) and add a SlidingDrawer which contains all the options required to alter ListView. With this approach, your ListView will take up all the space on screen and offering user to interact freely. However, on the other hand, SlidingDrawer will give give extra space for all the list altering views/options.
In one of my activities I am showing certain information and at the end I have a ListView.
So my layout looks a bit like:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:padding="30dip"
>
...
<ListView android:id="#android:id/android:list" android:layout_width="wrap_content"
android:layout_height="fill_parent" />
</LinearLayout>
When I run the application in the emulator I see that the information before the list view is always shown in the screen and there is a vertical scroll for the ListView only.
Is there a way to change this scrolling behaviour ?. What I would like to have is a vertical scroll for all the information in the screen, not only at the level of the ListView.
I tried wrapping the LinearLayout with a ScrollView, with different combinations of the android:layout_height attribute for all the views involved but I did not get the effect that I was looking for. Besides, some people say that it is a pretty bad idea to wrap a ListView with a ScrollView :
Android ScrollView layout problem
Scrolling with Multiple ListViews for Android
Thanks for any other ideas.
I've not tried this, but you might want to look at you tube video:
Google I/O 2010 - The world of ListView
http://www.youtube.com/watch?v=wDBM6wVEO70
Starting at time 27:11, it talks about how to make info above and/or below a ListView scroll with the ListView. It refers to scrolling headers and footers, but it does say you can put anything you want in them.