0

GridView を使用して GridView にカスタム レイアウトを追加すると、このエラーが表示され、アプリの動作が非常に遅くなります

  02-28 18:39:59.252: I/Choreographer(5586): Skipped 263 frames!  The application may be doing too much work on its main thread.

私のコード:

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

        View vi1=convertView;
        if(convertView==null){

            vi1 = inflater.inflate(R.layout.my_layout, null);

            ImageView imv = (ImageView) vi1.findViewById(R.id.Image);
            ImageView imv2 = (ImageView) vi1.findViewById(R.id.imageView2);
            TextView tw1 = (TextView) vi1.findViewById(R.id.lName);
       //     TextView tw2 = (TextView) vi1.findViewById(R.id.County);
         //   TextView tw3 = (TextView) vi1.findViewById(R.id.user);
//          imageLoader.DisplayImage(null, imv);
    //        imageLoader.DisplayImage(null, imv2);
            tw1.setText("AZ");
        }


          return vi1;


    }
4

2 に答える 2

1

の実装getView()は非常に非効率的です。改善のための「ViewHolder」または「RowWrapper」戦略を検索します。出発点としては、Android 開発者サイトのこのリソースが適切ですが、このトピックに関する Romain Guy の Google I/O 2010 プレゼンテーションを読むことを強くお勧めします。必要に応じて、彼のセッションの YouTube ビデオもあります。

結果は最終的に次のようになります。

@Override public View getView(int position, View convertView, ViewGroup parent) { 
    ViewHolder holder; 
    if (convertView == null) { 
        convertView = mInflater.inflate(R.layout.my_layout, parent, false);
        holder = new ViewHolder(); 
        holder.text = (TextView) convertView.findViewById(R.id.lName); 
        holder.img1 = (ImageView) convertView.findViewById(R.id.Image); 
        holder.img2  = (ImageView) convertView.findViewById(R.id.imageView2); 
        convertView.setTag(holder); 
    } else { 
        holder = (ViewHolder) convertView.getTag(); 
    } 
    holder.text.setText("AZ"); 
    holder.img1.setImageBitmap(...); 
    holder.img2.setImageResource(...); 
    return convertView; 
}

static class ViewHolder { 
    TextView text; 
    ImageView img1, img2; 
}
于 2013-02-28T18:18:18.790 に答える
0

getView コードの記述に問題があります。ビューはすべての行に対して毎回作成されています。getView メソッドを使用する正しい方法を以下に示します。ViewHolder クラスを作成する必要があります。

 static class ViewHolder {
    ImageView img1;
    ImageView img2;
    TextView tvTitle;

}

      @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                View row = convertView;
                ViewHolder holder;

                if (row == null) {
                    holder = new ViewHolder();
                    LayoutInflater inflater = ((Activity) context).getLayoutInflater();
                    row = inflater.inflate(R.layout.my_layout, parent, false);
                    holder.play = (Button) row.findViewById(R.id.btn_list_play);
                    holder.img1 = (ImageView) row.findViewById(R.id.img1_id);
                    holder.img2 = (ImageView) row .findViewById(R.id.img2_id);
                    holder.tvTitle = (TextView) row.findViewById(R.id.tvTitle_id);
                    row.setTag(holder);
            }
        else
        {
                        holder = (ViewHolder ) row.getTag();

        }
                    holder.tvTitle.setText("AZ");

                return row;
            }
于 2013-02-28T18:17:21.650 に答える