列出滚动滞后

时间:2013-02-20 10:39:39

标签: android listactivity smooth-scrolling

我的应用是一个列表活动,其中包含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;  }}

1 个答案:

答案 0 :(得分:0)

首先从tf=Typeface.createFromAsset(context.getAssets(),"BFantezy.ttf");方法中删除getView行,并将其用作字段(使其可重复使用)。例如,您可以在TypeFace方法中创建onCreate()

其次,你不是回收意见。当适配器调用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()方法中使用耗时的操作,因为每次在列表视图上滚动/滚动时都会调用它。

希望这有帮助。