2015-12-31 46 views
0

那麼我的自定義listview是非常非常慢,幾乎無法使用,我一直在閱讀很多帖子,但沒有人幫助我解決它,我希望你們中的一個人可以,謝謝。自定義listview太慢

這裏是我的項目的ListView XML

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 

    <ImageView 
     android:layout_width="match_parent" 
     android:layout_height="300px" 
     android:id="@id/iv_tipo" 
     android:scaleType="centerCrop" 
     android:layout_marginLeft="5px" 
     android:layout_marginRight="5px" 
     /> 



     <TextView 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:background="@color/material_blue_grey_800" 
      android:textColor="#ffffff" 
      android:textAlignment="center" 
      android:textSize="27px" 
      android:paddingLeft="10px" 
      android:id="@id/tv_titulo" 
      android:paddingTop="10px" 
      android:paddingBottom="20px" 
      android:paddingRight="5px" 
      android:layout_marginLeft="5px" 
      android:layout_marginRight="5px"/> 



</LinearLayout> 

這裏是適配器

public class TrucoListAdapter extends ArrayAdapter { 

    ArrayList<Truco> trucos; 

    public TrucoListAdapter(Context context, ArrayList<Truco> trucos) { 
     super(context, 0, trucos); 
     trucos = this.trucos; 

    } 

    @Override 
    public Object getItem(int position) { 
     return super.getItem(super.getCount() - position - 1); 
    } 

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


     if(convertView == null){ 
      LayoutInflater inflater = (LayoutInflater)parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      convertView = inflater.inflate(R.layout.truco_list_item, null); 

     } 


     ImageView ivTipo = (ImageView) convertView.findViewById(R.id.iv_tipo); 
     TextView tvTitulo = (TextView) convertView.findViewById(R.id.tv_titulo); 

     Truco truco = (Truco)getItem(position); 

     switch (truco.getTipo()) { 
      case "m": 
       ivTipo.setImageResource(R.drawable.coins); 
       break; 
      case "c": 
       ivTipo.setImageResource(R.drawable.cards); 
       break; 
      case "a": 
       ivTipo.setImageResource(R.drawable.guess); 
       break; 
      case "d": 
       ivTipo.setImageResource(R.drawable.desa); 
       break; 
      default: 
       ivTipo.setImageResource(R.drawable.home); 

     } 

      tvTitulo.setText(truco.getTitulo()); 

     return convertView; 
    } 

} 

編輯:我修改了適配器@KishanSoni建議我,但它仍然是緩慢的。

+0

那是因爲你沒有使用**'ViewHolder pattern' ** – EpicPandaForce

+0

@EpicPandaForce感謝您的快速答覆,我試過一次,但沒有解決的麻煩 – Rorschach

+0

首先是使用BaseAdapter代替ArrayAdapter –

回答

0

使用底座適配器,而不是數組適配器 還可以使用支架模式, 比如我我給你的樣品是

public class MyAdpt extends BaseAdapter { 

    private LayoutInflater mInflater; 

    public ArrayList<String> mdata; 

    public MyAdpt (ArrayList<String> data) { 
     mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     mdata = data; 
    } 

    @Override 
    public int getCount() { 
     return mdata.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return mdata.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

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

     final ItemViewHolder itemHolder; 

     if (convertView == null) { 
      itemHolder = new ItemViewHolder(); 
      convertView = mInflater.inflate(R.layout.row_layout, null); 
      itemHolder.textview= (TextView) convertView.findViewById(R.id.textview); 
      convertView.setTag(itemHolder); 
     } else { 
      itemHolder = (ItemViewHolder) convertView.getTag(); 
     } 

     itemHolder.textview.setText(mdata.get(position)); 

     return convertView; 
    } 

    public class ItemViewHolder { 
     TextView textview; 
    } 
} 

編輯:

public class TrucoListAdapter extends BaseAdapter { 

ArrayList<Truco> trucos; 

public TrucoListAdapter(Context context, ArrayList<Truco> trucos) { 
    super(context, 0, trucos); 
    trucos = this.trucos; 
} 

@Override 
public int getCount() { 
    return trucos.size(); 
} 

@Override 
public Object getItem(int position) { 
    return trucos.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

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

    final ItemViewHolder itemHolder; 

    if (convertView == null) { 
     itemHolder = new ItemViewHolder(); 
     LayoutInflater inflater = (LayoutInflater) parent.getContext() 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = inflater.inflate(R.layout.truco_list_item, null); 

     itemHolder.ImageView ivTipo = (ImageView) convertView.findViewById(R.id.iv_tipo); 
     itemHolder.TextView tvTitulo = (TextView) convertView.findViewById(R.id.tv_titulo); 
     convertView.setTag(itemHolder); 
    } else { 
     itemHolder = (ItemViewHolder) convertView.getTag(); 
    } 

    Truco truco = (Truco) getItem(position); 

    switch (truco.getTipo()) { 
    case "m": 
     ivTipo.setImageResource(R.drawable.coins); 
     break; 
    case "c": 
     ivTipo.setImageResource(R.drawable.cards); 
     break; 
    case "a": 
     ivTipo.setImageResource(R.drawable.guess); 
     break; 
    case "d": 
     ivTipo.setImageResource(R.drawable.desa); 
     break; 
    default: 
     ivTipo.setImageResource(R.drawable.home); 

    return convertView; 
} 

public class ItemViewHolder { 
    ImageView ivTipo; 
    TextView tvTitulo; 
} 
} 
+0

我完全按照你的方式做了,而且它仍然很慢/:@KishanSoni – Rorschach

0

一些問題 -

Truco類:getTito()和getTitulo() - 它們是否執行任何昂貴的處理?

繪圖小(圖標大小)? IE,你正在處理200K drawables嗎?

你有多少trucos加載到數組列表中?

對不起,我不能添加此作爲評論,由於低代表。