Pages

Thursday, December 17, 2015

ListView inside ScrollView

Hanlding ListView Scroll and ScrollView Scroll at same time is a big problem in android.
To avoid that just follow these 5 simple basic steps.

1.  Create Layout "activity_main"
"this layout has a ScrollView as parent and 2 ListView inside the ScrollView ."

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <ScrollView
        android:id="@+id/scrollView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical" >

            <ListView
                android:id="@+id/listView1"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" >
            </ListView>

            <View
                android:layout_width="match_parent"
                android:layout_height="2dp"
                android:background="#f0f" />

            <ListView
                android:id="@+id/listView2"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" >
            </ListView>
        </LinearLayout>
    </ScrollView>


</LinearLayout>


2.  Create ListItem Layout "item_list_xml"

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:gravity="center"
        android:text="TextView"
        android:textSize="14sp" />


</LinearLayout>


3.  Create Activity "MainActivity "

import java.util.ArrayList;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;

public class MainActivity extends Activity {
ListView listview, listview2;
ArrayList<String> data = null, data1 = null;
listview_adapter adapter = null, adapter1 = null;

@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
super.setContentView(R.layout.activity_main);
init();

                //Adding data for List1
set_data();
                //Adding data for List2
set_data1();
                //Set Adapeter for List1 and List2
set_adapter();

}

public void init() {
listview = (ListView) findViewById(R.id.listView1);
listview2 = (ListView) findViewById(R.id.listView2);
data = new ArrayList<String>();
data1 = new ArrayList<String>();

}

public void set_data() {
data.add("Meet");
data.add("prachi");
data.add("shailesh");
data.add("manoj");
data.add("sandip");
data.add("zala");
data.add("tushar");
data.add("Meet");
data.add("prachi");
data.add("shailesh");
data.add("manoj");
data.add("sandip");
data.add("zala");
data.add("tushar");
data.add("Meet");
data.add("prachi");
data.add("shailesh");
data.add("manoj");
data.add("sandip");
data.add("zala");
data.add("tushar");
data.add("Meet");
data.add("prachi");
data.add("shailesh");
data.add("manoj");
data.add("sandip");
data.add("zala");
data.add("tushar");
data.add("Meet");
data.add("prachi");
data.add("shailesh");
data.add("manoj");
data.add("sandip");
data.add("zala");
data.add("tushar");
data.add("Meet");
data.add("prachi");
data.add("shailesh");
data.add("manoj");
data.add("sandip");
data.add("zala");
data.add("tushar");
data.add("Meet");
data.add("prachi");
data.add("shailesh");
data.add("manoj");
data.add("sandip");
data.add("zala");
data.add("tushar");
data.add("Meet");
data.add("prachi");
data.add("shailesh");
data.add("manoj");
data.add("sandip");
data.add("zala");
data.add("tushar");
data.add("Meet");
data.add("prachi");
data.add("shailesh");
data.add("manoj");
data.add("sandip");
data.add("zala");
data.add("tushar");
data.add("Meet");
data.add("prachi");
data.add("shailesh");
data.add("manoj");
data.add("sandip");
data.add("zala");
data.add("tushar");
data.add("Meet");
data.add("prachi");
data.add("shailesh");
data.add("manoj");
data.add("sandip");
data.add("zala");
data.add("tushar");
data.add("Meet");
data.add("prachi");
data.add("shailesh");
data.add("manoj");
data.add("sandip");
data.add("zala");
data.add("tushar");
data.add("Meet");
data.add("prachi");
data.add("shailesh");
data.add("manoj");
data.add("sandip");
data.add("zala");
data.add("tushar");

}

public void set_data1() {
data1.add("Meet");
data1.add("prachi");
data1.add("shailesh");
data1.add("manoj");
data1.add("sandip");
data1.add("zala");
data1.add("tushar");
data1.add("Meet");
data1.add("prachi");
data1.add("shailesh");
data1.add("manoj");
data1.add("sandip");
data1.add("zala");
data1.add("tushar");

}

public void set_adapter() {
adapter = new listview_adapter(MainActivity.this, data);
adapter1 = new listview_adapter(MainActivity.this, data1);
listview.setAdapter(adapter);
listview2.setAdapter(adapter1);
Helper.getListViewSize(listview);
Helper.getListViewSize(listview2);// set height of listview according to
// Arraylist item
}

}

4.  Create AdapterClass "listview_adapter "

import java.util.ArrayList;

import android.app.Activity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;

public class listview_adapter extends ArrayAdapter<String> {
        private final Activity context;
        ArrayList<String>data;
        class ViewHolder
        {
            public TextView tv_name;
            public ScrollView scroll;
            public LinearLayout l1;
        }


        public listview_adapter(Activity context, ArrayList<String> all_data) {
            super(context, R.layout.item_list_xml, all_data);
            this.context = context;
            data=all_data;
        }
        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            View rowView = convertView;
            ViewHolder viewHolder;
            if (rowView == null)
            {
                LayoutInflater inflater = context.getLayoutInflater();
                rowView = inflater.inflate(R.layout.item_list_xml, null);

                viewHolder = new ViewHolder();

                viewHolder.tv_name=(TextView)rowView.findViewById(R.id.textView1);

                rowView.setTag(viewHolder);
            }
            else
            viewHolder = (ViewHolder) rowView.getTag();

            viewHolder.tv_name.setText(data.get(position).toString());
            return rowView;

        }


    }


5. Create a HelperClass "Helper " : This class will override the scroll listener of list view and scrollview when needed.

import android.util.Log;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ListAdapter;
    import android.widget.ListView;

    public class Helper {
        public static void getListViewSize(ListView myListView) {
            ListAdapter myListAdapter = myListView.getAdapter();
            if (myListAdapter == null) {
                //do nothing return null
                return;
            }
            //set listAdapter in loop for getting final size
            int totalHeight = 0;
            for (int size = 0; size < myListAdapter.getCount(); size++) {
                View listItem = myListAdapter.getView(size, null, myListView);
                listItem.measure(0, 0);
                totalHeight += listItem.getMeasuredHeight();
            }
          //setting listview item in adapter
            ViewGroup.LayoutParams params = myListView.getLayoutParams();
            params.height = totalHeight + (myListView.getDividerHeight() *                   (myListAdapter.getCount() - 1));
            myListView.setLayoutParams(params);
            // print height of adapter on log
            Log.i("height of listItem:", String.valueOf(totalHeight));
        }
    }



Download complete source code from...
Source Code - https://drive.google.com/file/d/0BxB1jxUBhPlTenFPVS05emhpUTg/view?usp=sharing


Keep Coding... :)