ورود

View Full Version : لیست ویو طولانی خیلی کند میشه!!



Amin-rz
شنبه 12 مهر 1393, 21:39 عصر
سلام.
یه لیست ویو می خوام بسازم که 10 تا 10 تا آیتم بهش اضافه بشه.
مشکلی با کدش ندارم انجامش میدم.
ولی وقتی مثلا 300 تا آیتم(ردیف) دارم و می خوام 10 تا دیگه اضافه کنم حدود 12 ثانیه طول میکشه که آداپتر ست بشه.
دلیلشم اینه که همه 310 تا ردیف رو از اول می خواد ایجاد کنه و نمایش بده.
راهی هست که 300 ردیف دوباره ایجاد نشه و فقط اون 10 تا ردیف جدید به لیست اضافه بشه؟

rezaricky
شنبه 12 مهر 1393, 21:51 عصر
سلام
کدت رو بذار تا بیشتر بشه کمک کرد.
باید اینطوری بنویسی :
adapter.add(item);
adapter.notifyDataSetChanged();

Amin-rz
شنبه 12 مهر 1393, 22:13 عصر
private ArrayAdapter arrayAdapter;
ArrayList<String> offlineret;
int end = 9;
String[] string;


در ابتدا 10تا آیتم نشون میده:

//لیست موضوعات آفلاین

final String dataOffline = "اس ام اس جوك****اس ام اس خنده دار****تقديم به****اس ام اس سرکاری****اس ام اس ضد دختر**** اس ام اس ضد پسر ****... چیست ؟****کل کل های فوتبالی****اس ام اس پـ نه پـ****اصن يه وضي****درد دل شما ****سوتی های شما****اس ام اس التماس دعا****اس ام اس امتحانات****اس ام اس انتظار****اس ام اس انتظار ظهور****اس ام اس انگلیسی****اس ام اس با موضوع خداوند****اس ام اس بازي با كاراكترها****اس ام اس به سلامتی****اس ام اس به یاد بودن****دقت کردین****اس ام اس بی قراری****اس ام اس بی معرفتی****اس ام اس بی وفایی****اس ام اس تنفر****اس ام اس تنهایی****اس ام اس تیکه دار****اس ام اس جدایی****اس ام اس خداحافظی****اس ام اس خفن****اس ام اس خیانت****اس ام اس دروغ****اس ام اس دعا****اس ام اس دل بستن****اس ام اس دل شکسته****اس ام اس دل گرفته****اس ام اس دلتنگی****اس ام اس دلخوري****فانتزی من اینه****اس ام اس رفاقت و مرام****اس ام اس سخنان بزرگان****اس ام اس سربازی****اس ام اس سنگین****اس ام اس شب امتحان****اس ام اس شب بخیر****اس ام اس شكست عشقي****اس ام اس شیرین و فرهاد****اس ام اس صبح بخیر****اس ام اس ضد حال****اس ام اس عرفانی ****اس ام اس غرور****اس ام اس غمگین****اس ام اس فاصله و دوری****اس ام اس فراموشی****اس ام اس فلسفی****اس ام اس فيسبوكي****اس ام اس قهر و آشتی****اس ام اس محبت****اس ام اس معرفتي****اس ام اس معني دار****اس ام اس مهربانی****اس ام اس نا امیدی****اس ام اس نامردی****اس ام اس نیمه شب****اس ام اس يخ (بي مزه)****اس ام اس کودکانه****اس ام اس گریه دار****لبخندك****اس ام اس اربعین****اس ام اس بهار****اس ام اس تابستان****اس ام اس تبریک تولد****اس ام اس تبریک تولد نوزاد****اس ام اس تبریک حج****اس ام اس تسلیت****اس ام اس دهه فجر****اس ام اس رحلت****اس ام اس رمضان****اس ام اس روز ارتش****اس ام اس روز بارانی****اس ام اس روز جمعه****اس ام اس روز جوان****اس ام اس روز خلیج فارس****اس ام اس روز دانش آموز****اس ام اس روز دانشجو****اس ام اس روز درختکاری****اس ام اس روز زن****اس ام اس روز عرفه****اس ام اس روز مادر****اس ام اس روز مرد****اس ام اس روز معلم*******اس ام اس روز مهندس****اس ام اس روز پاسدار****اس ام اس روز پدر****اس ام اس روز پرستار****اس ام اس روز کارگر*****اس ام اس زمستان****اس ام اس سالگرد ازدواج****اس ام اس سپندار مذگان****اس ام اس سیزده بدر****اس ام اس شب قدر****اس ام اس شب یلدا****اس ام اس شهادت****اس ام اس عید غدیر خم****اس ام اس عید فطر****اس ام اس عید قربان****اس ام اس عید مبعث****اس ام اس عید نوروز****اس ام اس كنكوري****اس ام اس لیله الرغایب****اس ام اس محرم****اس ام اس نیمه شعبان****اس ام اس ولادت****اس ام اس کریسمس****اس ام اس ۴ شنبه سوری****اس ام اس آرزو****يادش بخير****دسته‌بندی نشده";


//جدا کردن قسمت های متن
string = dataOffline.split("\\*\\*\\*\\*");
offlineret = new ArrayList<String>();
for(int i =0;i<=end;i++){
offlineret.add(i,string[i]);
}


//تنظیم آداپتر در لیست ویو
arrayAdapter = new AdaptereMan (this, R.layout.offlinerow, R.id.label, offlineret);
listOffline.setAdapter(arrayAdapter);


دکمه آپدیت لیست:


ibtn4.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View v) {

// TODO Auto-generated method stub


updatelist();
listOffline.setAdapter(arrayAdapter);



}

});



تابع آپدیت:

public void updatelist(){

for(int i=end+1;i<=end+10;i++){
offlineret.add(i,string[i]);}
end=end+10;


}

rezaricky
شنبه 12 مهر 1393, 22:21 عصر
در متد onClick ات اینو بنویس ببین مشکل حل میشه یا نه :
updatelist();
arrayAdapter.notifyDataSetChanged();

Amin-rz
شنبه 12 مهر 1393, 22:41 عصر
در متد onClick ات اینو بنویس ببین مشکل حل میشه یا نه :
updatelist();
arrayAdapter.notifyDataSetChanged();

نه حل نشد.فرقی نکرد.
این برنامه پیامکی ها که 1000 تا پیامک رو نشون میده چکار میکنن؟
همشون هم 10 تا 10 اضافه میشن ولی خیچکدوم انقدر کند نیستن.
دقیقا وقفه ایجاد شده برای آپدیت لیست به اندازه همون 10 آیتم اضافه شده جدید هست.

rezaricky
شنبه 12 مهر 1393, 22:42 عصر
این مقاله رو بخونی میتونی مشکلتو حل کنی :
https://github.com/thecodepath/android_guides/wiki/Using-an-ArrayAdapter-with-ListView

rezaricky
شنبه 12 مهر 1393, 22:50 عصر
برای افزایش کارایی از ViewHolder Pattern که توی لینکی که دادم توضیح داده استفاده کن

این لینک هم راه حل هایی خوبی داره : http://stackoverflow.com/questions/2833057/background-listview-becomes-black-when-scrolling?rq=1

Amin-rz
یک شنبه 13 مهر 1393, 08:25 صبح
برای افزایش کارایی از ViewHolder Pattern که توی لینکی که دادم توضیح داده استفاده کن

این لینک هم راه حل هایی خوبی داره : http://stackoverflow.com/questions/2833057/background-listview-becomes-black-when-scrolling?rq=1

متوجه نشدم مشکل من چه ربطی به این داره.یا چجور با این مثال کارمو راه بندازم.

rezaricky
یک شنبه 13 مهر 1393, 09:27 صبح
یکی از مشکلات کار با ListView با تعداد ایتم های زیاد کندی اونه که میشه با استفاده از ایجاد یک Custom ArrayAdapter و استفاده از الگوی ViewHolder کارایی ListView رو تا حد زیادی افزایش داد :

دلیل کندی در ListView هم متد findViewById هست که برای هر ردیف فراخوانی میشه و باعث کندی برنامه میشه.
که با استفاده از این الگو تعداد فراخوانی های لازم برای این متد به حداقل ممکن میرسه.
item_info.xml :
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
android:layout_height="match_parent" >
<TextView
android:id="@+id/tvName"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Name" />


</LinearLayout>
TestAdapter.java
public class TestAdapter extends ArrayAdapter<String> { // View lookup cache
private static class ViewHolder {
TextView name;
}


public UsersAdapter(Context context, ArrayList<String> names) {
super(context, R.layout.item_info, names);
}


@Override
public View getView(int position, View convertView, ViewGroup parent) {
// Get the data item for this position
String name = getItem(position);
// Check if an existing view is being reused, otherwise inflate the view
ViewHolder viewHolder; // view lookup cache stored in tag
if (convertView == null) {
viewHolder = new ViewHolder();
LayoutInflater inflater = LayoutInflater.from(getContext());
convertView = inflater.inflate(R.layout.item_info, parent, false);
viewHolder.name = (TextView) convertView.findViewById(R.id.tvName);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
// Populate the data into the template view using the data object
viewHolder.name.setText(name);
// Return the completed view to render on screen
return convertView;
}
}
حالا فقط لازمه که بجای ArrayAdapter از TestAdapter استفاده کنی .
و البته باید item_info که بالا نوشتم بجای Layout خودت استفاده کنی.
موفق باشی.

Amin-rz
یک شنبه 13 مهر 1393, 23:09 عصر
از view holder هم استفاده كردم.
بهتر شد ولي بازم خيلي كنده.
براي لود 1000تا پيامك تو ليست حدود 1 دقيقه بايد منتظر موند.
تو نت هم سرچ كردم چيز بدرد بخوري گير نياوردم.

چطور ميشه وقتي كاربر اسكرول رو پايين ميبره پيامك ها لود بشن؟

haniiii
دوشنبه 14 مهر 1393, 00:08 صبح
احتمالا مشکل اصلی توی getview هست ... پردازش اطلاعات زیاده ... باعث میشه طول بکشه تا متد getview صدا زده بشه و return کنه درنتیجه view فریز میشه و حس میکنی کند شده

saeed_g21
دوشنبه 14 مهر 1393, 00:11 صبح
یک عامل دیگه ای که باعث میشه سرعتش پایین بیاد استفاده از TypeFace هست

آیا از Typeface استفاده کردی ؟

Amin-rz
دوشنبه 14 مهر 1393, 08:04 صبح
احتمالا مشکل اصلی توی getview هست ... پردازش اطلاعات زیاده ... باعث میشه طول بکشه تا متد getview صدا زده بشه و return کنه درنتیجه view فریز میشه و حس میکنی کند شده


یک عامل دیگه ای که باعث میشه سرعتش پایین بیاد استفاده از TypeFace هست

آیا از Typeface استفاده کردی ؟

برای تغییر فونت پیامک ها مجبورم از Typeface استفاده کنم.
برای لود 1600 تا پیامک حدود 1:30 دقیقه طول میکشه.
Typeface رو برداشتم شد 30 ثانیه.
ولی خب این چاره نمیشه.
چون هم نیاز دارم فونت عوض بشه هم اینکه من الان فقط متن پیامک ها رو + فونتشون تو getview ست می کنم.
علاوه بر این ها باید دکمه هایی برای "اضافه به علاقمندی ها"+"ارسال پیامک"+"اشتراک گذاری"+"کپی"+"حذف" و ... زیر هر پیامک بذارم که همه شونو باید تو getview تعریف کنم.
حتی اگه فونت هم عوض نکنم باز خیلی کند میشه.

اینم آداپتر ساده من که فقط متن و فونت textview رو ست می کنم بدون اون دکمه ها که گفتم:







private class AdaptereMan3 extends ArrayAdapter <String> {

private LayoutInflater myInflater;

public AdaptereMan3(Context context, int resource,
int textViewResourceId, String[] string3) {
super(context, resource, textViewResourceId,string3);
// TODO Auto-generated constructor stub

myInflater = LayoutInflater.from(context);
}

public class ViewHolder {
TextView matn;
Typeface tf;
}

ViewHolder holder;

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

if (convertView == null) {
convertView = myInflater.inflate(R.layout.smsrow, null);
holder = new ViewHolder();
holder.matn = (TextView) convertView.findViewById(R.id.labelsms);

holder.tf = Typeface.createFromAsset(getAssets(), "MJ_DINAR TWO MEDIUM.ttf");
holder.matn.setTypeface(holder.tf);

convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}

holder.matn.setText(string3[makan]);

return convertView;
}
}

rezaricky
دوشنبه 14 مهر 1393, 08:52 صبح
روی دستگاه واقعی تست میکنی یا روی شبیه ساز ؟
این دو تا روش رو هم تست کن :
1- scrollingCache رو به تگ listview در layout اضافه کن :
<ListView android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:scrollingCache="false"
/>

2- cacheColorHint رو به listview اضافه کن :
<ListView android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:cacheColorHint="@android:color/transparent
/>

یکبار هم هر دوتا رو با هم اضافه کن و تست کن

haniiii
دوشنبه 14 مهر 1393, 16:29 عصر
لازم نیست به ازای هر view یه typeface بسازی به عبارت دیگه کد زیر رو خارج از getview قرار بده و typeface رو field تعریف کن

Typeface.createFromAsset(getAssets(), "MJ_DINAR TWO MEDIUM.ttf");

Amin-rz
سه شنبه 15 مهر 1393, 21:23 عصر
لازم نیست به ازای هر view یه typeface بسازی به عبارت دیگه کد زیر رو خارج از getview قرار بده و typeface رو field تعریف کن

Typeface.createFromAsset(getAssets(), "MJ_DINAR TWO MEDIUM.ttf");

یعنی کجا بذارمش تو پست 13 ؟
من که هر جا میذارمش باز کنده.
آره رو گوشی تست میکنم 1:30 دقیقه طول میکشه.
واقعا قاط زدم دیگه هر چی هم سرچ می کنم چیز بدرد بخوری نمی بینم.
بابا برنامه پیامکی هست 2000 تا اس ام اس تو 5 ثانیه میاد تو لیست.
البته اونا به تدریج که پایین میری اسکرول بار هر جا که باشه پیامک اون قسمت رو لود می کنه.

Amin-rz
شنبه 19 مهر 1393, 11:41 صبح
مشکلو پیدا کردم :
لیست تو اسکرول ویو بود که انقدر کند میشد.:ناراحت:

saeed_g21
شنبه 19 مهر 1393, 11:45 صبح
خوب لیست خودش Scroll میشه دیگه چه نیازی به ScrollView داشت ؟؟؟

Amin-rz
شنبه 19 مهر 1393, 12:17 عصر
دو سه تا آيتم بالاي ليست دارم كه همراه با ليست بايد اسكرول ميشدن.
يعني وقتي كاربر رو به پايين ليست رفت اون آيتم ها هم از ديد خارج ميشدن.