Как изменить положение счетчика в соответствии с положением другого счетчика в двух разных действиях

У меня есть два раскрывающегося списка spinner для Android в двух разных действиях. Но оба счетчика имеют одинаковые данные из одного и того же sourec.I хочу изменить позицию второго действия в зависимости от позиции первой активности. Как решить эту проблему?

Обновленный код:

Первая активность:

public class ServiceRequest extends BaseActivity implements OnItemClickListener { private List<Item> customerList = new ArrayList<Item>(); private SpinnerAdapter adapter; public static final String EXTRA_INTENT_CUSTOMER_LIST ="extra_intent_customer_list"; public static final String EXTRA_INTENT_SELECTED_ITEM = "extra_intent_selected_item"; private List<Item> items; Spinner spin; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getLayoutInflater().inflate(R.layout.service_request, frameLayout); ; ); System.out.println("Selected item " Button login = (Button) findViewById(R.id.booking); final String message = autoCompView.getText().toString(); //Create the bundle login.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { { if(customerList.isEmpty()) return; Item selectedItem = (Item) spin.getSelectedItem(); spin.getSelectedItem().toString(+selectedItem); Intent intent = new Intent(ServiceRequest.this, Form.class); // intent.putExtra(EXTRA_INTENT_CUSTOMER_LIST, (Serializable) customerList); intent.putExtra("seletedItem", selectedItem); intent.putExtra(EXTRA_INTENT_SELECTED_ITEM, selectedItem); startActivity(intent); } } }); spin = (Spinner) findViewById(R.id.service_spinner); adapter = new SpinnerAdapter((ArrayList<Item>) customerList, this); spin.setAdapter(adapter); } public void onStart(){ super.onStart(); BackTask bt=new BackTask(); bt.execute(); } private class BackTask extends AsyncTask<Void,Void,ArrayList<Item>> { ArrayList<String> list; protected void onPreExecute(){ super.onPreExecute(); list=new ArrayList<>(); } protected ArrayList<Item> doInBackground(Void... params) { InputStream is = null; String result = ""; try { HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost("http://my_url/Service.asmx/GetServiceList"); HttpResponse response = httpclient.execute(httppost); HttpEntity entity = response.getEntity(); // Get our response as a String. is = entity.getContent(); } catch (IOException e) { e.printStackTrace(); } //convert response to string try { BufferedReader reader = new BufferedReader(new InputStreamReader(is, "utf-8")); String line = null; while ((line = reader.readLine()) != null) { result += line; } is.close(); //result=sb.toString(); } catch (Exception e) { e.printStackTrace(); } // parse json data try { JSONArray jArray = new JSONArray(result); for (int i = 0; i < jArray.length(); i++) { JSONObject obj = jArray.getJSONObject(i); Item customer = new Item(); customer.setId(obj.getString("ServiceId")); customer.setName(obj.getString("ServiceName")); // adding movie to movies array customerList.add(customer); } } catch (JSONException e) { e.printStackTrace(); } // adapter.notifyDataSetChanged(); return null; } @Override protected void onPostExecute(ArrayList<Item> customerList) { if(customerList != null && !customerList.isEmpty()){ adapter.updateDate(customerList); } } }} 

Код второй активности

  public class Form extends BaseActivity { // ArrayList<String> listItems = new ArrayList<>(); // ArrayAdapter<String> adapter; private ArrayList<Item> customerList = new ArrayList<Item>(); private SpinnerAdapter adapter; private List<Item> items; AdapterView.OnItemSelectedListener listener; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getLayoutInflater().inflate(R.layout.activity_form, frameLayout); if(getIntent().hasExtra(ServiceRequest.EXTRA_INTENT_SELECTED_ITEM)){ selectedItem = (Item)getIntent().getSerializableExtra(ServiceRequest.EXTRA_INTENT_SELECTED_ITEM); } service_need = (Spinner) findViewById(R.id.service_need); adapter = new SpinnerAdapter(customerList, this); service_need.setAdapter(adapter); /* Commented by me if(selectedItem != null){ service_need.setSelection(customerList.indexOf(selectedItem)); }*/ /* Commented for testing :Praveen Bundle bundle = getIntent().getExtras(); String stuff1 = bundle.getString("local");*/ autoCompView.setText("stuff1"); // position = customerList.indexOf(bundle.getString("name")); // spin.setSelection(position); // adapter.notifyDataSetChanged(); // adapter.notifyDataSetChanged(); // String name = bundle.getString("name"); // adapter.add(name); } public void onStart() { super.onStart(); BackTask bt = new BackTask(); bt.execute(); } private class BackTask extends AsyncTask<Void, Void, ArrayList<Item>> { ArrayList<String> list; protected void onPreExecute() { super.onPreExecute(); // list = new ArrayList<>(); } protected ArrayList<Item> doInBackground(Void... params) { InputStream is = null; String result = ""; try { HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost("http://my_url/Service.asmx/GetServiceList"); HttpResponse response = httpclient.execute(httppost); HttpEntity entity = response.getEntity(); // Get our response as a String. is = entity.getContent(); } catch (IOException e) { e.printStackTrace(); } //convert response to string try { BufferedReader reader = new BufferedReader(new InputStreamReader(is, "utf-8")); String line = null; while ((line = reader.readLine()) != null) { result += line; } is.close(); //result=sb.toString(); } catch (Exception e) { e.printStackTrace(); } // parse json data try { JSONArray jArray = new JSONArray(result); for (int i = 0; i < jArray.length(); i++) { JSONObject obj = jArray.getJSONObject(i); Item customer = new Item(); customer.setId(obj.getString("ServiceId")); customer.setName(obj.getString("ServiceName")); customerList.add(customer); } } catch (JSONException e) { e.printStackTrace(); } // adapter.notifyDataSetChanged(); return null; } @Override protected void onPostExecute(ArrayList<Item> customerList) { if(customerList != null && !customerList.isEmpty()){ adapter.updateDate(customerList); if(selectedItem != null){ spin.setSelection(customerList.indexOf(selectedItem)); } } } } } 

Модельный класс

 public class Item implements Serializable { String id; String name; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Item item = (Item) o; if (getId() != item.getId()) return false; return getName().equals(item.getName()); } } 

Класс Adapeter

 public class SpinnerAdapter extends BaseAdapter { ArrayList<Item> categories = new ArrayList<>(); Context mContext; public SpinnerAdapter(ArrayList<Item> categories, Context context){ this.categories = categories; mContext = context; } @Override public int getCount() { return categories.size(); } @Override public Object getItem(int i) { return categories.get(i); } @Override public long getItemId(int i) { return categories.get(i).hashCode(); } @Override public View getView(int i, View view, ViewGroup viewGroup) { Item item = categories.get(i); ViewHolder holder = null; if(view == null){ view = LayoutInflater.from(mContext).inflate(R.layout.spin_row, null); holder = new ViewHolder(); holder.name = (TextView) view.findViewById(R.id.name); view.setTag(holder); } else { holder = (ViewHolder) view.getTag(); } holder.name.setText(item.getName()); return view; } static class ViewHolder{ TextView name; } } 

Ответ JSON

 [{"ServiceId":"1","ServiceName":"AC"}, {"ServiceId":"5","ServiceName":"Plumbing"}, {"ServiceId":"3","ServiceName":"Refrigerator"}, {"ServiceId":"7","ServiceName":"Appliances"}, {"ServiceId":"27","ServiceName":"Others"}] 

Solutions Collecting From Web of "Как изменить положение счетчика в соответствии с положением другого счетчика в двух разных действиях"

Вы можете решить эту проблему, используя 2 темы.

  1. SharePrefernce

  2. умысел

SharePrefernce

Сохраните положение массива Spinner.

Получите положение и установите его в Spinner, когда вы снова используете.

Пример:-

Для сохранения или сохранения позиции в SharePrefernce.

 int position = spin.getSelectedItemPosition() ; PreferenceManager.getDefaultSharedPreferences(this).edit().putInt("position",position ).commit(); 

Для получения или установки значения из SharePrefernce в Spinner.

 int position = PreferenceManager.getDefaultSharedPreferences(this).getInt("position", 0); spin.setSelection(position); 

умысел

Сохраните позицию массива Spinner в намерении.

Получите позицию и установите для нее значение, когда вы снова используете намерение.

Пример:-

Для сохранения или сохранения позиции в Intent.

 int position = spin.getSelectedItemPosition() ; Intent myIntent = new Intent(A.this, B.class); myIntent.putExtra("position", position); startActivity(myIntent); 

Для получения или установки значения от Intent до Spinner.

 Intent mIntent = getIntent(); int position = mIntent.getIntExtra("position", 0); spin.setSelection(position); 

Это оба работают. Я уже проверил это.

 private List<Item> customerList = new ArrayList<Item>(); 

Список клиентов – это список модели данных «Item», класс pojo.

 position = customerList.indexOf(bundle.getString("name")); 

В этой строке вы пытаетесь получить индекс выбранного элемента, передавая строку. Список массивов не сможет сравнить два разных типа объекта. Вы должны передать экземпляр «item»: position = customerList.indexOf (item);

И вы должны переопределить методы «equals» в классе Item, используя некоторые уникальные свойства класса. Этот метод equals будет использоваться для сравнения двух объектов, и список вернет индекс объекта, если он присутствует в списке. Пожалуйста, проверьте это и это для уточнения.

Класс данных Modal

 public class Item implements Serializable { int id; String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Item item = (Item) o; if (getId() != item.getId()) return false; return getName().equals(item.getName()); } 

}

Класс активности

  package spinner.sample.spinnerexample; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Spinner; import java.util.ArrayList; public class MainActivity extends AppCompatActivity { private Spinner spinner; ArrayList<Item> customerList = new ArrayList<>(); SpinnerAdapter spinnerAdapter; public static final String EXTRA_INTENT_CUSTOMER_LIST ="extra_intent_customer_list"; public static final String EXTRA_INTENT_SELECTED_ITEM = "extra_intent_selected_item"; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); spinner = (Spinner)findViewById(R.id.spinner); createList(); spinnerAdapter = new SpinnerAdapter(customerList, this); spinner.setAdapter(spinnerAdapter); } private void createList(){ Item item1 = new Item(); item1.setId(14); item1.setName("Automobile"); Item item2 = new Item(); item2.setId(15); item2.setName("Business Services"); Item item3 = new Item(); item3.setId(16); item3.setName("Business"); Item item4 = new Item(); item4.setId(17); item4.setName("Computers"); Item item5 = new Item(); item5.setId(18); item5.setName("Computers Acc"); Item item6 = new Item(); item6.setId(19); item6.setName("Education"); Item item7 = new Item(); item7.setId(20); item7.setName("Personal"); customerList.add(item1); customerList.add(item2); customerList.add(item3); customerList.add(item4); customerList.add(item5); customerList.add(item6); customerList.add(item7); } public void onClick(View view){ if(customerList.isEmpty()) return; Item selectedItem = (Item) spinner.getSelectedItem(); System.out.println("Selected item "+selectedItem); Intent intent = new Intent(this, SecondActivity.class); intent.putExtra(EXTRA_INTENT_CUSTOMER_LIST, customerList); intent.putExtra(EXTRA_INTENT_SELECTED_ITEM, selectedItem); startActivity(intent); } 

}

Мероприятие 2

  package spinner.sample.spinnerexample; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.widget.Spinner; import java.util.ArrayList; public class SecondActivity extends AppCompatActivity { private Spinner spinner; ArrayList<Item> customerList = new ArrayList<>(); SpinnerAdapter spinnerAdapter; Item selectedItem; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); if(getIntent().hasExtra(MainActivity.EXTRA_INTENT_CUSTOMER_LIST)){ customerList = (ArrayList<Item>) getIntent().getSerializableExtra(MainActivity.EXTRA_INTENT_CUSTOMER_LIST); } if(getIntent().hasExtra(MainActivity.EXTRA_INTENT_SELECTED_ITEM)){ selectedItem = (Item)getIntent().getSerializableExtra(MainActivity.EXTRA_INTENT_SELECTED_ITEM); } spinner = (Spinner)findViewById(R.id.spinner); if(customerList.isEmpty()) return; spinnerAdapter = new SpinnerAdapter(customerList, this); spinner.setAdapter(spinnerAdapter); if(selectedItem != null){ spinner.setSelection(customerList.indexOf(selectedItem)); } } } Adapter : package spinner.sample.spinnerexample; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.TextView; import java.util.ArrayList; /** * Created by praveen on 17/8/16. */ public class SpinnerAdapter extends BaseAdapter { ArrayList<Item> categories = new ArrayList<>(); Context mContext; public SpinnerAdapter(ArrayList<Item> categories, Context context){ this.categories = categories; mContext = context; } @Override public int getCount() { return categories.size(); } @Override public Object getItem(int i) { return categories.get(i); } @Override public long getItemId(int i) { return categories.get(i).hashCode(); } @Override public View getView(int i, View view, ViewGroup viewGroup) { Item item = categories.get(i); ViewHolder holder = null; if(view == null){ view = LayoutInflater.from(mContext).inflate(R.layout.spinner_item, null); holder = new ViewHolder(); holder.name = (TextView) view.findViewById(R.id.txt_view_spinner_item); view.setTag(holder); } else { holder = (ViewHolder) view.getTag(); } holder.name.setText(item.getName()); return view; } static class ViewHolder{ TextView name; } } 

Это должно быть Intent в ServiceRequest :

 Intent intent = new Intent(ServiceRequest.this, Form.class); Bundle extras = new Bundle(); extras.putString("local", autoCompView.getText().toString()); extras.putInt("position", spin.getSelectedItemPosition()); intent.putExtras(extras); startActivity(intent); 

И это должно быть так, как вы устанавливаете Spinner в onCreate() вашей деятельности Form :

 spin = (Spinner) findViewById(R.id.spinner); adapter = new SpinAdapter(this, customerList); spin.setAdapter(adapter); Bundle extras = getIntent().getExtras(); spin.setSelection(extras.getInt("position")); 

Я могу найти решение. Попытайтесь изменить свой код активности с этим,

 public class MainActivity extends AppCompatActivity{ private ArrayList<Item> customerList = new ArrayList<Item>(); private SpinnerAdapter adapter; public static final String EXTRA_INTENT_CUSTOMER_LIST ="extra_intent_customer_list"; public static final String EXTRA_INTENT_SELECTED_ITEM = "extra_intent_selected_item"; private List<Item> items; Spinner spin; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // getLayoutInflater().inflate(R.layout.activity_main, null); Button login = (Button) findViewById(R.id.login); spin = (Spinner) findViewById(R.id.service_spinner); assert login != null; login.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (spin.getSelectedItemPosition() == 0) { Toast.makeText(MainActivity.this, "Please Select item", Toast.LENGTH_SHORT).show(); } else { if(customerList.isEmpty()) return; Item selectedItem = (Item) spin.getSelectedItem(); Intent intent = new Intent(MainActivity.this, SecondActivity.class); intent.putExtra(EXTRA_INTENT_SELECTED_ITEM, spin.getSelectedItemPosition()); startActivity(intent); } } }); for (int i = 0; i < 1; i++) { Item customer = new Item(); customer.setId(""+i); customer.setName("Select Obj"); // adding movie to movies array customerList.add(customer); } adapter = new SpinnerAdapter((ArrayList<Item>) customerList, this); spin.setAdapter(adapter); } public void onStart(){ super.onStart(); BackTask bt=new BackTask(); bt.execute(); } private class BackTask extends AsyncTask<Void,Void,ArrayList<Item>> { protected void onPreExecute(){ super.onPreExecute(); } protected ArrayList<Item> doInBackground(Void... params) { InputStream is = null; String result = ""; try { HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost("http://my_url/json"); HttpResponse response = httpclient.execute(httppost); HttpEntity entity = response.getEntity(); // Get our response as a String. is = entity.getContent(); } catch (IOException e) { e.printStackTrace(); } //convert response to string try { BufferedReader reader = new BufferedReader(new InputStreamReader(is, "utf-8")); String line = null; while ((line = reader.readLine()) != null) { result += line; } is.close(); //result=sb.toString(); } catch (Exception e) { e.printStackTrace(); } // parse json data try { JSONArray jArray = new JSONArray(result); for (int i = 0; i < jArray.length(); i++) { JSONObject obj = jArray.getJSONObject(i); Item customer = new Item(); customer.setId(obj.getString("ServiceId")); customer.setName(obj.getString("ServiceName")); // adding movie to movies array customerList.add(customer); } } catch (JSONException e) { e.printStackTrace(); } return customerList; } @Override protected void onPostExecute(ArrayList<Item> customerList) { if(customerList != null && !customerList.isEmpty()){ // adapter.updateDate(customerList); adapter.notifyDataSetChanged(); } } }} 

И SecondActivity:

 public class SecondActivity extends AppCompatActivity { private static final String REGISTER_URL = "http://my_url/Service.asmx/GenerateTicket"; public static final String PREFS_NAME = "MyPrefsFile"; public static final String CUSTOMERID = "customerId"; public static final String USERNAME = "name"; public static final String HOUSENO = "houseNo"; public static final String LOCALITY = "areaName"; public static final String SERVICE = "serviceId"; public static final String MOBILE = "mobile"; public static final String EMAIL = "email"; public static final String PROBLEM = "jobBrief"; private ProgressDialog pDialog; Spinner spin; String service; Item selectedItem; // flag for Internet connection status Boolean isInternetPresent = false; private ArrayList<Item> customerList = new ArrayList<Item>(); private SpinnerAdapter adapter; private List<Item> items; AdapterView.OnItemSelectedListener listener; Spinner service_need; AutoCompleteTextView autoCompView; String obj; int pos; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_second); //getLayoutInflater().inflate(R.layout.activity_second, null); if(getIntent().hasExtra(MainActivity.EXTRA_INTENT_SELECTED_ITEM)){ pos = getIntent().getIntExtra(MainActivity.EXTRA_INTENT_SELECTED_ITEM,0); } service_need = (Spinner) findViewById(R.id.service_need); for (int i = 0; i < 1; i++) { Item customer = new Item(); customer.setId(""+i); customer.setName("Select Obj"); // adding movie to movies array customerList.add(customer); } adapter = new SpinnerAdapter(customerList, this); service_need.setAdapter(adapter); } public void onStart() { super.onStart(); BackTask bt = new BackTask(); bt.execute(); } private class BackTask extends AsyncTask<Void, Void, ArrayList<Item>> { ArrayList<String> list; protected void onPreExecute() { super.onPreExecute(); } protected ArrayList<Item> doInBackground(Void... params) { InputStream is = null; String result = ""; try { HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost("http://my_url/json"); HttpResponse response = httpclient.execute(httppost); HttpEntity entity = response.getEntity(); // Get our response as a String. is = entity.getContent(); } catch (IOException e) { e.printStackTrace(); } //convert response to string try { BufferedReader reader = new BufferedReader(new InputStreamReader(is, "utf-8")); String line = null; while ((line = reader.readLine()) != null) { result += line; } is.close(); //result=sb.toString(); } catch (Exception e) { e.printStackTrace(); } // parse json data try { JSONArray jArray = new JSONArray(result); for (int i = 0; i < jArray.length(); i++) { JSONObject obj = jArray.getJSONObject(i); Item customer = new Item(); customer.setId(obj.getString("ServiceId")); customer.setName(obj.getString("ServiceName")); customerList.add(customer); } } catch (JSONException e) { e.printStackTrace(); } return customerList; } @Override protected void onPostExecute(ArrayList<Item> customerList) { if(customerList != null && !customerList.isEmpty()){ service_need.setSelection(pos); } } }} 

Issue1: NullPointerException в SecondActivity из-за нулевого объекта spinner. Идентификатор Spinner во втором действии – Service_need.

Issue2: Back_task DoInBackground метод в SecondActivity возвращает null, он должен возвращать ArrayList для проверки в OnPostExecute.

Благодарю.

Надеюсь, поможет.!

Попытайтесь получить позицию выбранного имени в первом действии, пройдя через List во втором действии.

 position = customerList.indexOf(bundle.getString("name")); spin.setSelection(position,false); 

Используйте setSelection(position) вместо setSelection(position, false)

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

Позволяет предположить, что ваша position верна, но вы можете проверить с помощью простого Log.d(tag, "pos:"+position) и что ваш счетчик правильно заполнен с помощью customerList (вы можете визуально проверить это или Log.d(tag, "size:"+adapter.getCount()) или spin.getCount() )

2 вещи (или оба), чтобы попробовать:

  1. Ваш adapter.notifyDataSetChanged() должен появиться сразу после customerList.addAll(position,customerList) . Если вы делаете setSelection до этого, то ваш счетчик по-прежнему пуст.

  2. Небольшой шанс, что ваш spinner ui еще не готов, сделайте так:

     spin.post(new Runnable() { @Override public void run() { spin.setSelection(position); } });