2013-08-26 117 views
0

我突然在我的列表视图中获取重复的元素。当我对列表项目进行onClick操作时,一切都恢复正常。我也检查了我的适配器,我没有在ArrayList中添加多个项目。这里可能是错误的。列表视图中的重复元素

public View getView(int position, View convertView, ViewGroup parent) { 
     if (convertView == null || convertView.getTag() == null) { 
      convertView = inflater.inflate(R.layout.bookingresponse_row, null); 
      final CabbieViewHolder viewHolder = new CabbieViewHolder(); 
      viewHolder.call = (ImageView) convertView.findViewById(R.id.callCab); 
      viewHolder.call.setOnClickListener(this); 
      viewHolder.driverName = (TextView) convertView.findViewById(R.id.driverName); 
      //SIMILAR CODE FOR MORE DATA ITEMs 

      convertView.setTag(viewHolder); 
     } 
     // Setting all values in listview 
     String temp = latestAcceptedCabbieName.get(position); 
     ((CabbieViewHolder) (convertView.getTag())).driverName.setText(temp); 
     ((CabbieViewHolder) (convertView.getTag())).inDetailsDriverName.setText(temp); 

     //SIMIAR CODE for other data items 
     // Smoothen out the list 
     new AsyncTask<Object, Void, Float>() { 
      CabbieViewHolder cabbieViewHolder; 

      @Override 
      protected Float doInBackground(Object... params) { 
       float cabDistanceFromCustomer = -1.0f; 
       cabbieViewHolder = (CabbieViewHolder) params[0]; 
       if (cabbieViewHolder.distanceFromCustomer == -1.0f) { 
        int position = (int) ((Integer) params[1]).intValue(); 
        cabbieViewHolder.distanceFromCustomer = cabDistanceFromCustomer = God 
          .getGeoDistance(Double.valueOf(latestAcceptedCabbieSourceGPSX 
            .get(position)), Double 
            .valueOf(latestAcceptedCabbieSourceGPSY.get(position)), 
            Double.valueOf(customerSourceLat/1E6), Double 
              .valueOf(customerSourceLng/1E6)); 
       } else 
        cabDistanceFromCustomer = cabbieViewHolder.distanceFromCustomer; 
       return cabDistanceFromCustomer; 
      } 

      @Override 
      protected void onPostExecute(Float result) { 
       super.onPostExecute(result); 
       if (customerSourceLat != 0 && customerSourceLng != 0) { 
        String temp; 
        if (result != 0) { 
         temp = "Current Location @ Approx " 
           + String.format("%.1f", result/1000) + " km"; 
         cabbieViewHolder.cabDistance.setText(temp); 
         cabbieViewHolder.inDetailsCabDistance.setText(temp); 
        } else { 
         cabbieViewHolder.cabDistance.setVisibility(View.GONE); 
         cabbieViewHolder.inDetailsCabDistance.setVisibility(View.GONE); 
        } 
       } else { 
        cabbieViewHolder.cabDistance.setVisibility(View.GONE); 
        cabbieViewHolder.inDetailsCabDistance.setVisibility(View.GONE); 
       } 
      } 
     }.execute((CabbieViewHolder) convertView.getTag(), new Integer(position)); 
     return convertView; 
    } 

回答

1

我看到您正在加载异步任务中的内容。如果任务尚未完成,您将看到旧内容。

尝试在视图中放入“加载数据”指示符,以便您知道数据在陈列在else代码块中时失效,该代码块在convertView不为空时执行。

+0

此外,您可能需要使ListView无效,以便在填充onPostExecute中的视图后强制进行重绘。 –

1

我想你在那里有比赛条件。在由AsyncTask初始化之前,您将返回convertView。请记住,在调用doInBackground之前可能会执行return convertView

我建议你加载所有查看数据在一个AsyncTask或等到postExecute被调用返回convertView。如果工作负载不是很慢,或者根本不要使用AsyncTask