2016-03-27 2 views
1

Я новичок в android и работаю с проектом, который загружает данные из Интернета в список. Я получил свой прототип здесь: kaleidosblog.com/android-listview-load-data-from-jsonAndroid Population Listview от JSON (ссылка от edittext)

Так это будут ссылки в формате JSON:

В моей деятельности у меня есть EditText, Button и ListView.

  • Editext получит URL.
  • Кнопка будет использовать для загрузки по ссылке JSon (из URL) в ListView
  • Listview покажет ДАННЫЕ

В моей текущей программе, он работает только на первом щелчке кнопки. Поэтому, как только я войду в первый json, он покажет правильные данные. Но когда я пытаюсь изменить json на EditText, все же ListView заполняется первым json. Короче говоря, мой ListView не обновляется каждый раз, когда я меняю ссылку и нажимаю кнопку.

Что случилось с этим?

Основная деятельность:

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; 
} 

ответ

1

Оказывается, что список стран, добавляется в каждый момент времени в get_data() , но никогда не очищался. В начале get_data, вы, скорее всего, хотите, чтобы очистить список стран со следующим вызовом:

countries.clear(); 

Затем данные в списке стран будут очищены, новые загруженные данные будут добавлены в список стран , а затем обновляется в представлении, когда адаптер уведомляется об изменении данных.

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