2016-03-27 11 views
1

私はアンドロイドで新しく、インターネットからのデータをリストビューに読み込むプロジェクトで作業しています。私はここに私のプロトタイプを得た:kaleidosblog.com/android-listview-load-data-from-jsonAndroidはJSONからのリストビューを作成します(edittextからのリンク)

したがって、これらはJSONへのリンクになりますように

私の活動では、私は自分のEditText、Button、ListViewを持っています。

  • EditextがURLを取得します。
  • ボタンが私の現在のプログラムで件のデータ

が表示されます

  • リストビューをリストビューする(URLから)JSONリンクをロードするために使用されますが、それだけで、ボタンの最初のクリックで動作します。一度最初のjsonに入ったら、正しいデータが表示されます。しかし、私がEditTextでjsonを変更しようとすると、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(); 
    

    そして、国のリスト内のデータが出てクリアされ、新たにダウンロードしたデータは、国のリストに追加されますアダプターにデータ変更が通知されたときにビューで更新されます。

    関連する問題