2016-03-27 9 views
1

Ich bin neu in Android und arbeite mit einem Projekt, das Daten aus dem Internet in Listview lädt. Ich habe meine Prototyp hier: kaleidosblog.com/android-listview-load-data-from-jsonAndroid Populate Listview von JSON (Link von Edittext)

So werden diese die json Links sein:

In meiner Aktivität habe ich meine EditText, Button und ListView.

  • Editext wird die URL erhalten. In meinem aktuellen Programm wird

es funktioniert auf den ersten Klick auf Schaltfläche

  • Button-Daten zur Listenansicht
  • Listenansicht angezeigt werden nur wird verwenden, um die json Link (von url) zu laden. Sobald ich also den ersten JSON eingegeben habe, werden die korrekten Daten angezeigt. Aber wenn ich versuche, die json auf EditText zu ändern, wird immer noch die ListView von der ersten json aufgefüllt. Kurz gesagt, mein ListView wird nicht jedes Mal aktualisiert, wenn ich den Link ändere und auf die Schaltfläche klicke.

    Was ist falsch daran?

    Hauptaktivität:

    protected void onCreate(Bundle savedInstanceState) { 
        final Button searchButton = (Button) findViewById(R.id.searchButton); 
        final EditText searchForm = (EditText) findViewById(R.id.searchForm); 
        searchButton.setOnClickListener(new View.OnClickListener() { 
         public void onClick(View v) { 
          list = (ListView) findViewById(R.id.list); 
          adapter = new ListAdapter(MainActivity.this); 
          list.setAdapter(adapter); 
          search = searchForm.getText().toString(); 
          Download_data download_data = new Download_data((download_complete) MainActivity.this); 
          download_data.download_data_from_link(search); 
          adapter.notifyDataSetChanged(); 
          Toast.makeText(getApplicationContext(), search, Toast.LENGTH_LONG).show(); 
         } 
        }); 
        } 
    
        public void get_data(String data){ 
         try { 
          JSONObject jsonObj = new JSONObject(data); 
          JSONArray data_array = jsonObj.getJSONArray("announcements"); 
    
          for (int i = 0 ; i < data_array.length() ; i++) 
          { 
           JSONObject obj=new JSONObject(data_array.get(i).toString()); 
    
           Countries add=new Countries(); 
           add.name = obj.getString("message"); 
           add.code = obj.getString("date"); 
    
           countries.add(add); 
    
          } 
    
          adapter.notifyDataSetChanged(); 
    
         } catch (JSONException e) { 
          e.printStackTrace(); 
         } 
    
        } 
    

    Download_data.java

    public class Download_data implements Runnable { 
    
        public download_complete caller; 
    
        public interface download_complete{ 
         public void get_data(String data); 
        } 
    
        Download_data(download_complete caller) {   
         this.caller = caller; 
        } 
    
        private String link; 
        public void download_data_from_link(String link){ 
         this.link = link; 
         Thread t = new Thread(this); 
         t.start(); 
        } 
    
        public void run() { 
         threadMsg(download(this.link)); 
    
        } 
    
        private void threadMsg(String msg) { 
    
         if (!msg.equals(null) && !msg.equals("")) { 
          Message msgObj = handler.obtainMessage(); 
          Bundle b = new Bundle(); 
          b.putString("message", msg); 
          msgObj.setData(b); 
          handler.sendMessage(msgObj); 
         } 
        } 
    
    
        private final Handler handler = new Handler() { 
    
         public void handleMessage(Message msg) { 
    
          String Response = msg.getData().getString("message"); 
    
          caller.get_data(Response); 
    
         } 
        }; 
        public static String download(String url) { 
         URL website; 
         StringBuilder response = null; 
         try { 
          website = new URL(url); 
    
          HttpURLConnection connection = (HttpURLConnection) website.openConnection(); 
          connection.setRequestProperty("charset", "utf-8"); 
    
          BufferedReader in = new BufferedReader(
           new InputStreamReader(
            connection.getInputStream())); 
    
          response = new StringBuilder(); 
          String inputLine; 
    
          while ((inputLine = in.readLine()) != null) 
           response.append(inputLine); 
    
          in.close(); 
    
         } catch (Exception e) { 
          return ""; 
         } 
         return response.toString(); 
        } 
    

    ListAdapter.java

    MainActivity main; 
    
    ListAdapter(MainActivity main) 
    { 
        this.main = main; 
    } 
    
    @Override 
    public int getCount() { 
        return main.countries.size(); 
    } 
    
    @Override 
    public Object getItem(int position) { 
        return null; 
    } 
    
    @Override 
    public long getItemId(int position) { 
        return 0; 
    } 
    
    static class ViewHolderItem { 
        TextView name; 
        TextView code; 
    } 
    
    @Override 
    public View getView(int position, View convertView, ViewGroup parent){ 
        ViewHolderItem holder = new ViewHolderItem(); 
        if (convertView == null) { 
        LayoutInflater inflater = (LayoutInflater) main.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
         convertView = inflater.inflate(R.layout.cell, null); 
    
         holder.name = (TextView) convertView.findViewById(R.id.name); 
         holder.code = (TextView) convertView.findViewById(R.id.code); 
    
         convertView.setTag(holder); 
        } 
        else 
        { 
         holder = (ViewHolderItem) convertView.getTag(); 
        } 
    
    
        holder.name.setText(this.main.countries.get(position).name); 
        holder.code.setText(this.main.countries.get(position).code); 
    
        return convertView; 
    } 
    
  • Antwort

    1

    Es scheint, dass die Länder die Liste jedes Mal in get_data hinzugefügt wird() , aber nie gelöscht. Zu Beginn des get_data Sie wahrscheinlich wollen die Länderliste mit dem folgenden Aufruf löschen:

    countries.clear(); 
    

    Dann werden die Daten in den Ländern Liste werden die neuen heruntergeladenen Daten ausgeräumt, wird in die Länder-Liste hinzugefügt werden und dann in der Ansicht aktualisiert, wenn der Adapter über die Datenänderung benachrichtigt wird.