Почему Getter и Setter не работают для Arraylist в Android

#java #android #android-studio #arraylist #getter-setter

#java #Android #android-studio #arraylist #getter-setter

Вопрос:

Я новичок в Android. У меня есть 2 класса, и я создаю ArrayList в одном классе и передаю его другому, используя метод setter.

Проблема: я хочу, чтобы listview отображался только после получения данных в arraylist, что происходит после нажатия кнопки. Я не могу получить доступ к возвращаемому результату метода getter и не могу получить доступ к любой другой переменной в методе getter.

Класс 1: SearchIngredients (getFoodlist, setFoodlist)

 public class SearchIngredients extends AppCompatActivity {

//UI
EditText enter_ingredients;
Button search_ingredients, search_recipe;
ListView ingredient_display;


//Variables
private Recipe displayRecipe;
private Instructions instructions;
private ArrayList<String> foodlist;
private JSONArray foodArray;
private ArrayList<String> ingredientList;
private IngredientAdapter ingredientAdapter;
private JSONArray jsonArray;
private boolean stats = false;
String TAG = "SearchIngredients";
public SharedPreferences preferences;
public SharedPreferences.Editor editor;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_search);

    //UI
    enter_ingredients = findViewById(R.id.enter_ingredients);
    ingredient_display = findViewById(R.id.ingredient_display);
    search_ingredients = findViewById(R.id.search_ingredients);
    search_recipe = findViewById(R.id.search_recipe);

    // variables
    foodlist = new ArrayList<String>();
    foodArray = new JSONArray();
    ingredientList = new ArrayList<String>();
    jsonArray = new JSONArray();
    preferences = this.getSharedPreferences("dataStatus", MODE_PRIVATE);
    editor  = preferences.edit();

    //click functionality
    search_recipe.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            String food = enter_ingredients.getText().toString();

            if (food.equals("")) {
                enter_ingredients.setError("Enter the ingredients before searching");
            } else {

                getIngredients(food);
            }

        }
    });

  
}

public void getIngredients(String food) {
    Ingredients methods = new Ingredients(SearchIngredients.this);
    String url = methods.SearchIngredientURL(food);
    methods.JsonRequest(url);

}

//Getter and Setter
public ArrayList<String> getFoodlist() {
    Log.d("foodArrayGetList", ""   foodlist); // after setting the value still the value is null
    return this.foodlist;
}

public void setFoodlist(ArrayList<String> foodlist) {  //setting the value for foodlist from Class 2
    this.foodlist = new ArrayList<>();
    this.foodlist = foodlist;
    Log.d("foodArraySetList", ""   this.foodlist);
}
}
  

Класс 2:

 public class Ingredients {
private Context context;
private ArrayList<String> newData;
private JSONArray foodArray;
private ArrayList<String> ingredientsList;

//constructor
public Ingredients(Context context) {
    this.context = context;
    this.newData = new ArrayList<String>();
    this.foodArray = new JSONArray();
    this.ingredientsList = new ArrayList<String>();
}


//JSON Object Request
//GET Method from API
public void JsonRequest(String url) {
    final SearchIngredients searchIngredients = new SearchIngredients();
    JsonArrayRequest arrayRequest = new JsonArrayRequest(
            Request.Method.GET,
            url,
            null,
            new Response.Listener<JSONArray>() {
                @Override
                public void onResponse(JSONArray response) {
                    try {
                        setFoodArray(response);
                        Log.d("foodArrayIn", ""   foodArray);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                    try {
                        newData = savedData(response);
                        searchIngredients.setFoodlist(newData); // calling the setter function of Class 1
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }

            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.e("Rest Error Recipe", error.toString());
                }
            }

    );
    RequestQueue requestQueue = Volley.newRequestQueue(context);
    requestQueue.add(arrayRequest);
}

public ArrayList<String> savedData(JSONArray response) throws JSONException {
    for (int i = 0; i < response.length(); i  ) {
        JSONObject jsonObject = response.getJSONObject(i);

        //Parse JSON data
        String name = (jsonObject.getString("name"));
        IngredientName ingredientName = new IngredientName(name);
        Log.d("ingredientName", ""   ingredientName.getName());

        ingredientsList.add(ingredientName.getName());

    }
    Log.d("SearchIngre", ""   ingredientsList.toString());
    this.setNewData(ingredientsList);
    return ingredientsList;
}

//TODO: Change the Log e.
//IngredientName in JSON Format
public String JsonReturn() {
    SearchGSON searchGSON = new SearchGSON(context, "Bread, Butter");
    Log.e("GSONresult", searchGSON.toString());

    return searchGSON.toString();
}

//Getter and Setter
public JSONArray getFoodArray() {
    Log.d("foodArraygetI", ""   this.foodArray);
    return this.foodArray;
}

public void setFoodArray(JSONArray foodArray) throws JSONException {
    for (int i = 0; i < foodArray.length(); i  ) {
        this.foodArray.put(foodArray.get(i));
    }
    Log.d("foodArraySetClass", ""   this.foodArray);

}
public ArrayList<String> getNewData() {
    Log.d("newDataSet", ""   this.foodArray);
    return this.newData;
}

public void setNewData(ArrayList<String> newData) {

    this.newData = newData;
    Log.d("newDataSet", ""   this.foodArray);
}
}
  

Ответ №1:

Вы создаете другой экземпляр SearchIngredients , вам нужно использовать экземпляр, который вы передали Ingredients конструктору

 public class Ingredients {
private SearchIngredients searchIngredients;
private ArrayList<String> newData;
private JSONArray foodArray;
private ArrayList<String> ingredientsList;

//constructor
public Ingredients(SearchIngredients searchIngredients) {
    this.searchIngredients = searchIngredients;
    this.newData = new ArrayList<String>();
    this.foodArray = new JSONArray();
    this.ingredientsList = new ArrayList<String>();
}


//JSON Object Request
//GET Method from API
public void JsonRequest(String url) {
    //REMOVE THIS final SearchIngredients searchIngredients = new SearchIngredients();
    JsonArrayRequest arrayRequest = new JsonArrayRequest(
            Request.Method.GET,
            url,
            null,
            new Response.Listener<JSONArray>() {
                @Override
                public void onResponse(JSONArray response) {
                    try {
                        setFoodArray(response);
                        Log.d("foodArrayIn", ""   foodArray);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                    try {
                        newData = savedData(response);
                        searchIngredients.setFoodlist(newData); // calling the setter function of Class 1
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }

            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.e("Rest Error Recipe", error.toString());
                }
            }

    );
    RequestQueue requestQueue = Volley.newRequestQueue(searchIngredients);
    requestQueue.add(arrayRequest);
}
  

Комментарии:

1. итак, в классе 1 в методе setter данные из класса 2 отображаются как переменная (this.foodlist ). Не будет ли это устанавливать значение this.foodlist во всем классе? и почему метод getter не отображает данные?

Ответ №2:

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

Смотрите Эту документацию из w3schools.com

https://www.w3schools.com/java/java_modifiers.asp