karthik kolanji
karthik kolanji

Reputation: 2104

Custom Listview lags very much while scrolling android

I am working on an custom listview that populates the number of row in the second row based on the HashMap data

enter image description here

Adapter.java

 @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = context.getLayoutInflater();
        itemsData =  hasMap.get(position);
        ViewHolder viewHolder;
        View view = null;
        if (convertView == null) {
            viewHolder = new ViewHolder();
            convertView = inflater.inflate(R.layout.listview_row_storewise_details, null, false);
            viewHolder.txt_building_name = (TextView) convertView.findViewById(R.id.BUILDING);
            viewHolder.txt_tower_name = (TextView) convertView.findViewById(R.id.TOWER);
            viewHolder.txt_flat_number = (TextView) convertView.findViewById(R.id.FLAT_NO);
            viewHolder.txt_order_id = (TextView) convertView.findViewById(R.id.ORDER_NO);
            viewHolder.txt_delivery_time = (TextView) convertView.findViewById(R.id.Datetime);
            viewHolder.txt_grand_total = (TextView) convertView.findViewById(R.id.txt_recurring_total_price5);


            viewHolder.container = (LinearLayout) convertView.findViewById(R.id.container);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        viewHolder.container.removeAllViews();
        for (int i=0;i<itemsData.size();i++){
            StorewiseDetailsModel test = itemsData.get(i);

            Log.d(TAG," test "+itemsData.get(i).getStore_name());

            view = inflater.inflate(R.layout.storewise_detail_orderrow, null);

            viewHolder.txt_not_vailable = (TextView) view.findViewById(R.id.txt_not_vailable);
            viewHolder.txt_rupee_symbol1 = (TextView) view.findViewById(R.id.txt_recurring_price_sym_qnty);
            viewHolder.txt_rupee_symbol2 = (TextView) view.findViewById(R.id.txt_recurring_price_sym1);
            viewHolder.txt_item_name = (TextView) view.findViewById(R.id.txt_product_name);
            viewHolder.txt_item_size = (TextView) view.findViewById(R.id.txt_product_weight);
            viewHolder.txt_item_quantity = (TextView) view.findViewById(R.id.txt_recurring_total_price_qnty);
            viewHolder.txt_item_total = (TextView) view.findViewById(R.id.txt_recurring_total_price);
            viewHolder.divider = (TextView) view.findViewById(R.id.divider);
            viewHolder.container.addView(view);
            viewHolder.txt_grand_total.setText(test.getTotal());
            viewHolder.txt_building_name.setText(test.getBuilding_name());
            viewHolder.txt_tower_name.setText(test.getTower_name());
            viewHolder.txt_flat_number.setText(test.getFlat_number());
            viewHolder.txt_order_id.setText(test.getOrder_id());
            viewHolder.txt_delivery_time.setText(utilClass.formatDate(test.getDelivery_time()));


            if (test.getIs_available().equals("0")){
                viewHolder.txt_not_vailable.setVisibility(View.VISIBLE);
                viewHolder.txt_item_name.setTextColor(context.getResources().getColor(R.color.red_text));
                viewHolder.txt_item_size.setTextColor(context.getResources().getColor(R.color.red_text));
                viewHolder.txt_item_quantity.setTextColor(context.getResources().getColor(R.color.red_text));
                viewHolder.txt_item_total.setTextColor(context.getResources().getColor(R.color.red_text));
                viewHolder.txt_rupee_symbol1.setTextColor(context.getResources().getColor(R.color.red_text));
                viewHolder.txt_rupee_symbol2.setTextColor(context.getResources().getColor(R.color.red_text));

                viewHolder.txt_item_name.setText(test.getItem_name());
                viewHolder.txt_item_size.setText(test.getItem_size());
                viewHolder.txt_item_quantity.setText(test.getItem_price() + " x" + test.getItem_quantity());
                viewHolder.txt_item_total.setText(test.getItem_total());

            }
            else if (test.getIs_available().equals("1")){
                viewHolder.txt_not_vailable.setVisibility(View.GONE);
                viewHolder.txt_item_name.setTextColor(context.getResources().getColor(R.color.black_text));
                viewHolder.txt_item_size.setTextColor(context.getResources().getColor(R.color.black_text));
                viewHolder.txt_item_quantity.setTextColor(context.getResources().getColor(R.color.black_text));
                viewHolder.txt_item_total.setTextColor(context.getResources().getColor(R.color.black_text));
                viewHolder.txt_rupee_symbol1.setTextColor(context.getResources().getColor(R.color.black_text));
                viewHolder.txt_rupee_symbol2.setTextColor(context.getResources().getColor(R.color.black_text));

                viewHolder.txt_item_name.setText(test.getItem_name());
                viewHolder.txt_item_size.setText(test.getItem_size());
                viewHolder.txt_item_quantity.setText(test.getItem_price() + " x" + test.getItem_quantity());
                viewHolder.txt_item_total.setText(test.getItem_total());
            }
        }
        return convertView;
    }

    class ViewHolder {
        TextView txt_building_name;
        TextView txt_tower_name;
        TextView txt_flat_number;
        TextView txt_order_id;
        TextView txt_delivery_time;
        TextView txt_grand_total;

        TextView txt_item_name;
        TextView txt_item_size;
        TextView txt_item_quantity;
        TextView txt_item_total;
        LinearLayout container;
        TextView divider;
        TextView txt_not_vailable;
        TextView txt_rupee_symbol1,txt_rupee_symbol2;
    }

listview_row_storewise_details.xml

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


    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#eeeeee"
        android:paddingTop="10dp"
        android:paddingBottom="10dp"
        android:paddingLeft="15dp"
        android:paddingRight="10dp"
        >

        <RelativeLayout
            android:id="@+id/relativeLayout"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true">

            <com.techmorphosis.Utils.TextViewCustomFont
                android:id="@+id/txt_not_vailable"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:padding="1dp"
                android:text="not available"
                android:visibility="gone"
                android:textColor="#b8b8b8"
                android:drawableLeft="@drawable/ic_not_available"
                android:drawablePadding="5dp"
                android:textSize="@dimen/textsize_large" />

            <com.techmorphosis.Utils.TextViewCustomFont
                android:id="@+id/txt_product_name"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:padding="1dp"
                android:layout_below="@+id/txt_not_vailable"
                android:textSize="@dimen/textsize_large"
                android:textColor="#000000" />

            <com.techmorphosis.Utils.TextViewCustomFont
                android:id="@+id/txt_product_weight"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/txt_product_name"
                android:padding="0dp"
                android:textSize="@dimen/textsize_large"
                android:textColor="#000000"

                />



        </RelativeLayout>


        <RelativeLayout
            android:id="@+id/relative_order_confirm_price"
            android:layout_width="120dp"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_alignBottom="@+id/relativeLayout"
            android:paddingLeft="10dp">

            <LinearLayout
                android:orientation="horizontal"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:gravity="right"
                >

                <RelativeLayout
                    android:id="@+id/layoutVoice1"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:layout_weight="0.6"
                    android:layout_gravity="bottom"
                    >



                    <com.techmorphosis.Utils.TextViewCustomFont
                        android:id="@+id/txt_recurring_total_price_qnty"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_toRightOf="@+id/txt_recurring_price_sym_qnty"
                        android:padding="2dp"
                        android:layout_centerVertical="true"
                        android:textSize="@dimen/textsize_large"
                        android:textColor="@color/black_text" />

                    <com.techmorphosis.Utils.TextViewCustomFontBold
                        android:id="@+id/txt_recurring_price_sym_qnty"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:padding="0dp"
                        android:layout_alignParentLeft="true"

                        android:layout_centerVertical="true"
                        android:text="@string/rupees_sym"
                        android:textSize="@dimen/textsize_large"
                        android:textColor="@color/black_text"/>

                </RelativeLayout>
                <View
                    android:id="@+id/view1"
                    android:background="@color/uiv3_divider_color"
                    android:layout_width="1.0dip"
                    android:layout_height="fill_parent"
                    android:layout_marginTop="5dp"

                    android:layout_marginBottom="5dp"
                    />

                <RelativeLayout
                    android:gravity="left"
                    android:id="@+id/layoutScanner1"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:layout_weight="0.6"
                    android:paddingLeft="10dp"
                    >

                    <com.techmorphosis.Utils.TextViewCustomFont
                        android:id="@+id/txt_recurring_total_price"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_alignParentRight="true"
                        android:padding="2dp"
                        android:layout_centerVertical="true"
                        android:textSize="@dimen/textsize_large"
                        android:textColor="@color/black_text" />

                    <com.techmorphosis.Utils.TextViewCustomFontBold
                        android:id="@+id/txt_recurring_price_sym1"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_toLeftOf="@+id/txt_recurring_total_price"
                        android:padding="2dp"
                        android:layout_centerVertical="true"
                        android:text="@string/rupees_sym"
                        android:textSize="@dimen/textsize_large"
                        android:textColor="@color/black_text"/>

                </RelativeLayout>
            </LinearLayout>


        </RelativeLayout>


    </RelativeLayout>


    <View
        android:layout_width="match_parent"
        android:layout_height="0.8dp"
        android:background="#bebebe" />

</LinearLayout>

storewise_detail_orderrow.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="wrap_content"
    android:orientation="vertical">


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="0dp"
        android:orientation="vertical">

        <RelativeLayout
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:background="#eeeeee"
            android:paddingBottom="10dp"
            android:paddingLeft="15dp"
            android:paddingRight="15dp"
            android:paddingTop="10dp"

            >

            <com.techmorphosis.Utils.TextViewCustomFont
                android:id="@+id/BUILDING"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentLeft="true"
                android:textColor="#5330A8"
                android:textSize="@dimen/textsize_large"

                />

            <com.techmorphosis.Utils.TextViewCustomFont
                android:id="@+id/TOWER"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentLeft="true"
                android:layout_below="@+id/BUILDING"
                android:textColor="#5330A8"

                android:textSize="@dimen/textsize_large" />

            <com.techmorphosis.Utils.TextViewCustomFont
                android:id="@+id/dash"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/BUILDING"
                android:layout_toRightOf="@+id/TOWER"
                android:text="-"
                android:textColor="#5330A8"

                android:textSize="@dimen/textsize_large" />

            <com.techmorphosis.Utils.TextViewCustomFont
                android:id="@+id/FLAT_NO"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/BUILDING"
                android:layout_toRightOf="@+id/dash"
                android:textColor="#5330A8"

                android:textSize="@dimen/textsize_large" />


            <com.techmorphosis.Utils.TextViewCustomFont
                android:id="@+id/ORDER_NO"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true"
                android:gravity="right"
                android:textColor="#5330A8"
                android:textSize="@dimen/textsize_large"

                />

            <com.techmorphosis.Utils.TextViewCustomFont
                android:id="@+id/Datetime"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true"
                android:layout_below="@+id/ORDER_NO"
                android:textColor="#5330A8"
                android:textSize="@dimen/textsize_large" />
        </RelativeLayout>


        <View
            android:layout_width="match_parent"
            android:layout_height="0.8dp"
            android:background="#bebebe" />


        <LinearLayout
            android:id="@+id/container"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="vertical">

        </LinearLayout>


        <LinearLayout
            android:id="@+id/myrow4"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#eeeeee"
            android:orientation="horizontal"
            android:paddingBottom="15dp"

            android:paddingTop="15dp"
            android:weightSum="1"


            >


            <com.techmorphosis.Utils.TextViewCustomFont
                android:layout_width="0.0dip"
                android:layout_height="wrap_content"
                android:layout_weight="0.50"
                android:gravity="center"
                android:textColor="#000000"
                android:textSize="20sp"

                />

            <RelativeLayout
                android:id="@+id/relative_order_confirm_price4"
                android:layout_width="0.0dip"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true"
                android:layout_weight="0.50"
                android:paddingLeft="10dp"
                android:paddingRight="17dp">

                <com.techmorphosis.Utils.TextViewCustomFont
                    android:id="@+id/txt_recurring_total_price5"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignParentRight="true"
                    android:layout_centerVertical="true"
                    android:padding="2dp"
                    android:text="0"
                    android:textColor="@color/black_text"
                    android:textSize="20sp"

                    />

                <com.techmorphosis.Utils.TextViewCustomFontBold
                    android:id="@+id/txt_recurring_price_sym5"

                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_centerVertical="true"
                    android:layout_toLeftOf="@+id/txt_recurring_total_price5"
                    android:padding="0dp"
                    android:text="@string/rupees_sym"
                    android:textColor="@color/black_text"
                    android:textSize="@dimen/textsize_large" />

                <com.techmorphosis.Utils.TextViewCustomFont
                    android:id="@+id/txt_recurring_total_price_qnty5"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignParentLeft="true"
                    android:layout_centerVertical="true"
                    android:layout_marginLeft="35dp"
                    android:padding="2dp"
                    android:text="TOTAL"
                    android:textColor="@color/black_text"
                    android:textSize="20sp" />

            </RelativeLayout>
        </LinearLayout>
    </LinearLayout>

    <View android:id="@+id/view"
        android:layout_width="match_parent"
        android:layout_height="15dp"
        android:background="@color/white_background"
        />

</LinearLayout>

Upvotes: 2

Views: 1649

Answers (3)

Harisewak
Harisewak

Reputation: 580

I am sorry because of low reputation I am not able to make a comment. I don't have a clear answer but briefly looking at your code I can see that you have used findViewById() quite a lot. Hence, it is probably affecting your performance.

You should probably modify your code such that Adapter doesn't have to find views every for every single item.

EDIT :

Okay, so I have modified your ViewHolder such that it finds views inside the constructor itself, thereby saving you the trouble and computational expense required for inserting views every single time by Adapter.

class ViewHolder {
    TextView txt_building_name;
    TextView txt_tower_name;
    TextView txt_flat_number;
    TextView txt_order_id;
    TextView txt_delivery_time;
    TextView txt_grand_total;
TextView txt_item_name;
    TextView txt_item_size;
    TextView txt_item_quantity;
    TextView txt_item_total;
    LinearLayout container;
    TextView divider;
    TextView txt_not_vailable;
    TextView txt_rupee_symbol1, txt_rupee_symbol2;

    public ViewHolder(View convertView, View view) {
        txt_building_name = (TextView) convertView.findViewById(R.id.BUILDING);
        txt_tower_name = (TextView) convertView.findViewById(R.id.TOWER);
        txt_flat_number = (TextView) convertView.findViewById(R.id.FLAT_NO);
        txt_order_id = (TextView) convertView.findViewById(R.id.ORDER_NO);
        txt_delivery_time = (TextView) convertView.findViewById(R.id.Datetime);
        txt_grand_total = (TextView) convertView.findViewById(R.id.txt_recurring_total_price5);
        txt_item_name = (TextView) view.findViewById(R.id.txt_product_name);
        txt_item_size = (TextView) view.findViewById(R.id.txt_product_weight);
        txt_item_quantity = (TextView) view.findViewById(R.id.txt_recurring_total_price_qnty);
        txt_item_total = (TextView) view.findViewById(R.id.txt_recurring_total_price);
        divider = (TextView) view.findViewById(R.id.divider);
        txt_not_vailable = (TextView) view.findViewById(R.id.txt_not_vailable);
        txt_rupee_symbol1 = (TextView) view.findViewById(R.id.txt_recurring_price_sym_qnty);
        txt_rupee_symbol2 = (TextView) view.findViewById(R.id.txt_recurring_price_sym1);
    }
}

Here, convertView is your container inflated from listview_row_storewise_details and view is another container you've inflated from storewise_detail_orderrow.

Please try using this ViewHolder and let me know if it reduces lagging.

Upvotes: 2

Vaibhav Jani
Vaibhav Jani

Reputation: 12548

Nested listing is not good design idea.

It should first list parent items and on selecting a parent it should list child items with header and footer.

If you want to continue with this design you can try shifting to RecyclerView which is more efficient then ListView.

If you still want to continue using ListView optimize your list adapter's getView() method as follows to boost the performance little.

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    LayoutInflater inflater = context.getLayoutInflater();

    //Make this variable local in methods not need to be global
    itemsData =  hasMap.get(position);

    ViewHolder viewHolder;

    View view = null;

    if (convertView == null) {

        viewHolder = new ViewHolder();

        convertView = inflater.inflate(R.layout.listview_row_storewise_details, null, false);
        viewHolder.txt_building_name = (TextView) convertView.findViewById(R.id.BUILDING);
        viewHolder.txt_tower_name = (TextView) convertView.findViewById(R.id.TOWER);
        viewHolder.txt_flat_number = (TextView) convertView.findViewById(R.id.FLAT_NO);
        viewHolder.txt_order_id = (TextView) convertView.findViewById(R.id.ORDER_NO);
        viewHolder.txt_delivery_time = (TextView) convertView.findViewById(R.id.Datetime);
        viewHolder.txt_grand_total = (TextView) convertView.findViewById(R.id.txt_recurring_total_price5);

        viewHolder.container = (LinearLayout) convertView.findViewById(R.id.container);
        convertView.setTag(viewHolder);

    } else {

        viewHolder = (ViewHolder) convertView.getTag();
    }

    int redTextColor = context.getResources().getColor(R.color.red_text);
    int blackTextColor = context.getResources().getColor(R.color.black_text);

    viewHolder.container.removeAllViews();

    for (int i=0;i<itemsData.size();i++){

        StorewiseDetailsModel test = itemsData.get(i);

        Log.d(TAG," test "+itemsData.get(i).getStore_name());

        view = inflater.inflate(R.layout.storewise_detail_orderrow, null);
        viewHolder.container.addView(view);

        TextView txt_not_vailable = (TextView) view.findViewById(R.id.txt_not_vailable);
        TextView txt_rupee_symbol1 = (TextView) view.findViewById(R.id.txt_recurring_price_sym_qnty);
        TextView txt_rupee_symbol2 = (TextView) view.findViewById(R.id.txt_recurring_price_sym1);
        TextView txt_item_name = (TextView) view.findViewById(R.id.txt_product_name);
        TextView txt_item_size = (TextView) view.findViewById(R.id.txt_product_weight);
        TextView txt_item_quantity = (TextView) view.findViewById(R.id.txt_recurring_total_price_qnty);
        TextView txt_item_total = (TextView) view.findViewById(R.id.txt_recurring_total_price);
        TextView divider = (TextView) view.findViewById(R.id.divider);

        //These attribute should be only once per row. Should not repeat in all "item data"
        viewHolder.txt_grand_total.setText(test.getTotal());
        viewHolder.txt_building_name.setText(test.getBuilding_name());
        viewHolder.txt_tower_name.setText(test.getTower_name());
        viewHolder.txt_flat_number.setText(test.getFlat_number());
        viewHolder.txt_order_id.setText(test.getOrder_id());
        viewHolder.txt_delivery_time.setText(utilClass.formatDate(test.getDelivery_time()));

        if (test.getIs_available().equals("0")){

            txt_not_vailable.setVisibility(View.VISIBLE);
            txt_item_name.setTextColor(redTextColor);
            txt_item_size.setTextColor(redTextColor);
            txt_item_quantity.setTextColor(redTextColor);
            txt_item_total.setTextColor(redTextColor);
            txt_rupee_symbol1.setTextColor(redTextColor);
            txt_rupee_symbol2.setTextColor(redTextColor);

            txt_item_name.setText(test.getItem_name());
            txt_item_size.setText(test.getItem_size());
            txt_item_quantity.setText(test.getItem_price() + " x" + test.getItem_quantity());
            txt_item_total.setText(test.getItem_total());

        }

        else if (test.getIs_available().equals("1")){

            txt_not_vailable.setVisibility(View.GONE);

            txt_item_name.setTextColor(blackTextColor);
            txt_item_size.setTextColor(blackTextColor);
            txt_item_quantity.setTextColor(blackTextColor);
            txt_item_total.setTextColor(blackTextColor);
            txt_rupee_symbol1.setTextColor(blackTextColor);
            txt_rupee_symbol2.setTextColor(blackTextColor);

            txt_item_name.setText(test.getItem_name());
            txt_item_size.setText(test.getItem_size());
            txt_item_quantity.setText(test.getItem_price() + " x" + test.getItem_quantity());
            txt_item_total.setText(test.getItem_total());

        }

    }

    return convertView;
}


class ViewHolder {

    TextView txt_building_name;
    TextView txt_tower_name;
    TextView txt_flat_number;
    TextView txt_order_id;
    TextView txt_delivery_time;
    TextView txt_grand_total;

    LinearLayout container;
}

In addition as I specified in code comment changing your data structure will help, remove the common attributes like building name, grand total... from "item data" and wrap them in another class with an ArrayList of "item data".

Upvotes: 3

Sonali Pawar
Sonali Pawar

Reputation: 420

Try using recyclerview inflating 2 different layout

Upvotes: 1

Related Questions