Switch в Spinner

176
07 февраля 2018, 12:39

Здравствуйте, в общем добавил spinner в mainactivity(выбор этажей:1 этаж, 2 этаж). Нужно было сделать так чтобы при выборе 1 этажа в списке были комнаты 1 этажа, при выборе 2го комнаты 2 го этажа. Это я выполнил(см в MainActivity). Теперь нужно сделать чтобы при нажатии комнат их переводили в соответствующие activity. Я это пытался реализовать, но где то я ошибся. Дело в том что при нажатии на комнаты второго этажа открываются активити комнат первого этажа. Я так понял я неправильно сделал функцию switch в спиннере, там я в начале функции очищаю лист RecycleView с помошью albumList.clear(). И поэтому значения case-ов сбивается. Это лишь мое предположение. Правильного решения не нашел, помогите пожалуйста

Mainactivity.java:

 albumList = new ArrayList<>();
        adapter = new RoomsAdapter(this, albumList);
        RecyclerView.LayoutManager mLayoutManager = new GridLayoutManager(this, 1);
        recyclerView.setLayoutManager(mLayoutManager);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        recyclerView.setAdapter(adapter);
        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                value = parent.getItemAtPosition(position);
                switch (position) {
                    case 0:
                        firstLevel();
                        break;
                    case 1:
                        secondLevel();
                        break;
                }
            }
            @Override
            public void onNothingSelected(AdapterView<?> parent) {
            }
        });

   ...

private void firstLevel() {
        int[] first = new int[]{
                R.drawable.reg,
                R.drawable.spec,
                R.drawable.ozd,
                R.drawable.mast};
        albumList.clear();
        Album a = new Album("Кафедра", first[0]);
        albumList.add(a);
        a = new Album("Зал", first[1]);
        albumList.add(a);
        a = new Album("Оздоровительный зал", first[2]);
        albumList.add(a);
        a = new Album("Школа мастеров", first[3]);
        albumList.add(a);
        adapter.notifyDataSetChanged();
    }
    private void secondLevel() {
        int[] second = new int[]{
                R.drawable.prez,
                R.drawable.nemec,
                R.drawable.chitzal,
                R.drawable.centr};
        albumList.clear();
        Album b = new Album("Читальный зал библиотеки первого Президента", second[0]);
        albumList.add(b);
        b = new Album("Немецко-французский читальный зал", second[1]);
        albumList.add(b);
        b = new Album("Читальный зал", second[2]);
        albumList.add(b);
        b = new Album("Центр по изучению нового языка ", second[3]);
        albumList.add(b);
        adapter.notifyDataSetChanged();
    }

RoomsAdapter.java:

public class MyViewHolder extends RecyclerView.ViewHolder {
    public TextView title;
    public ImageView thumbnail;
    public MyViewHolder(View view) {
        super(view);
        title = (TextView) view.findViewById(R.id.title);
        thumbnail = (ImageView) view.findViewById(R.id.thumbnail);
        thumbnail.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                switch (getAdapterPosition()){
                    case 0:
                        Intent regintent = new Intent(mContext, Register.class);
                        mContext.startActivity(regintent);
                        break;
                    case 1:
                        Intent specintent = new Intent(mContext, Spec.class);
                        mContext.startActivity(specintent);
                        break;
                    case 2:
                        Intent ozdintent = new Intent(mContext, Ozd.class);
                        mContext.startActivity(ozdintent);
                        break;
                    case 3:
                        Intent mastintent = new Intent(mContext, Mast.class);
                        mContext.startActivity(mastintent);
                        break;
                }
            }
        });
    }
}

Album.java:

public class Album {
    private String name;
    private int numOfSongs;
    private int thumbnail;
    public Album() {
    }
    public Album(String name, int thumbnail) {
        this.name = name;
        this.thumbnail = thumbnail;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getThumbnail() {
        return thumbnail;
    }
    public void setThumbnail(int thumbnail) {
        this.thumbnail = thumbnail;
    }
}
Answer 1

В коде у вас ошибок нет. У вас ошибки в логике и понимании. Постараюсь объяснить.

Для достижения нужного поведения, вам необходимо иметь тип ячейки, чтоб понять в какую активити переходить, а вы обрабатываете позицию в списке. Те получается сколько вы не делали бы разных комнат, вы всегда будете переходить в зависимости от позиции. И действительно это лего исправить, я не знаю вашей внутренней реализации и напишу простой код с наименшим кол-ом изменений, в идеале я бы всё переписал:

в классе Album добавим переменную, напирмер: int levelNumber, примерно так:

public class Album {
private int levelNumber;
private String roomName;
private int roomResImage;
public Album(int levelNumber, String roomName, int roomResImage) {
    this.levelNumber = levelNumber;
    this.roomName = roomName;
    this.roomResImage = roomResImage;
}
public int getLevelNumber() {
    return levelNumber;
}
public void setLevelNumber(int levelNumber) {
    this.levelNumber = levelNumber;
}
public String getRoomName() {
    return roomName;
}
public void setRoomName(String roomName) {
    this.roomName = roomName;
}
public int getRoomResImage() {
    return roomResImage;
}
public void setRoomResImage(int roomResImage) {
    this.roomResImage = roomResImage;
}

}

тогда в адаптере примерно будет так:

public TextView title;
public ImageView thumbnail;
public MyViewHolder(View view) {
    super(view);
    title = view.findViewById(R.id.title);
    thumbnail = view.findViewById(R.id.thumbnail);
    int  levelNumber = albums.get(getAdapterPosition()).getLevelNumber();
    thumbnail.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            switch (levelNumber){
                case 1: break; // переход на 1-й левел
                case 2: break; // переход на 2-й левел
                ...
            }
        }
    });
}
READ ALSO
Java: Запись массива в HashMap

Java: Запись массива в HashMap

Есть HashMap<String, boolean[]> map при простой записи

167
Ошибка при запуске maven-приложения

Ошибка при запуске maven-приложения

ЗдравствуйтеПри запуске maven-приложения получаю такую ошибку: "Развертывание на месте на /home/torin/NetBeansProjects/mavenproject1/Calculator1/target/Calculator1-1

123
Таймер на Java Help

Таймер на Java Help

Здравствуйте, моя проблема:

140
main method netbeans

main method netbeans

Есть JFrame в котором выполняются действия по нажатию JButtonПишу код в строке обработчика события , но сам проект не запускается, т

238