Не плавная прокрутка при использовании fastScrollEnabled в ListView

Я использую список в своем приложении. Я сделал собственный адаптер и использовал шаблон проектирования viewholder. Проблема заключается в том, что когда я прокручиваю список, плавно проводя по его прокрутке, но когда я прокручиваю его, перетаскивая палец быстрой прокрутки, он слишком сильно отстает. Часто зависает на какое-то время. Я проверил другое приложение в своем телефоне, такое как музыкальный проигрыватель по умолчанию, список прокручивается, как ветер, независимо от того, как я его прокручиваю. Я не использую ни одного изображения в списке, только три текстовых изображения в строке.

вот полный код:

public class CustomListViewSongs extends BaseAdapter{


    private Context context;

    private ArrayList songs, artist, songduration;


    private static LayoutInflater inflater = null;

    public CustomListViewSongs(Context context, ArrayList songs, ArrayList artist, ArrayList songDuration){
        this.context = context;
        this.songs = songs;
        this.artist = artist;
        this.songduration = songDuration;



    }

    @Override
    public int getCount() {
        return songs.size();
    }

    @Override
    public Object getItem(int position) {
        return songs.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }



    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        Holder holder;
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View rowView = convertView;
        if(rowView == null){
            rowView = inflater.inflate(R.layout.customlistviewsongssinglerow, null);
            holder = new Holder();
            holder.songTitle = (TextView) rowView.findViewById(R.id.songTitle);
            holder.songTitleArtist = (TextView) rowView.findViewById(R.id.songTitleArtist);
            holder.songDuration = (TextView) rowView.findViewById(R.id.songDuration);
            rowView.setTag(holder);
        }else{
            holder = (Holder) rowView.getTag();
        }
        holder.songTitle.setText("" + songs.get(position));
        holder.songTitleArtist.setText("" + artist.get(position));
        long duration = Long.parseLong("" + songduration.get(position));
        int seconds = (int) ((duration / 1000) % 60);
        long minutes = ((duration - seconds) / 1000) / 60;
        if (seconds < 10) {
            holder.songDuration.setText("" + minutes + ":0" + seconds);
        } else {
            holder.songDuration.setText("" + minutes + ":" + seconds);
        }
        return rowView;
    }

    public class Holder {
        TextView songTitle, songTitleArtist, songDuration;
        int position;

    }


}

и список XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:layout_width="match_parent"
    android:layout_height="match_parent">
        <ListView
            android:fastScrollEnabled="true"
            android:fastScrollAlwaysVisible="false"
            android:background="@android:color/transparent"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/listView"/>
</RelativeLayout>

и вызывая его:

    public class f1 extends Fragment {

    private MainActivity f = new MainActivity();
    private ListView lv;
    private View view;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.f1, container, false);
        populate();
        return view;
    }
    private void populate() {
        lv = (ListView) view.findViewById(R.id.listView);
        lv.setAdapter(new CustomListViewSongs(getActivity(), f.songs, f.artist, f.songsDuration));
    }

}

person Tushar Monirul    schedule 01.03.2015    source источник
comment
Можете ли вы опубликовать код вашего списка?   -  person George Daramouskas    schedule 01.03.2015
comment
@GeorgeD Я добавил это...   -  person Tushar Monirul    schedule 01.03.2015
comment
Из какого метода вы используете lv = (ListView) view.findViewById(R.id.listView);, который увеличивает ваш список?   -  person George Daramouskas    schedule 01.03.2015
comment
@GeorgeD Я добавил полный код сейчас...   -  person Tushar Monirul    schedule 01.03.2015


Ответы (2)


Вы можете попробовать переместить эту строку

inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

внутри когда rowView == null. Он вызывается слишком много раз без необходимости, поскольку представления перерабатываются, и единственное место, где он используется, находится внутри этого условия if.

Хотя не уверен, что это главная проблема.

Вы также можете проверить, не вызывает ли ваш расчет продолжительности песни задержку, просто установив значение по умолчанию textView и закомментировав расчеты. Если вы видите улучшение, вам следует выполнить вычисления в фоновом потоке.

Редактировать: Только что заметил, что ваш шаблон держателя представления должен быть реализован как static class. Замените свой код на этот

static class Holder {
        TextView songTitle, songTitleArtist, songDuration;
        int position;
}
person SigmaFive    schedule 01.03.2015
comment
Попробуйте вместо этого изменить макет ListView, чтобы он соответствовал родительскому. android:layout_width=match_parent android:layout_height=match_parent - person SigmaFive; 02.03.2015

Метод getView() вызывается для каждого элемента в вашем списке. Кажется, что вы делаете много просмотров и обработки в своем методе getView(). Рефакторинг этого метода для более плавной работы. Попробуйте свести к минимуму код, выполняемый в методе, так как при прокрутке вниз системе может потребоваться больше памяти и выполнить очистку от мусора в ваших предыдущих представлениях, поэтому при перемещении вверх и вниз getView() вызывается снова. Кроме того, почему вы View rowView = convertView;? convertView — это старое представление, которое необходимо использовать повторно, если это возможно, чтобы избежать проблем с производительностью. Для получения дополнительной информации см. здесь.

person George Daramouskas    schedule 01.03.2015