Android Beginner // Почему мои переменные все 0 после того, как я должен был их заполнить? - PullRequest
0 голосов
/ 27 октября 2018

Я только что отредактировал это сообщение из своего исходного, потому что я мог сузить проблему, но не хотел открывать для него дополнительное сообщение.

Что я хочу Iесть активность, в которой я генерирую данные из домов в массив.Затем при открытии другой операции данные должны использоваться для ее отображения.

Моя проблема Данные генерируются правильно, и я вижу в своих журналах, что они генерируются, прежде чем я хочу получить доступЭто.При доступе он все еще не показывает мне мои данные.

Мой код

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

public class Houses{

int[][] NewHouseProps = new int[20][10];
int[][] HouseProps;

public Houses(){
}

public ArrayList<Integer> getClasses()
{
    ArrayList<Integer> classes = new ArrayList<>();
    Log.d("Test","ID: "+3+" CLASS: "+NewHouseProps[3][0]);
    Log.d("Test","ID: "+4+" CLASS: "+NewHouseProps[4][0]);
    for(int id=0 ; id<=8; id++) {
        classes.add(NewHouseProps[id][0]);
        Log.d("getClasses","Classes: "+NewHouseProps[id][0]);
        Log.d("getClasses!!!!!!!!!", "List: "+classes.get(id));
    }

    return classes;
}

public void GenerateHouses(){
    Log.d("Generate Houses","!!");
    for(int id=0; id<=8; id++){
            Random r = new Random();
            int h_class, garage = 0, rooms = 0, furn = 0, balkon = 0, pool = 0;
            h_class = r.nextInt(4); //Klasse
            if(h_class == 0){
                rooms = r.nextInt(4)+1;
                balkon = r.nextInt(1);
            }else if(h_class == 1){
                rooms = r.nextInt(3)+3;
                garage = r.nextInt(1)+1;
                pool = r.nextInt(1);
                balkon = r.nextInt(2);
            }else if(h_class == 2){
                rooms = r.nextInt(3)+2;
                garage = r.nextInt(2)+2;
                pool = r.nextInt(1);
            }else if(h_class == 3){
                rooms = r.nextInt(8)+6;
                garage = r.nextInt(6)+4;
                pool = r.nextInt(1);
                balkon = r.nextInt(3);
            }
            furn = r.nextInt(1);

            int price = GenerateHousePrice(id, h_class, garage, rooms, furn, balkon, pool);
            NewHouseProps[id][0] = h_class;
            NewHouseProps[id][1] = price;
            NewHouseProps[id][2] = rooms;
            NewHouseProps[id][3] = furn;
            NewHouseProps[id][4] = balkon;
            NewHouseProps[id][5] = pool;
            NewHouseProps[id][6] = garage;
            Log.d("ID: ", Integer.toString(id));
            Log.d("CLASS: ",Integer.toString(NewHouseProps[id][0]));
            Log.d("PRICE: ", Integer.toString(NewHouseProps[id][1]));
    }

}

public int GenerateHousePrice(int id, int h_class, int garage, int rooms, int furn, int balkon, int pool){

    int price = 0, pricep = 0;
    Random r = new Random();
    if(h_class == 0){
        price = r.nextInt(150000)+50000; // 50 - 200 tausend
        price += rooms * 7500;
    }
    else if(h_class == 1){
        price = r.nextInt(165000)+85000; //85 - 250 tausend
        price += rooms * 12500;
    }
    else if(h_class == 2){
        price = r.nextInt(300000)+100000; //100 - 400 tausnd
        price += rooms * 20000;
    }
    else if(h_class == 3){
        price = r.nextInt(800000)+500000; // 500 - 1.3 Mill.
        price += rooms * 15000;
    }

    if(garage > 0){
        pricep += price*0.20;
        pricep += garage * 500;
    }
    if(furn == 1){
        pricep += price*0.25;
    }
    if(balkon > 0){
        pricep += price*0.1;
        pricep += balkon*500;
    }
    if(pool == 1){
        pricep += 20000;
    }
    price += pricep;
    return price;
}

BuyHousesActivity.java (Здесь данные должны быть доступны и отображены)

public class BuyHousesActivity extends FragmentActivity {


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_buy_houses);
    Houses h = new Houses();
    ArrayList<Integer> classes = h.getClasses();
    for(int id=0;id<=8;id++){
        Log.d("OnCreate Classes: ","Classes: "+classes.get(id));
    }
    List<Integer> images = new ArrayList<>();
    images.add(R.drawable.apartment);
    images.add(R.drawable.townhouse);
    images.add(R.drawable.bungalow);
    images.add(R.drawable.villa);
    ViewPager viewPager = findViewById(R.id.vpPager);
    viewPager.setAdapter(new MyViewPagerAdapter(getSupportFragmentManager(), images));

}



protected class MyViewPagerAdapter extends FragmentStatePagerAdapter {
    private List<Integer> imageList;

    MyViewPagerAdapter(FragmentManager fm, List<Integer> images) {
        super(fm);

        imageList = images;
    }

    @Override
    public int getCount() {
        return imageList.size();
    }

    @Override
    public Fragment getItem(int position) {
        return FragmentBuyHouse.newInstance(imageList.get(position));
    }
}

Мои журналы Это результаты моих журналов, с такими же местами, как вы, см. Выше: Создание Доступ к

Я надеюсь, что вы можете помочь мне и показать мне, что я ошибся и / или забыл.

1 Ответ

0 голосов
/ 28 октября 2018

Это происходит потому, что вы используете пустой список.Посмотрите.

В вашем FragmentBuyHouse вы вызываете:

BuyHousesActivity bha = new BuyHousesActivity();
List<Integer> classes = bha.classes;

Но когда вы создаете экземпляр new BuyHouseActivity(), он инициализирует массив без данных.Посмотрите на ваш класс BuyHouseActivity

List<Integer> classes = new ArrayList<>();

В вашей реализации вы заполняете его массивом classes в методе onCreate(), который не вызывается при установке класса.Это является причиной того, что у вас есть ошибка в строке 46.

Вам нужно передать данные по параметру, как вы делаете это с помощью Bundle.

Решение 2

Вы можете создать статический метод для возврата классов:

Измените BuyHousesActivity:

public class BuyHousesActivity extends FragmentActivity {

List<Integer> classes = new ArrayList<>();
private ViewPager mPager;
private PagerAdapter mPagerAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // Houses h = new Houses(); //Activity where my Houses get generated
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_buy_houses);
    Log.d("1. Step", "!!!!!!!!!!!!!!!!!!!!!!");
 //   for(int id=0; id<=8;id++){
 //       classes.add(h.NewHouseProps[id][0]);
 //       Log.d("Klasse: ", Integer.toString(h.NewHouseProps[id][0]));
 //   }
 //   Log.d("2. Step", "!!!!!!!!!!!!!!!!!!!!!!");

    /*
    classes.add(R.drawable.apartment); //Class 0
    classes.add(R.drawable.townhouse); //Class 1
    classes.add(R.drawable.bungalow); //Class 2
    classes.add(R.drawable.villa); //Class 3
    */

    mPager = findViewById(R.id.vpPager);
    mPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager(), classes);
    mPager.setAdapter(mPagerAdapter);


}


public static ArrayList<Integer> getClasses()
 {
     Houses h = new Houses();
     classes = new ArrayList<>();
     for(int id=0 ; id<=8; id++) {
         classes.add(h.NewHouseProps[id][0]);
     }

     return classes;
 }


@Override
public void onBackPressed() {
    //ViewPager Last Page or Back
    if (mPager.getCurrentItem() == 0) {
        super.onBackPressed();
    } else {
        mPager.setCurrentItem(mPager.getCurrentItem() - 1);
    }
}

И вы хотите получить классы, подобные FragmentBuyHouse

public class FragmentBuyHouse extends Fragment {

private int[] imageResId;
private int fragnumber;
BuyHousesActivity bha = new BuyHousesActivity();
List<Integer> classes = bha.getClasses();
...
}
...