Home » Android » Android – ListView only show the first result

Android – ListView only show the first result

Posted by: admin April 23, 2020 Leave a comment

Questions:

I am working on an android app which interacts with Twitter using their search API.
Everythings works well except that when I want to show the result using a ListView, only the first result is shown.

ArrayList<TwitterJSONResults> arrayList = new ArrayList<TwitterJSONResults>(data.getResults().size());
for (int i = 0; i < data.getResults().size(); i++) {
    arrayList.add(data.getResults().get(i));
}

ArrayAdapter<TwitterJSONResults> resultAdapter = new ArrayAdapter<TwitterJSONResults>(
                this, android.R.layout.simple_list_item_1, arrayList);
listview.setAdapter(resultAdapter);
resultAdapter.notifyDataSetChanged();

The code snippet above show how I add the results to the adapter and set this adapter to the the listview, What am I doing wrong?

How to&Answers:

Don’t put ListView inside of a ScrollView 🙂

Answer:

You can use ListView in ScrollView.

public class Utility {
public static void setListViewHeightBasedOnChildren(ListView listView) {
    ListAdapter listAdapter = listView.getAdapter();
    if (listAdapter == null) {
        // pre-condition
        return;
    }

    int totalHeight = 0;
    int desiredWidth = MeasureSpec.makeMeasureSpec(listView.getWidth(), MeasureSpec.AT_MOST);
    for (int i = 0; i < listAdapter.getCount(); i++) {
        View listItem = listAdapter.getView(i, null, listView);
        listItem.measure(desiredWidth, MeasureSpec.UNSPECIFIED);
        totalHeight += listItem.getMeasuredHeight();
    }

    ViewGroup.LayoutParams params = listView.getLayoutParams();
    params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));
    listView.setLayoutParams(params);
    listView.requestLayout();
}
}

Call this function right after you change ListView items, like that:

Utility.setListViewHeightBasedOnChildren(myListView);

Read source.

Answer:

Thanks to @207 I realized that the problem in my case was because I was using NestedScrollView, so for me the solution was used

android:fillViewport="true"

Here my code:

    <android.support.v4.widget.NestedScrollView
        android:id="@+id/content_frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">
    </android.support.v4.widget.NestedScrollView>

Answer:

I have had this error like you when put listview inside ScrollView. And my solution is following as:

1. Create a custom listview which is non scrollable

public class NonScrollListView extends ListView {

public NonScrollListView(Context context) {
    super(context);
}
public NonScrollListView(Context context, AttributeSet attrs) {
    super(context, attrs);
}
public NonScrollListView(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
}
@Override
public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int heightMeasureSpec_custom = MeasureSpec.makeMeasureSpec(
                Integer.MAX_VALUE >> 2, MeasureSpec.AT_MOST);
        super.onMeasure(widthMeasureSpec, heightMeasureSpec_custom);
        ViewGroup.LayoutParams params = getLayoutParams();
        params.height = getMeasuredHeight();    
}

}

2. Use above custom class for xml file

  <xx.xx.NonScrollListView
        android:id="@+id/lv_nonscroll_list"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </xx.xx.NonScrollListView>

It worked well on all OS-version for me.
Hope best for you.

Answer:

It turns out I had everything in my java code working perfectly. the issue was that was using the listview inside a scrollview which is generally a bad idea. It led to listview ignoring

android:layout="wrap_content"

therefore the content was there, it just was not showing. After I remove the scrollview from my XML file, everything worked file.

Big thanks to 207 for the support 🙂

Answer:

You can use a ListView inside a NestedScrollView.
The only thing you have to remember is to add android:nestedScrollingEnabled="true" in the xml layout in order to enable the scroll of NestedScrollView’s children.

Answer:

Put it in ListView xml layout

    android:stackFromBottom="true"
    android:transcriptMode="alwaysScroll"

Answer:

this is my answere

<android.support.v4.widget.NestedScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true"
        app:layout_behavior="@string/appbar_scrolling_view_behavior">

        <ListView
            android:minWidth="25px"
            android:minHeight="25px"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior"
            android:id="@+id/listViewRefeCalendarDay" />

    </android.support.v4.widget.NestedScrollView>