Как изменить положение счетчика в соответствии с положением другого счетчика в двух разных действиях
У меня есть два раскрывающегося списка 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"}]
Ответы
Ответ 1
Вы можете решить эту проблему, используя 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 в намерении.
Получите позицию и установите ее в 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);
Это работает. Я уже проверил его.
Ответ 2
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;
}
}
Ответ 3
Это должно быть 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"));
Ответ 4
Я могу найти решение. Попытайтесь изменить свой код активности,
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);
}
}
}}
Проблема 1: исключение NullPointerException в SecondActivity из-за нулевого счетчика объектов. Spinner Id во втором действии - Service_need.
Проблема 2: метод Back_task DoInBackground в SecondActivity возвращает null, он должен возвращать ArrayList для проверки в OnPostExecute.
Спасибо.
Надеюсь, что это поможет.
Ответ 5
Попробуйте получить позицию выбранного имени в первом действии, пройдя его через List
во втором действии.
position = customerList.indexOf(bundle.getString("name"));
spin.setSelection(position,false);
Ответ 6
Используйте setSelection(position)
вместо setSelection(position, false)
Ответ 7
получить первую позицию поворотника и выполнить другую операцию с помощью намерения и установить первую позицию счетчика на второй счетчик. (второй счетчик должен быть обычным, например, наматывать с помощью edittext).
Ответ 8
позволяет предположить, что ваш position
правильный, но вы можете проверить с помощью простого Log.d(tag, "pos:"+position)
и что ваш счетчик правильно заполнен с помощью customerList
(вы можете визуально проверить, что или Log.d(tag, "size:"+adapter.getCount())
или spin.getCount()
)
2 вещи (или оба), чтобы попробовать:
-
ваш adapter.notifyDataSetChanged()
должен появиться сразу после customerList.addAll(position,customerList)
. если вы делаете setSelection
до этого, то ваш счетчик все еще пуст.
-
Небольшой шанс, что ваш spinner ui еще не готов, сделайте следующее:
spin.post(new Runnable() {
@Override
public void run() {
spin.setSelection(position);
}
});