2013-02-20 109 views
0

我的应用程序是一个列表活动其中包含26行,每个包含图像和文本,每件事情都运行良好,但滚动列表显示一些滞后,特别是当它在默认情况下平滑滚动时不平滑Android的联系人列表,列表滚动滞后

我想:lv.setFastScrollEnabled(true);

也试图减少每行中的图像大小,直到我换成ic_launcher图像全部图像进行测试,但同样的滞后是存在的。

,但它使我光滑列表的滚动没有区别,任何建议或帮助将不胜感激。 注:班阿拉伯语得名。

我的代码:

菜单类:

public class Menu extends ListActivity { 
    String classes[] = { "المقدمة", "رحلتي", "اليوم الأول", "اليوم الثاني", "اليوم الثالث", 
     "اليوم الرابع", "اليوم الخامس", "اليوم السادس", "اليوم السابع", "اليوم الثامن", "اليوم التاسع", "اليوم العاشر", "اليوم الحادي عشر", 
     "اليوم الثاني عشر", "اليوم الثالث عشر", "اليوم الرابع عشر", "اليوم الخامس عشر", "اليوم السادس عشر", "اليوم السابع عشر", 
     "اليوم الثامن عشر", "اليوم التاسع عشر", "اليوم العشرون", "اليوم الحادي والعشرين", "اليوم الثاني والعشرين", "اليوم الثالث والعشرين", "الخاتمة"}; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    this.requestWindowFeature(Window.FEATURE_NO_TITLE); 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    // create background for whole list as image 
    ListView lv = getListView(); 
    lv.setFastScrollEnabled(true); 
    lv.setCacheColorHint(0); 
    lv.setDivider(new ColorDrawable(0xFFDAB999)); 
    lv.setSelector(android.R.color.transparent); 
    lv.setDividerHeight(10); 
    lv.setPadding(50, 0, 50, 0); 
    lv.setVerticalScrollBarEnabled(false); 
    lv.setBackgroundResource(R.drawable.a); 

    setListAdapter(new MyArrayAdapter(this, classes)); } 

@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 
    // TODO Auto-generated method stub 
    super.onListItemClick(l, v, position, id); 
    String cheese = classes[position]; 
    if(cheese.equals("المقدمة")) cheese = "Introduction"; 
    if(cheese.equals("رحلتي")) cheese = "MyTrip"; 
    if(cheese.equals("اليوم الأول")) cheese = "Day1"; 
    if(cheese.equals("اليوم الثاني")) cheese = "Day2"; 
    if(cheese.equals("اليوم الثالث")) cheese = "Day3"; 
    if(cheese.equals("اليوم الرابع")) cheese = "Day4"; 
    if(cheese.equals("اليوم الخامس")) cheese = "Day5"; 
    if(cheese.equals("اليوم السادس")) cheese = "Day6"; 
    if(cheese.equals("اليوم السابع")) cheese = "Day7"; 
    if(cheese.equals("اليوم الثامن")) cheese = "Day8"; 
    if(cheese.equals("اليوم التاسع")) cheese = "Day9"; 
    if(cheese.equals("اليوم العاشر")) cheese = "Day10"; 
    if(cheese.equals("اليوم الحادي عشر")) cheese = "Day11"; 
    if(cheese.equals("اليوم الثاني عشر")) cheese = "Day12"; 
    if(cheese.equals("اليوم الثالث عشر")) cheese = "Day13"; 
    if(cheese.equals("اليوم الرابع عشر")) cheese = "Day14"; 
    if(cheese.equals("اليوم الخامس عشر")) cheese = "Day15"; 
    if(cheese.equals("اليوم السادس عشر")) cheese = "Day16"; 
    if(cheese.equals("اليوم السابع عشر")) cheese = "Day17"; 
    if(cheese.equals("اليوم الثامن عشر")) cheese = "Day18"; 
    if(cheese.equals("اليوم التاسع عشر")) cheese = "Day19"; 
    if(cheese.equals("اليوم العشرون")) cheese = "Day20"; 
    if(cheese.equals("اليوم الحادي والعشرين")) cheese = "Day21"; 
    if(cheese.equals("اليوم الثاني والعشرين")) cheese = "Day22"; 
    if(cheese.equals("اليوم الثالث والعشرين")) cheese = "Day23"; 
    if(cheese.equals("الخاتمة")) cheese = "Conclusion"; 

    try{ 
     Intent ourIntent; 
     if(position>1 && position<25) { 
       Class ourClass = Class.forName("com.tsn.dr.MyDay"); 
       ourIntent = new Intent(Menu.this, ourClass); 
       ourIntent.putExtra("cheese", cheese);} 
     else { 
       Class ourClass = Class.forName("com.tsn.dr." + cheese); 
       ourIntent = new Intent(Menu.this,ourClass); }    
      startActivity(ourIntent); }                         
       catch (ClassNotFoundException e){ 
          e.printStackTrace(); }} 

public boolean onCreateOptionsMenu(android.view.Menu menu) { 

MenuInflater inflater = getMenuInflater(); 
inflater.inflate(R.menu.cool_menu, menu); 

getLayoutInflater().setFactory(new Factory() { 
public View onCreateView(String name, Context context, 
AttributeSet attrs) { 

if (name .equalsIgnoreCase("com.android.internal.view.menu.IconMenuItemView")) { 
try { 

LayoutInflater li = LayoutInflater.from(context); 
final View view = li.createView(name, null, attrs); 

new Handler().post(new Runnable() { 
public void run() { 


view .setBackgroundResource(R.drawable.border3); 

((TextView) view).setTextSize(25); 


Typeface face=Typeface.createFromAsset(getAssets(),"BFantezy.ttf");  
((TextView) view).setTypeface(face); 
((TextView) view).setTextColor(Color.RED); 
} 
}); 
return view; 
} catch (InflateException e) { 
} catch (ClassNotFoundException e) { 
} 
} 
return null; 
} 
}); 
return super.onCreateOptionsMenu(menu); 
} 


@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // TODO Auto-generated method stub 
    switch (item.getItemId()) { 
    case R.id.aboutUs: 
     Intent i = new Intent("com.tsn.dr.ABOUT"); 
     startActivity(i); 

    break; 
    case R.id.preferences: 
     Intent p = new Intent("com.tsn.dr.PREFS"); 
     startActivity(p); 
    break; 
    case R.id.exit: 
     finish(); 
    break; 
} 
return false; 
       } 
     } 

MyArrayAdapter类:

public class MyArrayAdapter extends ArrayAdapter<String> { 
private final Activity context; 
private final String[] classes; 
Typeface tf; 

public MyArrayAdapter(Activity context, String[] classes) { 
    super(context, R.layout.row, classes); 
    this.context = context; 
    this.classes = classes; 
       } 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    tf=Typeface.createFromAsset(context.getAssets(),"BFantezy.ttf"); 
    LayoutInflater inflater = context.getLayoutInflater(); 
    View rowView = inflater.inflate(R.layout.row, null, true); 
    TextView textView = (TextView) rowView.findViewById(R.id.row_label); 
    ImageView imageView = (ImageView) rowView.findViewById(R.id.row_image); 
    String s = classes[position]; 
    textView.setText(s); 
    ((TextView)textView).setTypeface(tf); 


if (s.startsWith("اليوم الأول")) { 

    imageView.setImageResource(R.drawable.ic_launcher); } 


if (s.startsWith("اليوم الثاني")) { 

    imageView.setImageResource(R.drawable.ic_launcher); } 


if (s.startsWith("اليوم الثالث")) { 

    imageView.setImageResource(R.drawable.ic_launcher); } 


if (s.startsWith("اليوم الرابع")) { 

    imageView.setImageResource(R.drawable.ic_launcher); } 


if (s.startsWith("اليوم الخامس")) { 

    imageView.setImageResource(R.drawable.ic_launcher); } 


if (s.startsWith("اليوم السادس")) { 

    imageView.setImageResource(R.drawable.ic_launcher); } 


if (s.startsWith("اليوم السابع")) { 

    imageView.setImageResource(R.drawable.ic_launcher); } 


if (s.startsWith("اليوم الثامن")) { 

    imageView.setImageResource(R.drawable.ic_launcher); } 


if (s.startsWith("اليوم التاسع")) { 

    imageView.setImageResource(R.drawable.ic_launcher); } 


if (s.startsWith("اليوم العاشر")) { 

    imageView.setImageResource(R.drawable.ic_launcher); } 


if (s.startsWith("اليوم الحادي عشر")) { 

    imageView.setImageResource(R.drawable.ic_launcher); } 


if (s.startsWith("اليوم الثاني عشر")) { 

    imageView.setImageResource(R.drawable.ic_launcher); } 


if (s.startsWith("اليوم الثالث عشر")) { 

    imageView.setImageResource(R.drawable.ic_launcher); } 


if (s.startsWith("اليوم الرابع عشر")) { 

    imageView.setImageResource(R.drawable.ic_launcher); } 


if (s.startsWith("اليوم الخامس عشر")) { 

    imageView.setImageResource(R.drawable.ic_launcher); } 


if (s.startsWith("اليوم السادس عشر")) { 

    imageView.setImageResource(R.drawable.ic_launcher); } 


if (s.startsWith("اليوم السابع عشر")) { 

    imageView.setImageResource(R.drawable.ic_launcher); } 


if (s.startsWith("اليوم الثامن عشر")) { 

    imageView.setImageResource(R.drawable.ic_launcher); } 


if (s.startsWith("اليوم التاسع عشر")) { 

    imageView.setImageResource(R.drawable.ic_launcher); } 


if (s.startsWith("اليوم العشرون")) { 

    imageView.setImageResource(R.drawable.ic_launcher); } 


if (s.startsWith("اليوم الحادي والعشرين")) { 

    imageView.setImageResource(R.drawable.ic_launcher); } 


if (s.startsWith("اليوم الثاني والعشرين")) { 

    imageView.setImageResource(R.drawable.ic_launcher); } 


if (s.startsWith("اليوم الثالث والعشرين")) { 

    imageView.setImageResource(R.drawable.ic_launcher); } 


if (s.startsWith("الخاتمة")) { 

    imageView.setImageResource(R.drawable.ic_launcher); } 


if (s.startsWith("رحلتي")) { 

    imageView.setImageResource(R.drawable.ic_launcher); } 


if (s.startsWith("المقدمة")) { 

    imageView.setImageResource(R.drawable.ic_launcher); } 

return rowView; }} 
+3

您正在创建新行视图每次滚动时,都需要重新使用布局,[使用ViewHolder方法。](http://stackoverflow.com/a/9359237/593709) – 2013-02-20 10:42:12

+0

@Adil Soomro acually我的朋友,我建立了我的列表中使用类和IM不使用的ListView XML,是与ViewHolder方法工作,感谢 – 2013-02-20 11:12:25

+0

所有重要的是你的适配器的实现。 – 2013-02-20 11:13:21

回答

0

首先从getView方法去除tf=Typeface.createFromAsset(context.getAssets(),"BFantezy.ttf");线和使用它作为一个科幻eld(这使得它可重用)。例如,您可以在onCreate()方法中创建TypeFace

第二,你是不是回收的意见。当适配器调用getView()方法时,您正在创建新行。 getView()法的正确实施是类似下面的东西:

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    final ViewHolder holder; 
    if (convertView == null) { 
     holder = new ViewHolder(); 
     // Inflate your row layout 
     convertView = mInflater.inflate(R.layout.YOUR_XML_LAYOUT, null); 
     // set your holder views here. For example; 
     // holder.textview = (TextView) convertView.findViewById(R.id.textview); 
     // 
     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 
    // Customize your row items here! For example: 
    // if (s.startsWith("اليوم الثاني والعشرين")) { 
    // imageView.setImageResource(R.drawable.ic_launcher); } 

    return convertView; 
} 

更多效率,getView()方法不使用耗时的操作,因为它会每次叫你一扔/滚动你的列表视图。

希望这会有所帮助。

+0

我会尝试亲爱的,IM现在外面,后来和重放你,非常感谢 – 2013-02-20 14:20:55

+0

感谢,但还有一两件事,如果我每行中增加图像的大小,这将导致再次滚动的滞后,如何解决。 – 2013-02-26 23:30:23