2015-12-09 2 views
0

Я написал программу для публикации некоторых данных json и получения тех же json-данных, чтобы я мог показывать данные в ListView в том же самом действии. Проводка данных и получение данных осуществляется с помощью библиотеки волейбола.ListView не получает обновления, где я должен позвонить notifyDataSetChanged() и где я должен установить адаптер?

Итак, моя проблема заключается в том, что я ввожу что-то внутри своего EditText и нажимаю на кнопку, чтобы опубликовать некоторые данные, данные отправляются, но я не могу мгновенно ее увидеть внутри своего ListView, вкратце данные не обновляются мгновенно внутри мой ListView. Я также пробовал использовать notifyDataSetChanged(), но все напрасно.

Я отправляю всю свою деятельность здесь, скажите, пожалуйста, где именно я установить мой адаптер, мой ArrayList и notifyDataSetChanged()

public class Write_Answers extends ListActivity{ 
Boolean isInternetPresent = false; 
ConnectionDetector cd; 
TextView txtQuestions; 
String questions; 
EditText editAnswers; 
Button btnAnswer; 
String postAnswerUrl = ""; 
String getAnswerUrl = ""; 
public String answers; 
SessionManager session; 
String userType,deviceId,questionId; 
ListView lvAnswers; 
public static final String TAG_QUESTION_ID = "QId"; 
public static final String TAG_TRANSACTION_ID = "TransactionId"; 
public static final String TAG_ANSWERS = "Answer"; 
public static final String TAG_DATE= "Date"; 
public static final String TAG_TIME = "Time"; 
public static final String TAG_DEVICE_ID = "DeviceId"; 
public static final String TAG_USER_TYPE = "UserType"; 
ArrayList<HashMap<String, String>> answersList; 
CustomAnswerAdapter customAnswerAdapter; 
HashMap<String,String> ans_details_map; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.write_answers); 
    cd = new ConnectionDetector(getApplicationContext()); 
    isInternetPresent = cd.isConnectingToInternet(); 
    txtQuestions = (TextView) findViewById(R.id.textQuestions); 
    editAnswers = (EditText) findViewById(R.id.edtAnswer); 
    btnAnswer = (Button) findViewById(R.id.btnAnswer); 
    questions = getIntent().getStringExtra("questions"); 
    txtQuestions.setText(questions); 
    answersList = new ArrayList<HashMap<String, String>>(); 
    customAnswerAdapter = new 
    CustomAnswerAdapter(Write_Answers.this,answersList); 
    lvAnswers = getListView(); 
    lvAnswers.setAdapter(customAnswerAdapter); 
    pDialog = new ProgressDialog(this); 
    pDialog.setMessage("Please wait..."); 
    pDialog.setCancelable(false); 
    questionId = getIntent().getStringExtra("questionsId"); 
    postAnswerUrl = "http://gps.traxistar.net/PostAnswers.svc/PostAnswers"; 
    getAnswerUrl = "http://gps.traxistar.net/GetAnswers.svc/GetAnswers; 

////////////// //////////// получаем данные с сервера, которые я должен установить для адаптера и показать в Listview ///////////////// //////

if (isInternetPresent) { 
     JsonArrayRequest jsonArrayRequest = new 
       JsonArrayRequest(getAnswerUrl, 
       new Response.Listener<JSONArray>() { 
        @Override 
        public void onResponse(JSONArray response) { 
         Log.d("Json Array", response.toString()); 
         try { 
          for (int i = 0; i < response.length(); i++) { 
           JSONObject json = response.getJSONObject(i); 
           String ques_id = 
           json.getString(TAG_QUESTION_ID); 
           String trans_id = 
           json.getString(TAG_TRANSACTION_ID); 
           String device_id = 
           json.getString(TAG_DEVICE_ID); 
           String ans = json.getString(TAG_ANSWERS); 
           String answerDate = 
           json.getString(TAG_DATE); 
           String answerTime = 
           json.getString(TAG_TIME); 
           String userType = 
           json.getString(TAG_USER_TYPE); 
           ans_details_map = new HashMap<String, 
           String>(); 
           ans_details_map.put(TAG_ANSWERS, ans); 
           ans_details_map.put(TAG_DATE, answerDate); 
           ans_details_map.put(TAG_TIME, answerTime); 
           answersList.add(ans_details_map); 
          } 
         } catch (Exception e) { 
          e.printStackTrace(); 
         } 
          customAnswerAdapter.notifyDataSetChanged(); 
          lvAnswers.setSelection(answersList.size() - 1); 
        } 
       }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       VolleyLog.d("Volley Error", "Error: " + error.getMessage()); 
       Log.d("Error", "Error: " + error.getMessage()); 
      } 
    }); 
    AppController.getInstance().addToRequestQueue(jsonArrayRequest); 
    } else { 
     showAlertDialog(getApplicationContext(), "No Internet Connection", 
     "You don't have internet connection.", 
       false); 
    } 

    btnAnswer.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      answers = editAnswers.getText().toString(); 
      if (answers.equals("")) { 
       Toast.makeText(getBaseContext(), "Please write an answer", 
       Toast.LENGTH_LONG).show(); 
      } else { 
       if (isInternetPresent) { 
        postAnswers(); 
        editAnswers.setText(""); 
       } else { 
        showAlertDialog(getApplicationContext(), "No Internet 
        Connection", "You don't have internet connection.", 
          false); 
       } 
      } 
     } 
    }); 

} 

////////////////////////////// размещения данных на сервер по нажмите кнопку ////////////////////////////

private void postAnswers() { 
    Calendar in = Calendar.getInstance(); 
    Date dt1 = new Date(); 
    in.setTimeZone(TimeZone.getTimeZone("Asia/Kolkata")); 
    SimpleDateFormat sdf1 = new SimpleDateFormat("E, MMM d, yyyy"); 
    String dateval = sdf1.format(dt1); 
    SimpleDateFormat stf1 = new SimpleDateFormat("h:mm a"); 
    String timeval = stf1.format(dt1); 
    final String date1 = dateval.toString(); 
    final String time1 = timeval.toString(); 
    final String datetime = dateval.toString() + "T" 
      + timeval.toString(); 
    final String transId = deviceId + "" + datetime; 
    answers = editAnswers.getText().toString(); 
    List<Map<String, String>> listMap = 
    new ArrayList<Map<String, String>>(); 
    Map<String, String> answersMap = new HashMap<String, String>(); 
    answersMap.put("TransactionId", transId); 
    answersMap.put("DeviceId", deviceId); 
    answersMap.put("Answer", answers); 
    answersMap.put("QId", questionId); 
    answersMap.put("Date", date1); 
    answersMap.put("Time", time1); 
    answersMap.put("UserType", userType); 
    listMap.add(answersMap); 

    JsonObjectRequest jsObjRequest = new 
    JsonObjectRequest(Request.Method.POST, postAnswerUrl, 
      String.valueOf(new JSONArray(listMap)), new 
      Response.Listener<JSONObject>() { 
     @Override 
     public void onResponse(JSONObject response) { 
      try { 
       Write_Answers.this.runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         Toast.makeText(getApplicationContext(), "Answer 
         posted", Toast.LENGTH_LONG).show(); 
        } 
       }); 
       Log.d("Json Response ",response.toString()); 

      }catch(Exception e){ 
       //Log.d("JSON Array", response.toString()); 
       e.printStackTrace(); 
      } 

      //editAnswers.setText(""); 
     } 
    }, new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      Log.d("Volley Error", error.toString()); 
     } 
    }) { 
     @Override 
     public Map<String, String> getHeaders() throws AuthFailureError { 
      HashMap<String, String> headers = new HashMap<String, String>(); 
      headers.put("Content-type", "application/json; charset=utf-8"); 
      return headers; 
     } 

     @Override 
     protected Response<JSONObject> parseNetworkResponse(NetworkResponse 
     response) { 
      try { 
       String jsonString = new String(response.data, 
         HttpHeaderParser.parseCharset(response.headers)); 
       if (response.data == null || response.data.length == 0) { 
        return Response.success(new JSONObject(), 
        HttpHeaderParser.parseCacheHeaders(response)); 
       } else { 
        return Response.success(new JSONObject(jsonString), 
          HttpHeaderParser.parseCacheHeaders(response)); 
       } 
      } catch (UnsupportedEncodingException e) { 
       return Response.error(new ParseError(e)); 
      } catch (JSONException je) { 
       return Response.error(new ParseError(je)); 
      } 
     } 
    }; 
    AppController.getInstance().addToRequestQueue(jsObjRequest); 
} 
+0

Вы имеете в виду есть задержка в обновлении ListView? – Jas

+0

@ Я не задерживаю, мне нужно либо использовать намерение обновить активность, либо вернуться и вернуться к этой операции, чтобы увидеть обновленный элемент. –

+0

. Где вы получаете новые данные для отображения? – Jas

ответ

0

ArrayAdapter, notifyDataSetChanged работает только если вы используете add(), insert(), remove(), and clear() на Adapter.

Когда ArrayAdapter построен, он содержит ссылку на список, который был принят. Если вы должны были пройти в список, который был членом Activity, и изменить это Activity член спустя, ArrayAdapter все еще держится ссылка на исходный список. Adapter не знает, что вы изменили Список в Activity.

Я рекомендую использовать функции ArrayAdapter изменить основной список (add(), insert(), remove(), clear() и т.д.)

+0

, так что notifyDataSetChanged не работает с BaseAdapter? –

+0

Да, это так ... это в документации http://developer.android.com/reference/android/widget/BaseAdapter.html – fergdev

0

Любой тип обновления (удаления/редактирования/добавления) Вы хотите сделать (на сообщение Кнопка мыши сделать ваша проводка после чего эти шаги) 1. обновление ваш ArrayList первый 2. удалить все виды из ListView с предыдущими данными ArrayList 3. вызов адаптер снова с обновленным ArrayList снова

надеюсь, это поможет вам.

+1

ok thanx для ответа, я постараюсь сделать то же самое –

0

Try вызова notifyDatasetChanged(), как это:

final Handler handler = new Handler(); 
handler.postDelayed(new Runnable() { 
    @Override 
    public void run() { 
    customAnswerAdapter.notifyDataSetChanged(); 
    } 
}, 3000); 

и проверить, является ли это работает

+0

, если я позвоню это на моей кнопке нажмите или при получении данных? –

+0

После получения данных вы обновляете свой ListView. поэтому добавьте его после получения данных. – Jas

+0

жаль, что не работает –

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