Потеря позиции указанного элемента c при переключении в ландшафтный режим - PullRequest
0 голосов
/ 09 марта 2020

Я работаю с приложением, в то время как его целью является отслеживание списка слов, которые человек может заинтересовать в изучении. Приложение разделено на 3 действия, в которых первое действие (ListActivity) показывает список слов с несколькими сведениями (изображение, слово, произношение и рейтинг) о каждом слове. Данные об изображении, слове и произношении уже известны и жестко закодированы (я знаю, что было бы намного лучше, если бы я просто считывал данные из csv-файла, но оставил это на время), и рейтинг можно установить с помощью EditActivity.

В этом контексте я реализовал код, который обрабатывает щелчки по определенному слову c, которое приведет меня ко 2-му действию (DetailsActivity) со всей необходимой информацией из конкретного слова, а также с получением данных рейтинга и отображением на правильный индекс / пункт. Код работает, и все вроде бы хорошо, но есть ошибка, которую я действительно не могу устранить.

Ошибка возникает, когда я делаю следующее:

  1. Я нажимаю на конкретное слово в обзоре переработчика
  2. Я редактирую слово, даю ему оценку 8 и нажимаю ОК. Теперь данные будут отправлены в ListActivity и будут отображаться с правильным индексом / словом.
  3. Я нажимаю на то же слово и переключаюсь в альбомный режим и выбираю для редактирования слова. Допустим, я теперь присвоил ему рейтинг 5 и нажал ОК.
  4. Новые данные рейтинга будут установлены / показаны с индексом 0, а не с конкретным словом.

В чем здесь проблема? Кажется, что он теряет позицию где-то в приложении и между намерениями, но я не могу понять, почему.

ListActivity:

public class ListActivity extends AppCompatActivity implements WordAdapter.OnItemListener {

    ArrayList<WordItemParcelable> mWords = new ArrayList<WordItemParcelable>();
    private WordAdapter mAdapter;
    private static final int REQUEST_CODE_DETAILS_ACTIVITY = 1;
    private Button exitBtn;
    private String rating, note;
    private int wordClickedIndex = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_list);

        if (savedInstanceState != null) {
            mWords = savedInstanceState.getParcelableArrayList(getString(R.string.key_orientationchange));
        } else {
            mWords = new ArrayList<>();
            insertWords();
        }
        setUpExitBtn();
        setUpRecyclerView();
    }

    public void insertWords() {
        mWords.add(new WordItemParcelable(R.drawable.lion, "Lion", "ˈlīən", "A large tawny-coloured cat that lives in prides, found in Africa and NW India. The male has a flowing shaggy mane and takes little part in hunting, which is done cooperatively by the females.", "" + 0.0));
        mWords.add(new WordItemParcelable(R.drawable.leopard, "Leopard", "ˈlepərd", "A large solitary cat that has a fawn or brown coat with black spots, native to the forests of Africa and southern Asia.", "" + 0.0));
        mWords.add(new WordItemParcelable(R.drawable.cheetah, "Cheetah", "ˈCHēdə", "A large slender spotted cat found in Africa and parts of Asia. It is the fastest animal on land.", "" + 0.0));
        mWords.add(new WordItemParcelable(R.drawable.elephant, "Elephant", "ˈeləfənt", "A very large plant-eating mammal with a prehensile trunk, long curved ivory tusks, and large ears, native to Africa and southern Asia. It is the largest living land animal.", "" + 0.0));
        mWords.add(new WordItemParcelable(R.drawable.giraffe, "Giraffe", "jəˈraf", "A large African mammal with a very long neck and forelegs, having a coat patterned with brown patches separated by lighter lines. It is the tallest living animal.", "" + 0.0));
        mWords.add(new WordItemParcelable(R.drawable.kudo, "Kudu", "ˈko͞odo͞o", "An African antelope that has a greyish or brownish coat with white vertical stripes, and a short bushy tail. The male has long spirally curved horns.", "" + 0.0));
        mWords.add(new WordItemParcelable(R.drawable.gnu, "Gnu", "n(y)o͞o", "A large dark antelope with a long head, a beard and mane, and a sloping back.", "" + 0.0));
        mWords.add(new WordItemParcelable(R.drawable.oryx, "Oryx", "null", "A large antelope living in arid regions of Africa and Arabia, having dark markings on the face and long horns.", "" + 0.0));
        mWords.add(new WordItemParcelable(R.drawable.camel, "Camel", "ˈkaməl", "A large, long-necked ungulate mammal of arid country, with long slender legs, broad cushioned feet, and either one or two humps on the back. Camels can survive for long periods without food or drink, chiefly by using up the fat reserves in their humps.", "" + 0.0));
        mWords.add(new WordItemParcelable(R.drawable.shark, "Shark", "SHärk", "A long-bodied chiefly marine fish with a cartilaginous skeleton, a prominent dorsal fin, and tooth-like scales. Most sharks are predatory, though the largest kinds feed on plankton, and some can grow to a large size.", "" + 0.0));
        mWords.add(new WordItemParcelable(R.drawable.crocodile, "Crocodile", "ˈkräkəˌdīl", "A large predatory semiaquatic reptile with long jaws, long tail, short legs, and a horny textured skin.", "" + 0.0));
        mWords.add(new WordItemParcelable(R.drawable.snake, "Snake", "snāk", "A long limbless reptile which has no eyelids, a short tail, and jaws that are capable of considerable extension. Some snakes have a venomous bite.", "" + 0.0));
        mWords.add(new WordItemParcelable(R.drawable.buffalo, "Buffalo", "ˈbəf(ə)ˌlō", "A heavily built wild ox with backward-curving horns, found mainly in the Old World tropics:", "" + 0.0));
        mWords.add(new WordItemParcelable(R.drawable.ostrich, "Ostrich", "ˈästriCH", "A flightless swift-running African bird with a long neck, long legs, and two toes on each foot. It is the largest living bird, with males reaching a height of up to 2.75 m.", "" + 0.0));
    }

    public void setUpRecyclerView() {
        RecyclerView mRecyclerView = findViewById(R.id.recyclerView);
        mRecyclerView.setHasFixedSize(true);
        RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(this);
        mAdapter = new WordAdapter(mWords, this);

        mRecyclerView.setLayoutManager(mLayoutManager);
        mRecyclerView.setAdapter(mAdapter);
    }

    @Override
    public void onItemClick(int position) {
        Intent intent = new Intent(this, DetailsActivity.class);
         WordItemParcelable clickedWord = mWords.get(position);
        wordClickedIndex = position;

        intent.putExtra(getString(R.string.key_picture), clickedWord.getImageResource());
        intent.putExtra(getString(R.string.key_name), clickedWord.getWord());
        intent.putExtra(getString(R.string.key_pronouncing), clickedWord.getPronouncing());
        intent.putExtra(getString(R.string.key_description), clickedWord.getDescription());
        intent.putExtra(getString(R.string.key_rating), clickedWord.getRating());
        intent.putExtra(getString(R.string.key_notes), clickedWord.getNotes());

        startActivityForResult(intent, REQUEST_CODE_DETAILS_ACTIVITY);
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        if (requestCode == REQUEST_CODE_DETAILS_ACTIVITY) {
            if (resultCode == RESULT_OK) {
                if (data != null) {

                   rating = data.getStringExtra(getString(R.string.key_rating));
                   note = data.getStringExtra(getString(R.string.key_notes));

                    WordItemParcelable i = mWords.get(wordClickedIndex);
                    i.setRating(rating);

                    mWords.set(wordClickedIndex, i);
                    mAdapter.updateData(mWords);
                    mAdapter.notifyDataSetChanged(); 
                }
            }
        }
    }

    public void setUpExitBtn() {
        exitBtn = (Button) findViewById(R.id.exitBtn);

        exitBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                setResult(RESULT_CANCELED);
                finish();
            }
        });
    }


    @Override
    protected void onSaveInstanceState(@NonNull Bundle outState) {
        outState.putParcelableArrayList(getString(R.string.key_orientationchange), mWords);
        super.onSaveInstanceState(outState);
    }

}

Адаптер:

public class WordAdapter extends RecyclerView.Adapter<WordAdapter.WordViewHolder> {
    private ArrayList<WordItemParcelable> mWordList;
    private OnItemListener mOnItemListener;
    private int position;

    public static class WordViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        ImageView mPicture;
        TextView txtName, txtPronouncing, txtRating;
        OnItemListener onItemListener;
        private int position;

        public WordViewHolder(@NonNull View itemView, OnItemListener onItemListener) {
            super(itemView);

            mPicture = itemView.findViewById(R.id.picture);
            txtName = itemView.findViewById(R.id.txtNameOfTheWord);
            txtPronouncing = itemView.findViewById(R.id.txtPronoucing);
            txtRating = itemView.findViewById(R.id.txtListRating);
            this.onItemListener = onItemListener;

            itemView.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            onItemListener.onItemClick(getAdapterPosition());
        }
    }


    public WordAdapter(ArrayList<WordItemParcelable> wordList, OnItemListener onItemListener) {
        this.mWordList = wordList;
        this.mOnItemListener = onItemListener;
    }

    @NonNull
    @Override
    public WordViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.word_item, parent, false);
        WordViewHolder wvh = new WordViewHolder(v, mOnItemListener);
        return wvh;
    }

    @Override
    public void onBindViewHolder(@NonNull WordViewHolder holder, int position) {
        WordItemParcelable word = mWordList.get(position);

        int image = word.getImageResource();
        String name = word.getWord();
        String pronounce = word.getPronouncing();
        String rating = word.getRating();

        holder.mPicture.setImageResource(image);
        holder.txtName.setText(name);
        holder.txtPronouncing.setText(pronounce);
        holder.txtRating.setText(rating);
    }

    @Override
    public int getItemCount() {
        return mWordList.size();

    }

    public interface OnItemListener {
        void onItemClick(int position);
    }

    public void updateData(ArrayList<WordItemParcelable> newList) {
        mWordList = newList;
    }

}

1 Ответ

1 голос
/ 09 марта 2020

При изменении ориентации экрана действие воссоздается для сохранения информации, используйте onsaveinstancestate: https://developer.android.com/guide/components/activities/activity-lifecycle

if (savedInstanceState != null) {
   position = savedInstanceState.getInteger(KEY);
}

@Override
public void onSaveInstanceState(Bundle outState) {
outState.putString(KEY, position);

super.onSaveInstanceState(outState);
}

(Это псевдокод, возможны ошибки)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...