2012-04-21 3 views
-1

私のアプリケーションでは、MySQLサーバーデータベースからすべてのイメージと名前をAndroidモバイルにフェッチしています。エミュレータ画面がHVGAの場合、5つのイメージと名前のみが表示されます。 LogCatでは、わずか5名しか印刷されません。画面をスクロールすると、画面に表示される名前の数だけ多くの名前が印刷されます。その代わりに、すべての名前をスクロールする前に印刷する必要があります。Androidのカスタムリストビューでスクロールする前にすべての名前を印刷する方法

public class VegdishesListview extends BaseAdapter { 
    String qrimage; 
    Bitmap bmp, resizedbitmap; 
    Bitmap[] bmps; 
    Activity activity = null; 
    private LayoutInflater inflater; 

    private ImageView[] mImages; 
    String[] itemimage; 
    TextView[] tv; 
    String itemname,price,desc; 
    String[] itemnames; 
    String[] prices; 
    String[] descs; 
    HashMap<String, String> map = new HashMap<String, String>(); 

    public VegdishesListview(Context context, JSONArray imageArrayJson) { 
     //inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     // imageLoader = new ImageLoader(activity); 
     inflater = LayoutInflater.from(context); 
     this.mImages = new ImageView[imageArrayJson.length()]; 
     this.bmps = new Bitmap[imageArrayJson.length()]; 
     this.itemnames = new String[imageArrayJson.length()]; 
     this.prices = new String[imageArrayJson.length()]; 
     this.descs = new String[imageArrayJson.length()]; 
     try { 
      for (int i = 0; i < imageArrayJson.length(); i++) { 
       JSONObject image = imageArrayJson.getJSONObject(i); 
       qrimage = image.getString("itemimage"); 
       itemname = image.getString("itemname"); 
       price = image.getString("price"); 
       desc = image.getString("itemdesc"); 

       itemnames[i] = itemname; 
       prices[i] = price; 
       descs[i] = desc; 

       byte[] qrimageBytes = Base64.decode(qrimage.getBytes()); 

       bmp = BitmapFactory.decodeByteArray(qrimageBytes, 0, 
                qrimageBytes.length); 
       int width = 100; 
       int height = 100; 
       resizedbitmap = Bitmap.createScaledBitmap(bmp, width, height, 
                  true); 
       bmps[i] = bmp; 

       mImages[i] = new ImageView(context); 
       mImages[i].setImageBitmap(resizedbitmap); 

       mImages[i].setScaleType(ImageView.ScaleType.FIT_START); 

       // tv[i].setText(itemname); 
      } 
      System.out.println(map); 
     } 
     catch (Exception e) { 
      // TODO: handle exception 
     } 
    } 

    public int getCount() { 
     return mImages.length; 
    } 

    public Object getItem(int position) { 
     return position; 
    } 

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

    public View getView(final int position, View convertView, ViewGroup parent) { 
     View vi = convertView; 

     vi = inflater.inflate(R.layout.vegdisheslistview, null); 

     TextView text = (TextView)vi.findViewById(R.id.vegdishestext); 
     ImageView image = (ImageView)vi.findViewById(R.id.vegdishesimage); 
     TextView text1 = (TextView)vi.findViewById(R.id.vegdishesprice); 
     TextView text2 = (TextView)vi.findViewById(R.id.vegdishesdesc); 
     image.setImageBitmap(bmps[position]); 
     text.setText(itemnames[position]); 
     text1.setText(prices[position]); 
     text2.setText(descs[position]); 
     System.out.println(itemnames[position]); 

     return vi; 
    } 

これは私のカスタムリストビューのXMLレイアウトです。必要に応じてコードを変更するにはどうすればよいですか?

+0

あなたが印刷しているJavaコードを投稿してください – kishu27

答えて

0

リスト・ビューは、大量データのリストを表示するために作成されますが、モバイル・デバイスのリソースごとに効率があります。

ビューを効率的に再利用します。

リストに指定したアダプターには、getViewメソッドが含まれている必要があります。 これは、単独でlistviewの各位置を表示します。

そして、画面に表示されているビューのみが呼び出されます。 getViewで名前をロギングすることを確信しています。

getViewメソッドをスクロールすると、すべてのビューが画面に描画されるようにもう一度呼び出されます。

すべてのデータを一度に印刷する場合は、アダプタを設定する前に実行します。 でもそれは賢明ではありません。実際に表示する必要があるものだけを読み込みます。

+0

ya ..its正しい – Vinoth

+0

私のコードを変更することができます。私のコードを参照してください解決策を教えてください – Vinoth

+0

@ジャバネーター私の答えはどう違っていますか? –

0

これはデフォルトのListView操作で、Android ListViewではビューをリサイクルします。言い換えれば、一度に画面上に置くことができる項目の数だけを考慮に入れます。そのため、あなたの場合、画面上に5つの要素しか表示されません。

詳細については、AndroidのドキュメントのAdapterViewを参照してください。

関連する問題