Почему адаптер ListView не загружает элементы из списка сразу?

ListView заполнять только те представления, которые видны из метода адаптера getView(). Я хочу загрузить все элементы сразу. Если мой listView показывает 1 элемент на экране, getview() вызывается только один раз, даже если мой список содержит 8,9,10... и т. д. элементы

public class TrackAdapter extends BaseAdapter {

public static ArrayList<TrackSection> mlist;
Context mContext;
private LayoutInflater inflater;
private ImageLoader imageLoader;
private DisplayImageOptions options;
String foldername;
ListView mListView;
public static Species species;
public static final String POSITION = "position";
public static final String TYPE = "type";
int h2;
int h1;
int s;
int listPosition;
int viewPosition;
int offset;
private View view;
int previousPosition;
private Display display;
private boolean isFirstTime = true;
ArrayList<Bitmap> bmp;

public TrackAdapter(Context context, ArrayList<TrackSection> list,

Species species, ListView listView) {
    TrackAdapter.species = species;
    bmp = new ArrayList<Bitmap>();
    mContext = context;
    mListView = listView;
    mlist = list;

    inflater = LayoutInflater.from(mContext);
    imageLoader = ImageLoader.getInstance();
    WindowManager wm = (WindowManager) context
            .getSystemService(Context.WINDOW_SERVICE);
    display = wm.getDefaultDisplay();
    this.foldername = TrackAdapter.species.getCommanName();
    // /////////////////Create a option////////////////
    options = new DisplayImageOptions.Builder()
            .cacheInMemory(true)
            .showImageOnLoading(R.drawable.holder)
            .showImageOnFail(new ColorDrawable(Color.parseColor("#e6e3d2")))
            .imageScaleType(ImageScaleType.EXACTLY_STRETCHED)
            .bitmapConfig(Bitmap.Config.RGB_565).build();

}

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

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

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

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    Log.e("TrackAdapter", "postion"+position);
    view = convertView;
    ViewHolder mHolder = null;

    if (view == null) {
        mHolder = new ViewHolder();
        view = inflater.inflate(R.layout.inflate_track_adapter, null);
        mHolder.heading = (TextView) view.findViewById(R.id.trackHeading);
        mHolder.item = (TextView) view.findViewById(R.id.trackItems);
        mHolder.image = (ImageView) view.findViewById(R.id.trackImage);
        view.setTag(mHolder);
    } else {
        mHolder = (ViewHolder) view.getTag();
    }
    imageLoader.displayImage("assets://image/"
            + mlist.get(position).getMainTrackImage(), mHolder.image,
            options);

    h2 = mHolder.image.getHeight();
    h1 = mListView.getHeight();

    mHolder.heading.setText(mlist.get(position).getHeader());
    mHolder.heading.setTypeface(((DetailViewActivity) mContext).mFontBold);
    mHolder.item.setText(mlist.get(position).getfooter());
    mHolder.item.setTypeface(((DetailViewActivity) mContext).mFont);

    mHolder.image.setOnClickListener(new View.OnClickListener() {

        @SuppressLint("NewApi")
        @Override
        public void onClick(View arg0) {
            // open pageview from here
            // mListView.smoothScrollToPosition(position);
            // mListView.smoothScrollToPositionFromTop(position, h1 / 2 -
            // h2/ 2);
            int size = ((DetailViewActivity) mContext).mActionBar
                    .getHeight();
            listPosition = mListView.getHeight();
            viewPosition = view.getHeight();
            if (viewPosition > listPosition) {
                listPosition = display.getHeight();
                Log.v("Offset", "Greater Positon");
                Log.v("Offset", "" + offset + "View positon  "
                        + viewPosition);
                mListView.smoothScrollToPosition(position);
            } else {
                Log.v("Offset", "normal Positon");

                offset = ((listPosition / 2) - (viewPosition / 2));
                previousPosition = viewPosition / 2;
                Log.v("Offset", "" + offset + "View positon  "
                        + viewPosition);
                mListView.smoothScrollToPositionFromTop(position,
                        Math.abs(offset));
            }

            new CountDownTimer(300, 300) {

                @Override
                public void onTick(long millisUntilFinished) {

                }

                @Override
                public void onFinish() {
                    Intent intent = new Intent(mContext,
                            DetailPagerActivity.class);
                    intent.putExtra(POSITION, position);
                    intent.putExtra(TYPE, "track");
                    mContext.startActivity(intent);
                    ((DetailViewActivity) mContext)
                            .overridePendingTransition(R.anim.fade_in2,
                                    R.anim.fade_out2);
                }
            }.start();

        }
    });
    return view;
}

private static class ViewHolder {
    public TextView heading, item;
    public ImageView image;

}

public void SetItemAgain(ArrayList<TrackSection> list) {
    mlist = list;
    notifyDataSetChanged();
}

@SuppressLint("NewApi")
public void setItemLocation(int position) {
    listPosition = mListView.getHeight();
    viewPosition = view.getHeight();
    if (viewPosition > listPosition) {
        listPosition = display.getHeight();
        Log.v("Offset", "Greater Positon");
        Log.v("Offset", "" + offset + "View positon  " + viewPosition);
        mListView.smoothScrollToPosition(position);
    } else {
        Log.v("Offset", "normal Positon");

        offset = ((listPosition / 2) - (viewPosition / 2));
        previousPosition = viewPosition / 2;
        Log.v("Offset", "" + offset + "View positon  " + viewPosition);
        mListView.smoothScrollToPositionFromTop(position, Math.abs(offset));
    }
}
}

R.layout.inflate_track_adapter

<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"
    android:background="@color/lite_brown" >

    <TextView
        android:id="@+id/trackItems"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/trackImage"
        android:layout_marginTop="5dp"
        android:paddingBottom="5dp"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"
        android:textSize="16sp" />

    <TextView
        android:id="@+id/trackHeading"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/trackTop_Layout"
        android:layout_marginLeft="16dp"
        android:paddingBottom="5dp"
        android:paddingTop="10dp"
        android:textSize="18sp"
        android:textStyle="bold" />


    <ImageView
        android:id="@+id/trackImage"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/trackHeading"
        android:layout_marginTop="5dp" />

</RelativeLayout>

person Zohaib Akram    schedule 23.07.2014    source источник
comment
опубликуйте свой код, что вы пробовали..   -  person Shailendra Madda    schedule 23.07.2014
comment
И объясните подробнее, почему вам нужно загружать все элементы сразу, потому что, например, если вы пытаетесь загрузить изображения или что-то тяжелое, ваше приложение рухнет из-за памяти.   -  person maxime1992    schedule 23.07.2014
comment
@Maxime Я загружаю изображения из актива, и я хочу загрузить все сразу, потому что, когда я прокручиваю список, его загружаемое изображение в этот раз дает плохой эффект, например, мерцание.   -  person Zohaib Akram    schedule 23.07.2014
comment
@Maxime мои изображения имеют разную высоту.   -  person Zohaib Akram    schedule 23.07.2014
comment
@Zohaib Ты нашел решение?   -  person hybrid    schedule 16.06.2016
comment
Я не нашел лучшего решения, потому что это собственное поведение класса адаптера для загрузки только видимого элемента.   -  person Zohaib Akram    schedule 17.06.2016


Ответы (1)


@Zohaib хорошо, поэтому, если вам нужно загрузить изображения в свой список без негативного влияния на производительность, я настоятельно рекомендую вам использовать этот учебник:

http://dahliascherr.blogspot.fr/2012/04/tutorial-android-les-listes.html

Это на французском языке, так что я подытожу более важное для вас.

Вы должны использовать держатель. Действительно, держатель создаст объект только один раз при загрузке представления и сохранит его в памяти, чтобы избежать задержки в следующий раз, когда вы его увидите. Это должно быть идеально для вас, вот пример из учебника:

//membre de classe (ne dépend pas de l'instance de la classe contenante)
// utilisée pour stocker des références
static class ViewHolder {
    public TextView nameView;
    public TextView sizeView;
    public ImageView iconeView;
}

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

    ViewHolder holder;

    View rowView = convertView;

    if (rowView == null) {
        //création de l’objet View à partir de la ressource Layout
        rowView = mInflater.inflate(R.layout.row_list, null);

        holder = new ViewHolder();
        holder.nameView = (TextView) rowView.findViewById(R.id.name);
        holder.sizeView = (TextView) rowView.findViewById(R.id.size);
        holder.iconeView = (ImageView) rowView.findViewById(R.id.icon);
        rowView.setTag(holder);
    }

    else {
        holder = (ViewHolder) rowView.getTag();
    }

    //récupération du document identifié par sa position dans la liste
    Document document = mDocuments.get(position);

    //Valorisation du Texte1 de la Vue avec le nom du document
    holder.nameView.setText(document.getName());

    //Valorisation du Texte2 avec la taille du document
    holder.sizeView.setText(String.valueOf(document.getSize()) + "Ko");

    //Affichage de l’icône correspondante
    holder.iconeView.setImageResource(document.getIcone());

    return rowView;
}

Некоторые пояснения: статический класс ViewHolder является членом класса. Вы должны объявить его внутри вашего адаптера.

И метод getview, который я предоставил, использует viewholder.

Попробуйте и скажите мне, если это лучше ;)!

Удачи

person maxime1992    schedule 23.07.2014
comment
спасибо за ответ, я уже использую шаблон держателя представления :( я хочу загрузить все элементы сразу, это означает, что когда я передаю адаптер в адаптер списка, адаптер должен повторяться до всего размера элементов, его только итерация к тому количеству элементов, которые видны для Посмотреть список . - person Zohaib Akram; 23.07.2014
comment
Я провел небольшое исследование, возможно, вы могли бы найти свое счастье с этим: to-preload-before-users-can" title="отображение фотографий в списке, как заставить адаптер предварительно загружаться до того, как пользователи смогут"> stackoverflow.com/questions/11696584/ :) - person maxime1992; 23.07.2014