2013-06-16 3 views
2

В приложении я загружаю данные из Url и отображаю их в виде списка. Полный элемент, который я извлекаю из Url, - это элемент, который отображается успешно в listview. Но getView() работает бесконечно в бэкенд. IT продолжает звонить, пока активность не активна. Я не могу понять, почему он звонит так много времени. Мой кодGetView в BaseAdapter Calling Infinte Time

public class asasa extends Activity { 
    //ListView listView; 
    Intent intent; 
    public int currentimageindex=0; 
    private ProgressDialog pDialog; 

    //Class Declartion DataHolder 
    DataHolder obj; 
    Timer timer; 
    TimerTask task; 
    ImageView slidingimage; 
    private int[] IMAGE_IDS = { 
      R.drawable.myno, R.drawable.cock, R.drawable.item, 
      R.drawable.ketchup,R.drawable.oil,R.drawable.pan 
    }; 
    //ProgressDialog progressDialog; 


    // Creating JSON Parser object 
    JSONParser jParser = new JSONParser(); 


    static final String URL = "http://10.0.2.2/android_connect/get_all_products.php"; 

    private static final String TAG_SUCCESS = "success"; 
    private static final String TAG_PRODUCTS = "products"; 

    private static final String TAG_NAME = "name";   
    private static final String TAG_Description = "description"; 
    private static final String TAG_URL = "url"; 
    private static final String TAG_Price = "price"; 


    LazyAdapter adapter; 
    // flag for Internet connection status 
    Boolean isInternetPresent = false; 

    // products JSONArray 
    JSONArray products = null; 

    // Connection detector class 
    ConnectionDetector cd; 

    String ITEMTITLE ="HasMapValue"; 



    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     cd = new ConnectionDetector(getApplicationContext()); 

     // get Internet status 
     isInternetPresent = cd.isConnectingToInternet(); 
     if (isInternetPresent) { 

      LoadAllProducts il = new LoadAllProducts(); 
      il.execute(URL); 
     } 
     else 
     { 
      // Internet connection is not present 
      // Ask user to connect to Internet 
      Toast.makeText(asasa.this, "No Internet Connection You don't have internet connection.", Toast.LENGTH_LONG).show(); 
     } 


    } 
    public void longToast(CharSequence message) { 
     Toast.makeText(this, message, Toast.LENGTH_LONG).show(); 
    } 




    public class LazyAdapter extends BaseAdapter { 

     private Activity activity; 
     private LayoutInflater inflater=null; 
     private ArrayList<HashMap<String, Object>> data; 
     int i=0; 
     public LazyAdapter(Activity a, ArrayList<HashMap<String, Object>> d) { 
      activity = a; 
      data=d; 
      inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     } 

     public int getCount() { 
      return data.size(); 
     } 

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

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

     public View getView(int position, View convertView, ViewGroup parent) { 
      View vi=convertView; 
      if(convertView==null) 
       vi = inflater.inflate(R.layout.list_row, null); 

      TextView title = (TextView)vi.findViewById(R.id.title); // title 
      TextView artist = (TextView)vi.findViewById(R.id.artist); // artist name 
      TextView duration = (TextView)vi.findViewById(R.id.duration); // duration 
      ImageView imageview=(ImageView) vi.findViewById(R.id.list_image); 

      HashMap<String, Object> song = new HashMap<String, Object>(); 
      song = data.get(position); 

      DataHolder objj=new DataHolder(); 
      objj=(DataHolder) song.get(ITEMTITLE); 

      Log.i("iiiiii "," " +i++); 

      Log.i("objj.GetName() ",objj.GetName()); 
      Log.i("objj.GetDescription() ",objj.GetDescription()); 
      Log.i("objj.GetPrice() ",objj.GetPrice()); 


      title.setText(objj.GetName()); 
      artist.setText(objj.GetDescription()); 
      duration.setText(objj.GetPrice()); 
      imageview.setImageBitmap(objj.Getimage()); 



      return vi; 
     } 
    } 






    class LoadAllProducts extends AsyncTask<String, String, String> { 
     // creating new HashMap 
     ArrayList<HashMap<String, Object>> productsList=new ArrayList<HashMap<String,Object>>(); 
     Bitmap decodedByte; 
     /** 
     * Before starting background thread Show Progress Dialog 
     * */ 
     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      pDialog = new ProgressDialog(asasa.this); 
      pDialog.setMessage("Loading products. Please wait..."); 
      pDialog.setIndeterminate(false); 
      pDialog.setCancelable(false); 
      pDialog.show(); 
     } 

     /** 
     * getting All products from url 
     * */ 
     protected String doInBackground(String... args) { 
      // Building Parameters 
      List<NameValuePair> params = new ArrayList<NameValuePair>(); 

      // getting JSON string from URL 
      JSONObject json = jParser.makeHttpRequest(URL, "GET", params); 

      try { 
       // Checking for SUCCESS TAG 
       int success = json.getInt(TAG_SUCCESS); 

       if (success == 1) { 
        // products found 
        // Getting Array of Products 
        products = json.getJSONArray(TAG_PRODUCTS); 
        Log.i("products ",products.toString()); 
        // looping through All Products 
        Log.i("LENGTHHHH "," "+products.length()); 
        for (int i = 0; i < products.length(); i++) { 
         JSONObject c = products.getJSONObject(i); 
         Log.i("ccccccccc ",c.toString()); 
         // Storing each json item in variable 
         // String id = c.getString(TAG_PID); 
         String name = c.getString(TAG_NAME); 
         Log.i("name::",name); 

         String description = c.getString(TAG_Description); 
         Log.i("description::",description); 

         String price = c.getString(TAG_Price); 
         Log.i("price",price); 

         byte[] decodedString = Base64.decode(c.getString(TAG_URL), Base64.DEFAULT); 
         decodedByte = BitmapFactory.decodeByteArray(decodedString, 0, decodedString.length); 

         obj=new DataHolder(); 
         obj.setData(name, description, price, decodedByte); 


         HashMap<String, Object> map = new HashMap<String, Object>(); 



         map.put(ITEMTITLE, obj); 

         productsList.add(map); 

        } 
       } else { 
        // no products found 
       } 
      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 

      return null; 
     } 

     /** 
     * After completing background task Dismiss the progress dialog 
     * **/ 
     protected void onPostExecute(String file_url) { 

      ListView list; 

      // dismiss the dialog after getting all products 
      list=(ListView)findViewById(R.id.list); 

      adapter=new LazyAdapter(asasa.this, productsList);   
      list.setAdapter(adapter); 


      // Click event for single list row 
      list.setOnItemClickListener(new OnItemClickListener() { 

       public void onItemClick(AdapterView<?> parent, View view, 
         int position, long id) { 
           } 
      });  

      if (pDialog.isShowing()) { 
       pDialog.dismiss(); 
       } 


     } 

    } 
    public void onPause() 
    { 
     super.onPause(); 


    } 


    public class DataHolder 

    { 
     String Name; 
     String Description; 
     String Price; 
     Bitmap image; 

     public void setData(String Name,String Descipton,String Price,Bitmap iamage) 
     { 
      this.Name=Name; 
      this.Description=Descipton; 
      this.Price=Price; 
      this.image=iamage; 
     } 

     public String GetName() 
     {return Name;} 
     public String GetDescription() 
     {return Description;} 
     public String GetPrice() 
     {return Price;} 
     public Bitmap Getimage() 

      {return image;} 

     } 
    } 

И GetView()

public View getView(int position, View convertView, ViewGroup parent) { 
     View vi=convertView; 
     if(convertView==null) 
      vi = inflater.inflate(R.layout.list_row, null); 

     TextView title = (TextView)vi.findViewById(R.id.title); // title 
     TextView artist = (TextView)vi.findViewById(R.id.artist); // artist name 
     TextView duration = (TextView)vi.findViewById(R.id.duration); // duration 
     ImageView imageview=(ImageView) vi.findViewById(R.id.list_image); 

     HashMap<String, Object> song = new HashMap<String, Object>(); 
     song = data.get(position); 

     DataHolder objj=new DataHolder(); 
     objj=(DataHolder) song.get(ITEMTITLE); 

     Log.i("iiiiii "," " +i++); 

     Log.i("objj.GetName() ",objj.GetName()); 
     Log.i("objj.GetDescription() ",objj.GetDescription()); 
     Log.i("objj.GetPrice() ",objj.GetPrice()); 


     title.setText(objj.GetName()); 
     artist.setText(objj.GetDescription()); 
     duration.setText(objj.GetPrice()); 
     imageview.setImageBitmap(objj.Getimage()); 



     return vi; 
    } 

XML

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:background="@drawable/background" > 

<include layout="@layout/footer" /> 

<LinearLayout 
    android:layout_width="fill_parent" 
    android:layout_height="460dp" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentTop="true" 
    android:background="@drawable/background2" 
    android:minHeight="400dp" 
    android:orientation="vertical" > 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="50dp" 
     android:background="@drawable/bar" > 

     <Button 
      android:id="@+id/back" 
      android:layout_width="50dp" 
      android:layout_height="50dp" 
      android:background="@drawable/left" /> 
    </LinearLayout> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:orientation="vertical" > 

     <ImageView 
      android:id="@+id/ImageView3_Left" 
      android:layout_width="200dp" 
      android:layout_height="150dp" 
      android:layout_gravity="center_vertical|center_horizontal" 
      android:layout_marginTop="20dp" > 
     </ImageView> 


     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      android:layout_margin="10dp" 
      android:background="@drawable/textarea" 
      android:orientation="vertical" > 

      <ListView 
       android:id="@+id/list" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       android:divider="#b5b5b5" 
       android:dividerHeight="1dp" 
       android:listSelector="@drawable/list_selector" /> 
     </LinearLayout> 
    </LinearLayout> 
</LinearLayout> 

+1

Обычно это может произойти при установке динамического значения высоты для вашего ListView, он должен иметь фиксированный размер или fill_parent если родительский вид имеет фиксированную высоту ... хотя ее нельзя называть бесконечно. Также вы уверены, что вы запускаете эту задачу только один раз? – Cata

+0

Высота моего списка, ширина заполняется родителем. Я также отправляю свой xml. – Passion

+1

Да, но кажется, что родитель вашего родителя имеет height wrap_content .. просто попробуйте его установить и установите высоту listview до 100 или 200 dp и посмотрите, получилось ли получение вида еще несколько раз. – Cata

ответ

4

Я отправлю ответ здесь для других ..

Когда горе rking с ListView, убедитесь, что вы установили фиксированную высоту в ListView, иначе getView() будет называться несколько раз. Это связано с тем, что ListView пытается рассчитать, сколько предметов может быть видно.

0

и я считаю, что я решил проблему.

адаптер BaseAdapter требует, чтобы ListView имеет высокий соответствующий набор для fill_parent или match_parent

Смежные вопросы