2015-05-11 3 views
0

То, что я пытаюсь сделать, это: - Чтобы показать состояния в spinner, загрузите его из базы данных и заполните счетчик. в состоянии выбора, в зависимости от состояния, город должен быть заполнен другим счетчиком.setOnItemSelectedListener не работает при динамическом заполнении элементов в spinner

Что я достиг: Spinner заполнить значения из базы данных, но setOnItemSelectedListener не работает.

setOnItemSelectedListener метод работает, когда я ставил данные статически в прядильщик.

Мой Источник:

import java.util.ArrayList; 
import java.util.Iterator; 
import java.util.List; 
import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 
import android.os.Bundle; 
import android.app.Activity; 
import android.util.Log; 
import android.view.Menu; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.Spinner; 

public class MainActivity extends Activity { 

    Spinner sp_state,sp_city,sp_area; 
    Button ok; 
    int state_position; 
    String s_data,c_data,a_data,selected_state; 
    ArrayList<Satae_Pojo> new_data; 
    Network_Class net=new Network_Class(); 
    ArrayList<Satae_Pojo> state=new ArrayList<Satae_Pojo>(); 
    ArrayList<Integer> state_id=new ArrayList<Integer>(); 
    ArrayList<String> state_name=new ArrayList<String>(); 
    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.search_for_area); 
     sp_state=(Spinner)findViewById(R.id.spinner_state); 
     sp_city=(Spinner)findViewById(R.id.spinner_city); 
     sp_area=(Spinner)findViewById(R.id.spinner_area); 
     ok=(Button)findViewById(R.id.btn_ok); 

     List<String> list=new ArrayList<String>(); 
     list.add("Please Select Area"); 
     list.add("Phulewadi"); 
     list.add("Vikramnagar"); 
     list.add("Kadamwadi"); 
     list.add("Rajarampuri"); 

     getStates(); 

     sp_state.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() 
     { 

      @Override 
      public void onItemSelected(AdapterView<?> parent, View arg1, int pos, long arg3) 
      { 
       System.out.println("This is spinner"); 

       //String id=parent.getItemAtPosition(pos).toString(); 
       //System.out.println("This is selected id "+id); 

      } 
      @Override 
      public void onNothingSelected(AdapterView<?> arg0) {} 
     }); 

     ArrayAdapter<String> state_adapter = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, state_name); 
     state_adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 
     sp_state.setAdapter(state_adapter); 

    } 

    public void getStates() 
    { 
     new Thread(new Runnable() 
     { 
      @Override 
      public void run() 
      { 
       s_data=net.getState(); 
       ArrayList<Satae_Pojo> statedata = statepojo(s_data); 
       Iterator<Satae_Pojo> itr = statedata.iterator(); 
       while(itr.hasNext()) 
       { 

        Satae_Pojo s_pojo=(Satae_Pojo)itr.next(); 
        int id=(Integer)s_pojo.getId(); 
        String name=(String)s_pojo.getState(); 

        state_id.add(id); 
        state_name.add(name); 
       }  
      } 
     }).start(); 
    } 

    public ArrayList<Satae_Pojo> statepojo(String result) 
    { 
     ArrayList<Satae_Pojo> states=new ArrayList<Satae_Pojo>(); 
     try 
     { 

      JSONArray jsonarray = new JSONArray(result); 
      for(int i=0; i<jsonarray.length(); i++) 
      { 
       JSONObject jsonobject=jsonarray.getJSONObject(i); 
       Satae_Pojo statepojo=new Satae_Pojo(); 

       statepojo.setId(jsonobject.getInt("id")); 
       statepojo.setState(jsonobject.getString("s_name")); 

       states.add(statepojo); 

      } 
     } 
     catch(JSONException e) 
     { 
      Log.e("Log_tag", "Error Parsing in State....."+e.toString()); 
      Log.e("Log_Answers","Second Error Parsing in State....."+result); 
     } 
     return states; 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 
} 

В выше источника, когда я прохожу «список» в качестве аргумента к адаптеру он работает отлично. , но когда динамическое заполнение state_name передается setOnItemSelectedListener не работает .. что я делаю неправильно ..?

+0

Попробуйте строковый идентификатор = parent.getAdapter(). GetItem (поз) .ToString() –

+0

У меня есть Пробовал, что ... это не работает. см. комментарии только ниже System.out.println («Это прядильщик»); даже этот System.out.println («Это прядильщик»); не печатайте в нем значение. –

+0

Что вы пробовали - parent.getItemAtPosition (pos) то, что я написал, является parent.getAdapter(). GetItem (pos) –

ответ

0

Всякий раз, когда вы добавляете данные (динамически) к адаптеру, вам нужно позвонить Adapter.notifyDataSetChanged(), чтобы представление обновило его.

добавить этот код после того, как в то время как петля getStates() метода

runOnUiThread(new Runnable() { 

     @Override 
     public void run() { 
      state_adapter.notifyDataSetChanged(); 
     } 
    }); 

Happy_Coding ... :)

+0

Спасибо Бди, но не могли бы вы объяснить мне, почему это так ..? почему Listener не печатал сообщение. –

+0

, потому что у вас не было данных для слушателя. Это не о слушателе о вашем наборе данных, прикрепленном к вашему представлению (счетчику) и адаптеру. После setAdapter, если вы внесли изменения в свой набор данных, вам нужно вызвать notifyDatesetChanged для обновления представлений с новыми доступными данными. – Bharatesh

+0

да бхарат, спасибо, это мне очень помогло. –

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