PDA

View Full Version : مشکل تابع getView داخل کلاس BaseAdapter



NeoFighT
پنج شنبه 21 خرداد 1394, 01:11 صبح
سلام،
یه سری دیتا قراره داخل لیستم لود بشه که این دیتا شامل عکس هم هست.
از ViewHolder هم استفاده کردم که مثلا یک عکس فقط یک بار لود بشه.
ولی مشکل من اینجاست که جایی که نوشتم

if(convertView == null)

فقط و فقط برای 4تا آیتم اول اجرا میشه(مگه نباید برای همه ی آیتم های لیست هر کدوم یک بار اجرا بشه؟)
و توی بقیه آیتم ها این 4تا عکس تکرار شده یعنی عکس خودشون لود نشده.
یعنی فقط 4تا آیتم اول

if(convertView == null)

رو اجرا میکنن و بقیه آیتم ها else رو اجرا میکنن که عکس اصلی آیتم رو نشون نمیدن چون عکس لود نشده و عکس تکراری نشون میدن.

امیدوارم منظورمو فهمیده باشین.

JYasProgramer
پنج شنبه 21 خرداد 1394, 10:36 صبح
سلام آیا متدهای getItem, getItemId, getCount رو در اون BaseAdapter درست ست کردی؟

NeoFighT
پنج شنبه 21 خرداد 1394, 15:03 عصر
سلام آیا متدهای getItem, getItemId, getCount رو در اون BaseAdapter درست ست کردی؟
بله همه رو ست کردم.
امروز سرچ کردم دیدم View هایی که اول لود میکنه رو فقط null میده و بقیه رو که اسکرول میکنی خودش repeat میکنه و باید با holder بهشون مقدار بدی.

JYasProgramer
پنج شنبه 21 خرداد 1394, 17:06 عصر
آره
درون کلاس baseadapter یه آرایه از نوع Integer تعریف کن و تصاویر خودت رو در اون بریز
سپس درهمون کلاس کلاسی با نام holder بساز
یه لایوت بساز که imageview رو ساپورت کنه و ای دی بش بده
حالا در کلاس holder اون لایوتی که تعریف کردی رو به فایل جاوا ضمیمه کن
در متد getView نمونه از holder تعریف کن و متدی که در holder ساختی که به لایوت دارای imgeview میتونه دسترسی داشته باشه رو فراخونی کن و تصاویر رو از آرایه بگیر و بریز داخلش
مثال

public View getView(int position, View convertView, ViewGroup parent)
{
ViewHolder holder = null;
ImageView i11=null;
RowData rowData= getItem(position);
if(null == convertView)
{
convertView = layoutx.inflate(R.layout.list, null);
holder = new ViewHolder(convertView);
convertView.setTag(holder);
}
holder = (ViewHolder) convertView.getTag();
i11=holder.getImage();
i11.setImageResource(imgid[rowData.mId]);

return convertView;
}

private class ViewHolder
{
private View mRow;
private ImageView i11=null;
public ViewHolder(View row)
{
mRow = row;
}

public ImageView getImage()
{
if(null == i11)
{
i11 = (ImageView) mRow.findViewById(R.id.img);
}
return i11;
}
}