android - android 中自定义 ListView 的性能问题?

标签 android performance android-listview android-custom-view

我使用 View-Holder 类来显示自定义 ListView 。在某些设备(如 Galaxy S3、S4)中, ListView 中的滚动会非常慢。在某些设备中它非常快。我不知道为什么滚动不快在 S3 和 S4 中。请任何人帮助我。

我的代码是:

public class doctortAdapter extends BaseAdapter {

        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return doctorData_list.size();
        }

        @Override
        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return 0;
        }

        @Override
        public View getView(final int position, View convertView,
                ViewGroup parent) {
            // TODO Auto-generated method stub

            View view = convertView;
            final RecordHolder holder;
            if (view == null) {
                LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
                view = inflater.inflate(R.layout.custom_list, null);

                holder = new RecordHolder();

                holder.txtName = (TextView) view
                        .findViewById(R.id.textView_name);
                holder.txtAddress1 = (TextView) view
                        .findViewById(R.id.textView_address);
                holder.txtAddress2 = (TextView) view
                        .findViewById(R.id.textView_address1);
                holder.btn_book = (Button) view.findViewById(R.id.button_book);
                holder.btn_advice = (Button) view
                        .findViewById(R.id.button_advice);
                holder.btn_favourite = (Button) view
                        .findViewById(R.id.button_faviourate);
                holder.txtReview = (TextView) view.findViewById(R.id.textView2);
                holder.img_personPic = (ImageView) view
                        .findViewById(R.id.imageView1);
                holder.rt = (RatingBar) view.findViewById(R.id.ratingBar1);
                holder.btn_book.setFocusable(false);
                holder.btn_advice.setFocusable(false);
                holder.btn_favourite.setFocusable(false);
                holder.rt.setFocusable(false);

                holder.rt.setOnTouchListener(new OnTouchListener() {

                    @Override
                    public boolean onTouch(View v, MotionEvent event) {
                        // TODO Auto-generated method stub

                        if (event.getAction() == MotionEvent.ACTION_UP) {
                            DoctorData doc_data = doctorData_list.get(position);
                            selected_doctorID = doc_data.getDocID();

                            if (checkSession() == true) {
                                addReview();
                            } else {
                                ratingBarDialog();
                            }
                        }

                        return true;
                    }
                });

                holder.btn_favourite.setOnClickListener(new OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        // TODO Auto-generated method stub

                        DoctorData doc_data = doctorData_list.get(position);
                        doctorid = doc_data.getDocID();
                        if (checkSession() == true) {
                            favouriteDialog();
                        } else {
                            // ratingBarDialog();
                            signInDialog();
                        }

                    }
                });

                holder.btn_book.setOnClickListener(new OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        // TODO Auto-generated method stub
                        DoctorData doc_data = doctorData_list.get(position);
                        startActivity(new Intent(MainActivity.this,
                                DoctorDetailsActivity.class).putExtra(
                                "doctorData", doc_data).putExtra(
                                "TabSelection", "schedule"));
                        Editor prefsEditor = pref.edit();
                        Gson gson = new Gson();
                        String json = gson.toJson(doc_data);
                        prefsEditor.putString("doctorData", json);
                        prefsEditor.commit();
                        finish();


                    }
                });

                holder.btn_advice.setOnClickListener(new OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        // TODO Auto-generated method stub
                        startActivity(new Intent(MainActivity.this,
                                FreeAdviceActivity.class));
                        finish();
                    }
                });

                holder.txtReview.setOnClickListener(new OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        // TODO Auto-generated method stub
                        DoctorData doc_data = doctorData_list.get(position);
                        startActivity(new Intent(MainActivity.this,
                                DoctorDetailsActivity.class).putExtra(
                                "doctorData", doc_data).putExtra(
                                "TabSelection", "review"));
                        Editor prefsEditor = pref.edit();
                        Gson gson = new Gson();
                        String json = gson.toJson(doc_data);
                        prefsEditor.putString("doctorData", json);
                        prefsEditor.commit();
                        finish();
                    }
                });

                view.setTag(holder);
            } else {
                holder = (RecordHolder) view.getTag();
            }

            DoctorData doc_data = doctorData_list.get(position);
            holder.txtName.setText(doc_data.getFirstName() + " "
                    + doc_data.getLastName());
            holder.txtAddress1.setText(doc_data.getAddress1());
            holder.txtAddress2.setText(doc_data.getAddress2());

            return view;
        }

    }

    public class RecordHolder {
        TextView txtName, txtAddress1, txtAddress2, txtReview;
        ImageView img_personPic;
        Button btn_book, btn_favourite, btn_advice;
        RatingBar rt;
    }

自定义 ListView 代码:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

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

        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="80dp"
            android:layout_height="70dp"
            android:layout_alignParentLeft="true"
            android:layout_alignParentTop="true"
            android:layout_marginLeft="10dp"
            android:layout_marginTop="5dp"
            android:src="@drawable/defaultprofilepic" />

        <TextView
            android:id="@+id/textView_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignTop="@+id/imageView1"
            android:layout_marginLeft="16dp"
            android:layout_toRightOf="@+id/imageView1"
            android:text="No Name"
            android:textAppearance="?android:attr/textAppearanceSmall"
            android:textStyle="bold" />

        <LinearLayout
            android:id="@+id/linearLayout1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignLeft="@+id/imageView1"
            android:layout_alignParentRight="true"
            android:layout_below="@+id/textView2"
            android:layout_marginRight="10dp"
            android:layout_marginTop="5dp"
            android:orientation="horizontal"
            android:weightSum="2" >

            <Button
                android:id="@+id/button_advice"
                style="@style/buttons"
                android:layout_width="wrap_content"
                android:layout_alignLeft="@+id/imageView1"
                android:layout_below="@+id/imageView1"
                android:layout_weight="1"
                android:text="Free Advice" />

            <Button
                android:id="@+id/button_book"
                style="@style/buttons"
                android:layout_width="wrap_content"
                android:layout_alignTop="@+id/button_faviourite"
                android:layout_marginLeft="5dp"
                android:layout_toRightOf="@+id/button_faviourite"
                android:layout_weight="1"
                android:text="$0 Book 0nline" />
        </LinearLayout>

        <TextView
            android:id="@+id/textView_address"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignLeft="@+id/textView_name"
            android:layout_below="@+id/textView_name"
            android:layout_marginTop="3dp"
            android:maxLines="2"
            android:text="No address"
            android:textAppearance="?android:attr/textAppearanceSmall" />

        <TextView
            android:id="@+id/textView_address1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignLeft="@+id/textView_name"
            android:layout_below="@+id/textView_address"
            android:layout_marginTop="3dp"
            android:text="No address"
            android:textAppearance="?android:attr/textAppearanceSmall" />

        <RatingBar
            android:id="@+id/ratingBar1"
            style="@style/foodRatingBar"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignLeft="@+id/textView_address1"
            android:layout_below="@+id/textView_address1"
            android:layout_marginTop="5dp" />

        <Button
            android:id="@+id/button_faviourate"
            android:layout_width="20dp"
            android:layout_height="20dp"
            android:layout_alignRight="@+id/linearLayout1"
            android:layout_alignTop="@+id/textView_name"
            android:background="@drawable/favoirate_selector" />

        <TextView
            android:id="@+id/textView2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignBottom="@+id/ratingBar1"
            android:layout_alignRight="@+id/linearLayout1"
            android:text="Reviews"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:textColor="#07a3d3" />

    </RelativeLayout>

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/relativeLayout1"
        android:layout_marginLeft="100dp"
        android:text="TextView"
        android:visibility="invisible" />

</RelativeLayout>

和 mainActivity:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <TableLayout
        android:id="@+id/tableLayout"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true" 
        android:layout_marginTop="5dp">

        <TableRow
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" >

            <ImageView
                android:id="@+id/imageView1"
                android:layout_width="50dp"
                android:layout_height="50dp"
                android:layout_weight="1"
                android:src="@drawable/doctor" />

            <ImageView
                android:id="@+id/imageView2"
                android:layout_width="50dp"
                android:layout_height="50dp"
                android:layout_weight="1"
                android:src="@drawable/location" />

            <ImageView
                android:id="@+id/imageView3"
                android:layout_width="50dp"
                android:layout_height="50dp"
                android:layout_weight="1"
                android:src="@drawable/insurance" />
        </TableRow>
 </TableLayout>

 <TableLayout
     android:id="@+id/tableLayout1"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
     android:layout_alignParentRight="true"
     android:layout_below="@+id/tableLayout" >

        <TableRow
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" >

            <TextView
                android:id="@+id/textView1"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:gravity="center"
                android:text="Speciality"
                android:textAppearance="?android:attr/textAppearanceSmall" />

            <TextView
                android:id="@+id/textView2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:gravity="center"
                android:text="Location"
                android:textAppearance="?android:attr/textAppearanceSmall" />

            <TextView
                android:id="@+id/textView3"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:gravity="center"
                android:text="Small Text"
                android:visibility="invisible"
                android:textAppearance="?android:attr/textAppearanceSmall" />
        </TableRow>
    </TableLayout>

    <RelativeLayout
        android:id="@+id/relativeLayout1"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/tableLayout1"
        android:layout_marginTop="5dp"
        android:background="@drawable/new_header" >

        <TextView
            android:id="@+id/textView_date"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:text="Small Text"
            android:textAppearance="?android:attr/textAppearanceSmall"
            android:textStyle="bold" />

        <Button
            android:id="@+id/button_privious"
            style="?android:attr/buttonStyleSmall"
            android:layout_width="30dp"
            android:layout_height="40dp"
            android:layout_alignBaseline="@+id/textView_date"
            android:layout_alignBottom="@+id/textView_date"
            android:layout_alignParentLeft="true"
            android:layout_marginLeft="10dp"
            android:background="@drawable/leftarrow" />

        <Button
            android:id="@+id/button_next"
            style="?android:attr/buttonStyleSmall"
            android:layout_width="30dp"
            android:layout_height="40dp"
            android:layout_alignBaseline="@+id/textView_date"
            android:layout_alignBottom="@+id/textView_date"
            android:layout_alignParentRight="true"
            android:layout_marginRight="10dp"
            android:background="@drawable/rightarrow" />

        <ImageView
            android:id="@+id/imageView_date"
            android:layout_width="40dp"
            android:layout_height="30dp"
            android:layout_centerVertical="true"
            android:layout_marginRight="15dp"
            android:layout_toLeftOf="@+id/button_next"
            android:src="@drawable/calendar" />

    </RelativeLayout>

    <ListView
        android:id="@+id/listView1"
        android:layout_width="match_parent"
        android:layout_height="70dp"
        android:layout_above="@+id/button_next_call1"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/relativeLayout1" >

    </ListView>

    <ProgressBar
        android:id="@+id/progressBar1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:indeterminateDrawable="@drawable/my_custom_progresswheel"
        android:visibility="invisible"
        />

    <Button
        android:id="@+id/button_next_call1"
        android:layout_width="60dp"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_margin="5dp"
        android:text="Next" 
        android:textColor="#ffffff"
        android:background="@drawable/customborder_backbutton"/>

    <Button
        android:id="@+id/button_previous"
        android:layout_width="80dp"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_margin="5dp"
        android:text="Previous" 
        android:textColor="#ffffff"
        android:visibility="invisible"
        android:background="@drawable/customborder_backbutton" />

</RelativeLayout>

最佳答案

我检查了您的代码并发现:--

  • 我发现每次您的 View 为 null 时您都在获取 layoutinflator,因此首先将该代码移至您的适配器构造函数并使用该 layoutInflator。

     LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
    

    将其声明为适配器类的实例变量,然后使用它。

  • 要使滚动速度更快,您可以使用以下代码:--

         getListView().setFastScrollEnabled(true);
    

    希望这有助于..享受..!

    更新:-

    我检查了你的 xml 和你的代码,一切都很好我认为问题是你的 ListView 行有很多 View 你正在获取 findviewbyid() 这需要时间所以你可能需要优化它。删除那些 View findViewById( ) 您不用于显示。

  • 关于android - android 中自定义 ListView 的性能问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21154849/

    相关文章:

    java - 将数据从 edittext 发送到 listview

    android - 如何在我的应用程序中实现 android gif 编码器?

    android - 无法在 Android 手机上运行 node.js?

    performance - Elasticsearch 基于时间的提要模块的最佳方法?

    c# - 使用单链接实体列表的 Linq 中的自定义 OrderBy

    android - 在 onItemLongClick 中显示 AlertDialog 会给出有关父项的错误,我必须做什么?

    Android:带复选框的ListView

    java - 想要打开日历日期进行一些计算

    java - Eclipse 说我的 Android 项目包含错误,但没有任何错误

    Android 非常庞大的项目列表,具有 recyclerview 最佳方法