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;  }}
4

1 回答 1

0

First remove tf=Typeface.createFromAsset(context.getAssets(),"BFantezy.ttf"); line from your getView method and use it as a field (Which makes it reusable). You can create your TypeFace in onCreate() method for example.

And second, you are not recycling views. You are creating new row when your adapter calls getView() method. The proper implementation of getView() method is something like below:

@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;
}

For more efficiency, don't use time consuming operations in getView() method because it will be called everytime you fling/scroll on your listview.

Hope this helps.

于 2013-02-20T13:54:47.847 回答