Как установить и получить уникальный идентификатор для динамически добавленного Spinner внутри строки ListView в Android? - PullRequest
1 голос
/ 27 февраля 2020

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

У меня есть ListView внутри фрагмента. ListView начинается с пустого значения, но при нажатии кнопки в родительском элементе Fragment в ListView создается строка, содержащая как TextView (сгенерированный с помощью ввода пользователя), так и Spinner. Spinner, добавляемое в каждую строку, идентично с использованием того же набора предварительно созданных данных. Затем строка сортируется в алфавитном порядке по имени, введенному в TextView. Строки в ListView также можно удалить щелчком других установленных параметров из родительского элемента Fragment.

Все это прекрасно работает.

Что мне нужно сделать, так это уникально идентифицировать каждый добавляемый объект счетчика, чтобы пользователь мог сохранить и вспомнить позиционное значение каждого объекта счетчика, который связан с каждым именем в содержащей строке ListView.

Чем я был Можно сделать, по мере роста списка, указывать на самый первый вращающийся объект, самый последний вращающийся объект и вращающийся объект, для которого последний был выбран элемент, но я не могу понять, как указать на каждый указанный c счетчик объект в строке.

PS Я могу указать на каждый TextView объект, являющийся тем, что они являются именами, которые были добавлены в ArrayList.

Работа с массивами обычно работает хорошо для меня, но хотя я знаю, как сохранить значения положения счетчика в массиве, чтобы я мог получить их для заданных c счетчиков, я не могу понять, как хранить их для кратных по существу одного и того же счетчика ... Мне кажется, мне нужно создать ArrayList счетчиков, содержащих каждый счетчик по мере его добавления, и хотя я знаю, как получить доступ к позиционному значению счетчика, я не знать, как получить доступ к позиционному значению каждого счетчика, содержащегося в массиве счетчиков, если это имеет смысл.

Я пробовал setId и setTag [использовать положение] для каждого счетчика при его создании, но без удачи. Кажется, что происходит, когда Id и Tag придерживаются только последнего добавленного счетчика.

Я также пытался использовать Intent, но безуспешно. Приложение вылетает каждый раз, когда я пытаюсь передать его ребенку Fragment.

Любая помощь будет принята с благодарностью.

Вот код для проблемных точек:

  • родительский фрагмент -
    charSav.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            relationsListArray.add(charNameString);
            if (frag2_3.relationsSpinner != null && frag2_3.currentRowSpinner != null) {
                for (int i = 0; i < frag2_3.relationsListView.getCount(); i++) {
                    Toast.makeText(getActivity(), "row " +
// outputs outputs name displayed in each textview within each row
                    relationsListView.getItemAtPosition(i) + "\nT. " +
// outputs top most spinner item selected
                    currentRowSpinner.getSelectedItem().toString() + "\nB. " +
// outputs bottom most spinner item selected
                    relationsSpinner.getSelectedItem().toString() + "\nL. " +
// outputs the last spinner item selected whether it be first, last, or somewhere in the middle
                    relationsItem, Toast.LENGTH_LONG).show();
                }
            }
        }
  • дочерний фрагмент, содержащий класс адаптера -
    public class RelationsListViewAdapter extends ArrayAdapter<String> {
        HashMap<String, Integer> mIdMap = new HashMap<String, Integer>();
        public RelationsListViewAdapter(Context context, int textViewResourceId, ArrayList<String> objects) {
            super(context, textViewResourceId, objects);
            relationsListArray = objects;
            for (int i = 0; i < objects.size(); ++i) {
                mIdMap.put(objects.get(i), i);
            }
        }
        @Override
        public int getCount() { return relationsListArray.size(); }
        @Override
        public String getItem(int position) { return relationsListArray.get(position); }
        @Override
        public long getItemId(int position) { String item = getItem(position); return mIdMap.get(item); }
        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            View view = convertView;
            if (view == null) {
                LayoutInflater inflater = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                view = inflater.inflate(R.layout.listview_spinner_row, null);
            }
        // Spinner Adapter
            adapterRelationsSpinner = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_spinner_item, getResources().getStringArray(R.array.preStoryPlanRelations)){
                @Override
                public boolean isEnabled(int position){
                    if(position == 0) { return false; }
                    else { return true; }
                }
                @Override
                public View getView(int position, View convertView, ViewGroup parent){
                    View view = super.getView(position, convertView, parent);
                    TextView tv = (TextView) view.findViewById(android.R.id.text1);
                    if (position == 0) {
                        tv.setTextColor(Color.parseColor("#424242"));
                    }
                    tv.setTextSize(12);
                    tv.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_START);
                    return view;
                }
                @Override
                public View getDropDownView(int position, View convertView, ViewGroup parent) {
                    View view = super.getView(position, convertView, parent);
                    TextView tv = (TextView) view.findViewById(android.R.id.text1);
                    if (position == 0) {
                        tv.setTypeface(Typeface.defaultFromStyle(Typeface.ITALIC));
                        tv.setTextColor(Color.parseColor("#424242"));
                        tv.setTextAlignment(View.TEXT_ALIGNMENT_CENTER);
                    }
                    else {
                        tv.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL));
                        tv.setTextColor(Color.BLACK);
                        tv.setTextAlignment(View.TEXT_ALIGNMENT_TEXT_START);
                    }
                    return view;
                }
            };
            TextView tv = (TextView) view.findViewById(R.id.row_item_textview);
            tv.setText(relationsListArray.get(position));
            relationsSpinner = (Spinner) view.findViewById(R.id.row_item_spinner);
            relationsSpinner.setAdapter(adapterRelationsSpinner);
            relationsSpinner.setTag(R.id.row_item_spinner+position);
            relationsSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                @Override
                public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                    selectedRowView = (ViewGroup) relationsListView;
                    currentRowSpinner = (Spinner) selectedRowView.findViewById(R.id.row_item_spinner);
                    relationsItem = currentRowSpinner.getItemAtPosition(i).toString();
                    relationsRowPosition = relationsListView.getItemAtPosition(position).toString();
                }
                @Override
                public void onNothingSelected(AdapterView<?> adapterView) {
                    // TODO Auto-generated method stub
                }
            });

            return view;
        }
    }
...