2015-11-03 7 views
0

Я сделал простой код для извлечения некоторых данных из базы данных mysql и поместил их в список андроидов, все работает отлично, но старые элементы остаются в представлении списка и добавляются новые элементы (данные дублируются), ниже - код php:Как автоматически обновлять (добавлять/обновлять) элементы списка без дублирования данных?

$sql = "SELECT * FROM persons"; 

$res = mysqli_query($con,$sql); 

$result = array(); 

while($row = mysqli_fetch_array($res)){ 
array_push($result, 
array('id'=>$row[0], 
'name'=>$row[1], 
'address'=>$row[2] 
)); 
} 

echo json_encode(array("result"=>$result)); 

mysqli_close($con); 

и здесь андроид код:

public class FetchData extends Activity{ 
    String myJSON; 

    private static final String TAG_RESULTS="result"; 
    private static final String TAG_ID = "id"; 
    private static final String TAG_NAME = "name"; 
    private static final String TAG_ADD ="address"; 

    JSONArray peoples = null; 

    ArrayList<HashMap<String, String>> personList; 

    ListView list; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.test); 
     list = (ListView) findViewById(R.id.listView); 
     personList = new ArrayList<HashMap<String,String>>(); 
     getData(); 
     final Handler handler = new Handler(); 
     handler.postDelayed(new Runnable() { 

      @Override 
      public void run() { 


       refreshData(); 
       handler.postDelayed(this, 2 * 100); 
      } 
     }, 2 * 100); 

    } 
    public void refreshData(){ 

    } 
    public void getData(){ 
     class GetDataJSON extends AsyncTask<String, Void, String>{ 

      @Override 
      protected String doInBackground(String... params) { 
       DefaultHttpClient httpclient = new DefaultHttpClient(new BasicHttpParams()); 
       HttpPost httppost = new HttpPost("http://192.168.1.4/get-data.php"); 

       // Depends on your web service 
       httppost.setHeader("Content-type", "application/json"); 

       InputStream inputStream = null; 
       String result = null; 
       try { 
        HttpResponse response = httpclient.execute(httppost); 
        HttpEntity entity = response.getEntity(); 

        inputStream = entity.getContent(); 
        // json is UTF-8 by default 
        BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"), 8); 
        StringBuilder sb = new StringBuilder(); 

        String line = null; 
        while ((line = reader.readLine()) != null) 
        { 
         sb.append(line + "\n"); 
        } 
        result = sb.toString(); 
       } catch (Exception e) { 
        // Oops 
       } 
       finally { 
        try{if(inputStream != null)inputStream.close();}catch(Exception squish){} 
       } 
       return result; 
      } 

      @Override 
      protected void onPostExecute(String result){ 
       myJSON=result; 

       showdata(); 
      } 
     } 
     GetDataJSON g = new GetDataJSON(); 
     g.execute(); 
    } 
    protected void showdata(){ 
     try { 
      JSONObject jsonObj = new JSONObject(myJSON); 
      peoples = jsonObj.getJSONArray(TAG_RESULTS); 

      for(int i=0;i<peoples.length();i++){ 
       JSONObject c = peoples.getJSONObject(i); 
       String id = c.getString(TAG_ID); 
       String name = c.getString(TAG_NAME); 
       String address = c.getString(TAG_ADD); 

       HashMap<String,String> persons = new HashMap<String,String>(); 

       persons.put(TAG_ID,id); 
       persons.put(TAG_NAME,name); 
       persons.put(TAG_ADD,address); 

       personList.add(persons); 
      } 

      ListAdapter adapter = new SimpleAdapter(
        FetchData.this, personList, R.layout.list_item, 
        new String[]{TAG_ID,TAG_NAME,TAG_ADD}, 
        new int[]{R.id.id, R.id.name, R.id.address} 
      ); 

      list.setAdapter(adapter); 

     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 

    } 


    } 

я хотел бы автоматически обновлять конкретный элемент ListView, если данные базы данных MySQL изменен для этого конкретного пункта и добавить новые элементы без дублирования

ответ

1

Попробуйте изменить свой showdata() так:

protected void showdata(){ 
     try { 
      JSONObject jsonObj = new JSONObject(myJSON); 
      peoples = jsonObj.getJSONArray(TAG_RESULTS); 

      personList.clear(); 
      for(int i=0;i<peoples.length();i++){ 
       JSONObject c = peoples.getJSONObject(i); 
       String id = c.getString(TAG_ID); 
       String name = c.getString(TAG_NAME); 
       String address = c.getString(TAG_ADD); 

       HashMap<String,String> persons = new HashMap<String,String>(); 

       persons.put(TAG_ID,id); 
       persons.put(TAG_NAME,name); 
       persons.put(TAG_ADD,address); 

       personList.add(persons); 
      } 

      ListAdapter adapter = new SimpleAdapter(
        FetchData.this, personList, R.layout.list_item, 
        new String[]{TAG_ID,TAG_NAME,TAG_ADD}, 
        new int[]{R.id.id, R.id.name, R.id.address} 
      ); 

      list.setAdapter(adapter); 

     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 

    } 

personList.clear(); - для очистки старого результата.

0

лучший способ решить эту проблему, чтобы послать последний идентификатор, извлеченный из PHP файла поэтому вы не увидите никаких дублированных данных, загрузят больше элементов по умолчанию отправить идентификатор нуля и каждый раз, когда вы делаете запрос послать последний идентификатор хранящегося

$id = abs(intval($_GET['id'])); 
$sql = "SELECT * FROM persons where id > ".$id; 
$res = mysqli_query($con,$sql); 
$result = array(); 

while($row = mysqli_fetch_array($res)){ 
array_push($result, 
array('id'=>$row[0], 
'name'=>$row[1], 
'address'=>$row[2] 
)); 
} 

echo json_encode(array("result"=>$result)); 

mysqli_close($con); 

Java класс

public class FetchData extends Activity{ 
String myJSON; 

private static final String TAG_RESULTS="result"; 
private static final String TAG_ID = "id"; 
private static final String TAG_NAME = "name"; 
private static final String TAG_ADD ="address"; 

JSONArray peoples = null; 

ArrayList<HashMap<String, String>> personList; 

ListView list; 
private static int lastid = 0; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.test); 
    list = (ListView) findViewById(R.id.listView); 
    personList = new ArrayList<HashMap<String,String>>(); 
    getData(); 
    final Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 

     @Override 
     public void run() { 


      refreshData(); 
      handler.postDelayed(this, 2 * 100); 
     } 
    }, 2 * 100); 

} 
public void refreshData(){ 

} 
public void getData(){ 
    class GetDataJSON extends AsyncTask<String, Void, String>{ 

     @Override 
     protected String doInBackground(String... params) { 
      DefaultHttpClient httpclient = new DefaultHttpClient(new BasicHttpParams()); 
      HttpPost httppost = new HttpPost("http://192.168.1.4/get-data.php?id="+lastid); 

      // Depends on your web service 
      httppost.setHeader("Content-type", "application/json"); 

      InputStream inputStream = null; 
      String result = null; 
      try { 
       HttpResponse response = httpclient.execute(httppost); 
       HttpEntity entity = response.getEntity(); 

       inputStream = entity.getContent(); 
       // json is UTF-8 by default 
       BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"), 8); 
       StringBuilder sb = new StringBuilder(); 

       String line = null; 
       while ((line = reader.readLine()) != null) 
       { 
        sb.append(line + "\n"); 
       } 
       result = sb.toString(); 
      } catch (Exception e) { 
       // Oops 
      } 
      finally { 
       try{if(inputStream != null)inputStream.close();}catch(Exception squish){} 
      } 
      return result; 
     } 

     @Override 
     protected void onPostExecute(String result){ 
      myJSON=result; 

      showdata(); 
     } 
    } 
    GetDataJSON g = new GetDataJSON(); 
    g.execute(); 
} 
protected void showdata(){ 
    try { 
     JSONObject jsonObj = new JSONObject(myJSON); 
     peoples = jsonObj.getJSONArray(TAG_RESULTS); 

     for(int i=0;i<peoples.length();i++){ 
      JSONObject c = peoples.getJSONObject(i); 
      String id = c.getString(TAG_ID); 
      String name = c.getString(TAG_NAME); 
      String address = c.getString(TAG_ADD); 

      HashMap<String,String> persons = new HashMap<String,String>(); 

      persons.put(TAG_ID,id); 
      persons.put(TAG_NAME,name); 
      persons.put(TAG_ADD,address); 

      personList.add(persons); 
      lastid = Integer.parseInt(id); 
     } 

     ListAdapter adapter = new SimpleAdapter(
       FetchData.this, personList, R.layout.list_item, 
       new String[]{TAG_ID,TAG_NAME,TAG_ADD}, 
       new int[]{R.id.id, R.id.name, R.id.address} 
     ); 

     list.setAdapter(adapter); 

    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 

} 


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