2016-07-17 6 views
0

Я делаю некоторые способы устранения неполадок в моем коде, я заметил, что иногда строка listview возвращается несколько раз, когда я отправляю новые данные, а не один раз. Я читаю содержимое списка следует строка из базы данных и проектированием его в else if заявления GetView (закомментировал Bitmap, чтобы проверить с TextView, все еще имея такой же проблему)getView Возвращающиеся строки Несколько раз

GetView:

 @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      // TODO Auto-generated method stub 
      View row=convertView; 
      LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      if (request_my_username.equals(arrRequest_UserContact.get(position))) //YOU 
      { 
         if (Request_Message.get(position).equals("MESSAGE-FAILED-TO-POST")) 
          { 
           row = inflater.inflate(R.layout.activity_chatprivate_single_right, parent, false); 

           TextView txtMessage = (TextView) row.findViewById(R.id.textMessage);  
           txtMessage.setTypeface(null, Typeface.BOLD); 
           txtMessage.setText(Request_Message.get(position)); 
          } 
         else if (Request_Message.get(position).contains("/storage/")) 
          { 
           /*** 
           row = inflater.inflate(R.layout.activity_chatprivate_single_right_img, parent, false); 

           Bitmap bmp_ico = BitmapFactory.decodeFile(Request_Message.get(position));         
           ImageButton ib = (ImageButton) row.findViewById(R.id.ib); 
           ib.setImageBitmap(bmp_ico); 
           ***/ 

           row = inflater.inflate(R.layout.activity_chatprivate_single_right, parent, false); 

           TextView txtMessage = (TextView) row.findViewById(R.id.textMessage); 
           txtMessage.setText(Request_Message.get(position)); 
          } 
         else 
          { 
           row = inflater.inflate(R.layout.activity_chatprivate_single_right, parent, false); 

           TextView txtMessage = (TextView) row.findViewById(R.id.textMessage); 
           txtMessage.setText(Request_Message.get(position)); 
          } 
      } 

Читать MySQL:

  private class JsonReadChatPrivate extends AsyncTask<String, Void, String> { 
      @Override 
      protected String doInBackground(String... params) { 
      HttpClient httpclient = new DefaultHttpClient(); 
      HttpPost httppost = new HttpPost(params[0]); 
      try { 
      HttpResponse response = httpclient.execute(httppost); 
      jsonResult = inputStreamToString(response.getEntity().getContent()).toString(); 
      } 
      catch (ClientProtocolException e) { 
      e.printStackTrace(); 
      } catch (IOException e) { 
      e.printStackTrace(); 
      } 
      return null; 
      }   
      private StringBuilder inputStreamToString(InputStream is) { 
      String rLine = ""; 
      StringBuilder answer = new StringBuilder(); 
      BufferedReader rd = new BufferedReader(new InputStreamReader(is));    
      try { 
      while ((rLine = rd.readLine()) != null) { 
      answer.append(rLine); 
      } 
      }    
      catch (IOException e) { 
      } 
      return answer; 
      } 
      @Override 
      protected void onPostExecute(String result) { 
       adapter.notifyDataSetChanged(); 
      try{ 
      ListDrawer_readPrivateChat(); //has ConnectionException (when it cannot reach server) 
      }catch (Exception e){ 
       } 
      } 
     } 
     public void accessWebService_readChatPrivate() { 
      JsonReadChatPrivate task = new JsonReadChatPrivate(); 
      task.execute(new String[] { "http://website/php/file_to_read_db.php?pcontactSelected="+contactSelected+"&pIMEI="+IMEI+"&pmysql_room_id="+mysql_room_id}); 
     } 
     public void ListDrawer_readPrivateChat() { 
      try { 
      JSONObject jsonResponse = new JSONObject(jsonResult); 
      JSONArray jsonMainNode = jsonResponse.optJSONArray("request_chat_private"); 

      for (int i = 0; i < jsonMainNode.length(); i++) { 
      JSONObject jsonChildNode = jsonMainNode.getJSONObject(i); 
      String request_message = jsonChildNode.optString("Message"); 
      String request_time = jsonChildNode.optString("Time"); 
      mysql_room_id = jsonChildNode.optString("_id"); 
      request_last_user = jsonChildNode.optString("LastUser"); 

      arrRequest_UserContact.add(request_last_user);  
      arrRequest_Message.add(request_message); 
      arrRequest_Time.add(request_time); 

      adapter.notifyDataSetChanged(); 

      } 
      } catch (JSONException e) { 
       } 
    } 

Прослушивание через каждые 5 секунд, чтобы увидеть, если есть какие-либо новые данные по MySQL и если есть, вернуть только содержимое из последнего MySQL ID (так что я не повторно добавлять элементы, которые существуют на ListView):

private void DBListern() { 
accessWebService_readChatPrivate(); 
} 
private void loop() { 
      handler.postDelayed(new Runnable() { 
      public void run() { 

      DBListern(); 
      handler.postDelayed(this, 5000); 
     } 
    }, 5000); 
} 

XML:

  <?xml version="1.0" encoding="utf-8"?> 
     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:orientation="vertical" 
      android:background="@drawable/bg_chat_2" 
      > 
      <LinearLayout 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:orientation="vertical" 
       android:layout_weight="1" 
       > 
       <ListView 
        android:id="@+id/listView" 
        android:layout_width="match_parent" 
        android:layout_height="match_parent" 
        android:transcriptMode="normal" 
        android:stackFromBottom="true" 
        android:divider="@null" 
        android:dividerHeight="0dp" 
        > 
       </ListView> 
      </LinearLayout> 
      ... 

С выше сказал, когда я отправляю содержание, как А, то B, то C он должен возвращать правильный вывод, как A, B, C, однако он делает это A, AA, BBB, CCCC < - повторение представления с одинаковыми данными.

ответ

0

ОК, я продолжил поиск и устранение неисправностей с бревнами и тостами, проблемой была не GetView, это было на самом деле выбор изображения из галереи, при этом он вызывает onPauce() и после выбора изображения он затем вызывает onResume которой выполняется loop() повторите вызов, пока он уже запущен. Все, что я сделал, это отменить предыдущий цикл (handler.removeCallbacksAndMessages(null);), так как он будет называться снова с onResume

Я признаю, что мой фокус был больше на коде getView listView, я никогда не думал, что нужно выбрать системные методы обработки изображений. Всегда хорошо работать с журналами.

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