2013-12-20 53 views
1

请帮助我解决此问题。在这里,我粘贴我的代码:Android中使用OnClickItemListener时出现OutOfMemoryError

我已经尝试过,但无法找出我失踪的东西。我使用两个片段两个显示列表。现在我想在用户单击第一个列表项时更改第二个片段中的列表数据。默认情况下,将选择零位索引来显示第二个列表中的数据。我正在使用自定义数组适配器来显示这两个片段中的列表。请帮助我们。感谢您的考虑。在这里,我贴我的代码,我正在此错误:

完整代码:onItemClickListener between two fragments

第二块碎片:

public class ProductListFragment extends Fragment implements OnItemClickListener{ 
    private static HashMap<Integer, Bitmap> imgBitmapUrls; 
    public ListView listOfProducts; 
    ProductInterface productInterfaceForProductList; 
    private static String jsonPorductsCategoryListResponse; 
    private static String cookie; 
    private static String[] productImgPath; 
    private static String[] nids; 
    private static String[] title; 
    private static String[] tids; 
    private static String tid; 
    private static HashMap<Integer, String> productListImagePath; 
    DisplayProductListArrayAdapter productListAdapter; 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View fragProListView = inflater.inflate(R.layout.product_category_list, container, 
        false); 
     listOfProducts =(ListView) fragProListView .findViewById(R.id.productCategorylistView); 
     return fragProListView; 
     } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     productInterfaceForProductList = (ProductInterface) getActivity(); 



     GetDataFromJsonResponse dataResponse = new GetDataFromJsonResponse(); 
     dataResponse.dataForCustomArrayAdapter(); 
     productListAdapter = new DisplayProductListArrayAdapter(
        getActivity(), title, 
        imgBitmapUrls); 
     listOfProducts.setAdapter(productListAdapter); 
     listOfProducts.setOnItemClickListener(this); 
    } 
    static ProductListFragment newInstance(Bundle bundle) { 
     ProductListFragment productListFragment = new ProductListFragment(); 
     productListFragment.setArguments(bundle); 
      cookie = bundle.getString(BsharpConstant.WEB_SERVICES_COOKIES); 
      tids = bundle.getStringArray(BsharpConstant.TAXONOMY_TID); 
      return productListFragment; 
     } 
    @Override 
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
     // TODO Auto-generated method stub 

    } 


    public class GetDataFromJsonResponse{ 
     public void dataForCustomArrayAdapter(){ 
      if(getTid()==null){ 
       tid = tids[0]; 
       }   
     jsonPorductsCategoryListResponse = WebserviceBsharpUtil. 
        callWebServicesGetProductsList(cookie, getTid()); 
     nids = ProductCategoryIds.parseJSONResponseToGetTidsOfProducts(
       jsonPorductsCategoryListResponse, 
       BsharpConstant.PRODUCT_NODE_ID); 
     title = ProductCategoryIds.parseJSONResponseToGetTidsOfProducts(
       jsonPorductsCategoryListResponse, 
       BsharpConstant.PRODUCT_TITLE); 
     productImgPath = ProductCategoryIds.parseJSONResponseToGetTidsOfProducts(
       jsonPorductsCategoryListResponse, 
       BsharpConstant.PRODUCT_IMAGE); 
       productListImagePath = new HashMap<Integer, String>(); 
       for(int i =0;i<productImgPath.length;i++){ 
        productListImagePath.put(i, productImgPath[i]); 
       } 
       System.out.println(productListImagePath); 
     imgBitmapUrls = productInterfaceForProductList 
       .DownloadImages(productListImagePath); 
     } 
    } 


    public class DisplayProductListArrayAdapter extends ArrayAdapter<String> { 

     Context context; 
     HashMap<Integer, Bitmap> prodctImgs; 
     String[] proCategoryNames; 
     HashMap<Integer, Bitmap>bitUrls; 
     DisplayProductListArrayAdapter(Context c, 
       String[] listCategory, HashMap<Integer, Bitmap> imgUrls) { 
      super(c, 
        R.layout.products_list_single_layout, 
        R.id.productCategoryName, listCategory); 
      this.context = c; 
      this.prodctImgs = imgUrls; 
      this.proCategoryNames = listCategory; 
      this.bitUrls = imgUrls; 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      LayoutInflater inflater=((Activity)context).getLayoutInflater(); 
      View row = inflater.inflate(R.layout.products_list_single_layout, parent, false); 
      ImageView productCategoryImage = (ImageView) row 
        .findViewById(R.id.productImageId); 
      Bitmap bitmap = imgBitmapUrls.get(position); 
      // productCategoryImage.setFocusable(false); 
      TextView productCategoryName = (TextView) row 
        .findViewById(R.id.productName); 
      productCategoryImage.setImageBitmap(bitmap); 
      productCategoryName.setText(proCategoryNames[position]); 
      return row; 
     } 
    } 

    public void clickedProductCategoryIdByProductCategoryFragment(String tid){ 
     ProductListFragment.setTid(tid);  
    } 

    public static String getTid() { 
     return tid; 
    } 

    public static void setTid(String tid) { 
     ProductListFragment.tid = tid; 
    } 
} 

这里是logcat的:

12-20 11:24:38.847: E/AndroidRuntime(937): FATAL EXCEPTION: main 
12-20 11:24:38.847: E/AndroidRuntime(937): java.lang.OutOfMemoryError 
12-20 11:24:38.847: E/AndroidRuntime(937): at android.graphics.BitmapFactory.nativeDecodeStream(Native Method) 
12-20 11:24:38.847: E/AndroidRuntime(937): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:527) 
12-20 11:24:38.847: E/AndroidRuntime(937): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:599) 
12-20 11:24:38.847: E/AndroidRuntime(937): at com.lenovo.bsharp.imagedownload.ImageDownloader.getBitmapFromURL(ImageDownloader.java:60) 
12-20 11:24:38.847: E/AndroidRuntime(937): at com.lenovo.bsharp.ProductListActivity.DownloadImages(ProductListActivity.java:119) 
12-20 11:24:38.847: E/AndroidRuntime(937): at com.lenovo.bsharp.ProductListFragment$GetDataFromJsonResponse.dataForCustomArrayAdapter(ProductListFragment.java:100) 
12-20 11:24:38.847: E/AndroidRuntime(937): at com.lenovo.bsharp.ProductListFragment.clickedProductCategoryIdByProductCategoryFragment(ProductListFragment.java:146) 
12-20 11:24:38.847: E/AndroidRuntime(937): at com.lenovo.bsharp.ProductListActivity.clickedProductCategory(ProductListActivity.java:131) 
12-20 11:24:38.847: E/AndroidRuntime(937): at com.lenovo.bsharp.ProductCategoryFragment.onItemClick(ProductCategoryFragment.java:93) 
12-20 11:24:38.847: E/AndroidRuntime(937): at android.widget.AdapterView.performItemClick(AdapterView.java:298) 
12-20 11:24:38.847: E/AndroidRuntime(937): at android.widget.AbsListView.performItemClick(AbsListView.java:1086) 
12-20 11:24:38.847: E/AndroidRuntime(937): at android.widget.AbsListView$PerformClick.run(AbsListView.java:2859) 
12-20 11:24:38.847: E/AndroidRuntime(937): at android.widget.AbsListView$1.run(AbsListView.java:3533) 
12-20 11:24:38.847: E/AndroidRuntime(937): at android.os.Handler.handleCallback(Handler.java:615) 
12-20 11:24:38.847: E/AndroidRuntime(937): at android.os.Handler.dispatchMessage(Handler.java:92) 
12-20 11:24:38.847: E/AndroidRuntime(937): at android.os.Looper.loop(Looper.java:137) 
12-20 11:24:38.847: E/AndroidRuntime(937): at android.app.ActivityThread.main(ActivityThread.java:4745) 
12-20 11:24:38.847: E/AndroidRuntime(937): at java.lang.reflect.Method.invokeNative(Native Method) 
12-20 11:24:38.847: E/AndroidRuntime(937): at java.lang.reflect.Method.invoke(Method.java:511) 
12-20 11:24:38.847: E/AndroidRuntime(937): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
12-20 11:24:38.847: E/AndroidRuntime(937): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
12-20 11:24:38.847: E/AndroidRuntime(937): at dalvik.system.NativeStart.main(Native Method) 
12-20 11:29:38.997: I/Process(937): Sending signal. PID: 937 SIG: 9 
12-20 11:29:39.917: E/Trace(952): error opening trace file: No such file or directory (2) 

这是我的位地图代码:

try { 
      System.out.printf("src", src); 
      URL url = new URL(src); 
      HttpURLConnection connection = (HttpURLConnection) url 
        .openConnection(); 
      connection.setDoInput(true); 
      connection.connect(); 
      InputStream input = connection.getInputStream(); 
      Bitmap myBitmap = BitmapFactory.decodeStream(input); 
      System.out.printf("Bitmap", "returned"); 
      return myBitmap; 
     } catch (IOException e) { 
      e.printStackTrace(); 
      System.out.printf("Exception", e.getMessage()); 
      return null; 
     } 
+1

请向我们展示logcat(我会在进一步的请求pslc中缩短它) –

+0

请检查我已粘贴 – rup35h

+0

您的图片太大。在StackOverflow上有很多答案,可以帮助您在加载时缩小它们的大小。 – Simon

回答

2

这个错误是因为在getView()在适配器中位图的实现方法的

试试这个

CreatScaledBitmap

我这里是

Example 1

+0

感谢大家。正如你可以看到上面的代码我使用onItemclickListener和列表将获得第二个片段的变化,默认情况下,第一个列表将显示。我如何改进我的代码。感谢大家的支持。 – rup35h

2

处理位图在ListView可能会很棘手。您可能需要考虑使用可帮助您管理列表中的位图的第三方库,以避免内存不足问题。尝试Universal Image Loader

+0

我如何使用这个库,正如我在我的文章中提到的,我对此很新。你能告诉我吗?无论如何感谢您的帮助。 – rup35h

+0

我建议浏览链接,下载示例应用程序,并查看库的使用方式。 –

相关问题