Форум программистов, компьютерный форум CyberForum.ru

Назначить идентификаторы кнопкам в адаптере списка - Android

Восстановить пароль Регистрация
 
AlexRu18
 Аватар для AlexRu18
2 / 2 / 0
Регистрация: 29.01.2015
Сообщений: 91
10.10.2016, 23:10     Назначить идентификаторы кнопкам в адаптере списка #1
Есть цикл генерации данных для адаптера списка
Java
1
2
3
4
5
6
7
8
9
10
11
void fillData() {
        for (int i = 1; i <= 17; i++) {
            String[] cySerNmArr = getResources().getStringArray(R.array.cySerNm);
            String[] cySerSubNmArr = getResources().getStringArray(R.array.cySerSubNm);
 
            TypedArray cySerPicsArr = getResources().obtainTypedArray(R.array.cyPics);
 
            products.add(new Product(cySerNmArr[i], cySerSubNmArr[i],
                    cySerPicsArr.getDrawable(i), null, null));
        }
 }
Дальше я вставляю в View с помощью данного класса.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // используем созданные, но не используемые view
        View view = convertView;
        if (view == null) {
            view = lInflater.inflate(R.layout.cy_item, parent, false);
        }
 
        Product p = getProduct(position);
 
        // заполняем View в пункте списка данными из товаров: название, описание
        // и картинка
        ((TextView) view.findViewById(R.id.tvDescr)).setText(p.cyNm);
        ((TextView) view.findViewById(R.id.tvSubDescr)).setText(p.cySubNm);
        ((ImageView)view.findViewById(R.id.ivImage)).setImageDrawable(p.cyImg);
        ((Button)   view.findViewById(R.id.chooseButton)).setId(position);
 
        return view;
    }
 
    Button.OnClickListener btnclick = new Button.OnClickListener(){
 
        @Override
        public void onClick(View v) {
            switch (v.getId()){
                case 0:
                    //dosomething1();
                    break;
                case 1:
                    //dosomething2();
                    break;
                default:
                    break;
            }
        }
 
    };
 
    Product getProduct(int position) {
        return ((Product) getItem(position));
    }
В этой строке
Java
1
        ((Button)   view.findViewById(R.id.chooseButton)).setId(position);
я пытаюсь раздать ID кнопкам, но студия выдаёт что-то вроде "Button - redundant", но вроде как всё должно быть нормально.
И ещё там же ниже можно видеть заготовку под клик, тоже не разобрался как OnClickListener привязать к динамической кнопке.
Спасибо за любую помощь
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.10.2016, 23:10     Назначить идентификаторы кнопкам в адаптере списка
Посмотрите здесь:

Как добавить дополнительные параметры к программно создаваемым кнопкам? Android
Загрузки изображений из сети в адаптере GridView Android
Убить поток в адаптере Android
Android Как мне обратиться к кнопкам в цикле?
Android Поиск по ListView основанному на кастомном адаптере
Android Как присвоить фон отдельным кнопкам клавиатуры?
Свои идентификаторы для элементов ListView Android
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
shavuz
69 / 75 / 12
Регистрация: 29.01.2014
Сообщений: 347
11.10.2016, 07:57     Назначить идентификаторы кнопкам в адаптере списка #2
что то вы не так пишите, попробуйте так:
Java
1
2
(Button chooseButton = (Button)view.findViewById(R.id.chooseButton));
chooseButton.setOnClickListener(new OnClickListener ......
дальше. если я правельно понял, вы находитесь в адаптере
значит вам вообще не нужно айди просто в свиче используйте позицию. если все таки нужно, попробуйте setTag
AlexRu18
 Аватар для AlexRu18
2 / 2 / 0
Регистрация: 29.01.2015
Сообщений: 91
11.10.2016, 21:30  [ТС]     Назначить идентификаторы кнопкам в адаптере списка #3
Required: Int
Found: andr.widget.button

А тут даже по аналогии должно работать по сути:
Java
1
2
3
4
5
6
7
8
9
10
11
 Product p = getProduct(position);
 
        // заполняем View в пункте списка данными из товаров: название, описание
        // и картинка
        ((TextView) view.findViewById(R.id.tvDescr)).setText(p.cyNm);
        ((TextView) view.findViewById(R.id.tvSubDescr)).setText(p.cySubNm);
        ((ImageView)view.findViewById(R.id.ivImage)).setImageDrawable(p.cyImg);
        ((Button)   view.findViewById(R.id.chooseButton)).setId(position);
 
        return view;
    }
______
Добавлено через 3 часа 42 минуты
Разобрался, но клик не довёл до конца. Срабатывает только Default. Видимо не может нормально подставить ID
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
((TextView) view.findViewById(R.id.tvDescr)).setText(p.cyNm);
        ((TextView) view.findViewById(R.id.tvSubDescr)).setText(p.cySubNm);
        ((ImageView)view.findViewById(R.id.ivImage)).setImageDrawable(p.cyImg);
        Button chooseButton = (Button)view.findViewById(R.id.chooseButton);
        chooseButton.setId(position);
 
        chooseButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                switch (v.getId()){
                    case 0:
                        Toast toast = Toast.makeText(ctx,
                                "Var0", Toast.LENGTH_SHORT);
                        toast.show();
                        break;
                    case 1:
                        Toast toast1 = Toast.makeText(ctx,
                                "Var1", Toast.LENGTH_SHORT);
                        toast1.show();
                        break;
                    default:
                        Toast toast2 = Toast.makeText(ctx,
                                "DEFAULT", Toast.LENGTH_SHORT);
                        toast2.show();
                        break;
                }
            }
        });
 
        return view;
    }
XML
1
2
3
4
E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: ru.alx.pa, PID: 5492
                  java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.Button.setId(int)' on a null object reference
                      at ru.alx.pa.CyChoiseAdapter.getView(CyChoiseAdapter.java:64)
Gukamanav
3 / 3 / 1
Регистрация: 11.08.2016
Сообщений: 24
12.10.2016, 01:15     Назначить идентификаторы кнопкам в адаптере списка #4
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
   
 
adapterView.setOnItemClickListener(oclcAdapter);
 
 public AdapterView.OnItemClickListener oclcAdapter = new AdapterView.OnItemClickListener(){
 
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
 
//          для примера
//          String item = String.valueOf(textViewItem.get(position));
 
        }
 
    };
Возможно не правильно понял суть проблемы, но возможно подойдет подобная реализация?

Добавлено через 31 секунду
shavuz
69 / 75 / 12
Регистрация: 29.01.2014
Сообщений: 347
12.10.2016, 10:29     Назначить идентификаторы кнопкам в адаптере списка #5
объясните чего вы хотите добиться? знать на кнопку какой строки листа было нажатие?
если вы в адаптере, то у вас есть позишн, это конкретная строка, значит когда сработал он клик, по позиции вы знаете какая это строка. то есть должно быть или так:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 Button chooseButton = (Button)view.findViewById(R.id.chooseButton);
 
        chooseButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                switch (position){
                    case 0:
                        Toast toast = Toast.makeText(ctx,
                                "Var0", Toast.LENGTH_SHORT);
                        toast.show();
                        break;
                    case 1:
                        Toast toast1 = Toast.makeText(ctx,
                                "Var1", Toast.LENGTH_SHORT);
                        toast1.show();
                        break;
                    default:
                        Toast toast2 = Toast.makeText(ctx,
                                "DEFAULT", Toast.LENGTH_SHORT);
                        toast2.show();
                        break;
                }
            }
        });
или вообще вот так:
Java
1
2
3
4
5
6
7
8
9
10
 Button chooseButton = (Button)view.findViewById(R.id.chooseButton);
 
        chooseButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast toast = Toast.makeText(ctx,
                               ""+position, Toast.LENGTH_SHORT);
                        toast.show();  
            }
        });
в обоих случаях позишн и есть айди кнопки

Добавлено через 8 минут
в уроке 54 . судя по всему вы его делаете, он использует чекбокс, и делает ему сет чекд, это не то же самое
AlexRu18
 Аватар для AlexRu18
2 / 2 / 0
Регистрация: 29.01.2015
Сообщений: 91
12.10.2016, 12:56  [ТС]     Назначить идентификаторы кнопкам в адаптере списка #6
Первый вариант работает. Это оказалось удобнее, чем назначать id каждой кнопке и потом считывать их в switch.
Я хочу по нажатию кнопки переходить в подробное описание лота. Сейчас тем же путём
Java
1
2
3
4
5
6
7
8
9
10
11
void fillData() {
        for (int i = 1; i <= 17; i++) {
            String[] cySerNmArr = getResources().getStringArray(R.array.cySerNm);
            String[] cySerSubNmArr = getResources().getStringArray(R.array.cySerSubNm);
 
            TypedArray cySerPicsArr = getResources().obtainTypedArray(R.array.cyPics);
 
            products.add(new Product(cySerNmArr[i], cySerSubNmArr[i],
                    cySerPicsArr.getDrawable(i), null, null));
        }
 }
буду создавать подробное описание. Хотя наверное это неправильный подход и получится масло масляное..
shavuz
69 / 75 / 12
Регистрация: 29.01.2014
Сообщений: 347
12.10.2016, 13:29     Назначить идентификаторы кнопкам в адаптере списка #7
обьясните что вы делаете, поподробней и постараюсь помочь с логикой. где находится функция филдата? в адаптере? какие поля есть в продукте? что происходит после нажатия кнопки?
AlexRu18
 Аватар для AlexRu18
2 / 2 / 0
Регистрация: 29.01.2015
Сообщений: 91
12.10.2016, 21:01  [ТС]     Назначить идентификаторы кнопкам в адаптере списка #8
Делаю как-бы каталог.

fillData() в главном фрагменте
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState){
        View view = inflater.inflate(R.layout.cy_fragment, container, false);
 
 
 
        // создаем адаптер
        fillData();
        boxAdapter = new CyChoiseAdapter(getContext(), products);
 
        // настраиваем список
        ListView lvMain = (ListView) view.findViewById(R.id.cyList);
        lvMain.setAdapter(boxAdapter);
        return view;
 
    }
    // генерируем данные для адаптера
    void fillData() {
        for (int i = 0; i <= 17; i++) {
            String[] cySerNmArr = getResources().getStringArray(R.array.cySerNm);
            String[] cySerSubNmArr = getResources().getStringArray(R.array.cySerSubNm);
            final TypedArray cySerPicsArr = getResources().obtainTypedArray(R.array.cyPics);
 
            products.add(new Product(cySerNmArr[i], cySerSubNmArr[i],
                    cySerPicsArr.getDrawable(i), null, null));
        }
    }
Adapter:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
public class CyChoiseAdapter extends BaseAdapter {
 
    Context ctx;
    LayoutInflater lInflater;
    ArrayList<Product> objects;
 
    CymbalChoiseAdapter(Context contex, ArrayList<Product> products) {
        ctx = contex;
        objects = products;
        lInflater = (LayoutInflater) ctx
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }
 
 ....
 
public View getView(final int position, View convertView, ViewGroup parent) {
        View view = convertView;
        if (view == null) {
            view = lInflater.inflate(R.layout.cy_item, parent, false);
        }
 
        Product p = getProduct(position);
 
        // заполняем View в пункте списка данными из товаров: название, описание
        // и картинка
        ((TextView) view.findViewById(R.id.tvDescr)).setText(p.cyName);
        ((TextView) view.findViewById(R.id.tvSubDescr)).setText(p.cySubName);
        ((ImageView)view.findViewById(R.id.ivImage)).setImageDrawable(p.cyImage);
        Button chooseButton = (Button)view.findViewById(R.id.chooseButton);
 
        chooseButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                switch (position){
                    case 0:
                        Toast toast = Toast.makeText(ctx,
                                "Var0", Toast.LENGTH_SHORT);
                        toast.show();
                        break;
                    case 1:
                        Toast toast1 = Toast.makeText(ctx,
                                "Var1", Toast.LENGTH_SHORT);
                        toast1.show();
                        break;
                    default:
                        Toast toast2 = Toast.makeText(ctx,
                                "DEFAULT", Toast.LENGTH_SHORT);
                        toast2.show();
                        break;
                }
            }
        });
 
        return view;
    }
Product:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Product {
 
    String cyNm;
    String cySubNm ;
    Drawable cyImg ;
    String serNm ;
    Drawable serImg ;
 
    Product(String _cyName, String _cySubName, Drawable _cyImage, String _serName, Drawable _serImage) {
        cyNm = _cyName;
        cySubNm = _cySubName;
        cyImg = _cyImage;
        serNm = _serName;
        serImg = _serImage;
    }
}
После нажатия кнопки я хотел-бы попасть в подробное описание продукта. Тем же методом заполнения, как и в getView
shavuz
69 / 75 / 12
Регистрация: 29.01.2014
Сообщений: 347
12.10.2016, 22:14     Назначить идентификаторы кнопкам в адаптере списка #9
все просто. создаете еще один класс, называете его OnProductSelected:
Java
1
2
3
public interface OnProductSelected{
void onProductSelected(int productIndex);
}
в фрагменте добавляете в самом начале:
Java
1
public сlass имя фрагмента extends fragment implements OnProductSelected
когда вы это добавите в оно выделится красным, нажмите ctrl+i и у вас добавится функция:

Java
1
2
3
4
@Override
public void onProductSelected(int productIndex){
 
}
это та самая функция которая прописана в интерфейсе.

дальше меняем констрактор адаптера
добавляем в него интерфейс

Java
1
2
3
4
5
6
7
8
9
10
11
 Context ctx;
    LayoutInflater lInflater;
    ArrayList<Product> objects;
  OnProductSelected mOnProductSelected;
    CymbalChoiseAdapter(Context contex, ArrayList<Product> products, OnProductSelected onProductSelected) {
        ctx = contex;
        objects = products;
        lInflater = (LayoutInflater) ctx
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mOnProductSelected = onProductSelected;
    }
теперь заорет строка создания адаптера в фрагменте, ее меняем на:
Java
1
        boxAdapter = new CyChoiseAdapter(getContext(), products,this);
this - в данном случае это интерфейс

ну и последнее меняем код в обработке нажатия а адаптере :
Java
1
2
3
4
5
 chooseButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
mOnProductSelected.onProductSelected(position);
            }
после этого когда вы нажали на кнопку , адаптер вернет в функцию onProductSelected которая у нас находится во фрагменте, позицию товара в листе которую выбрали, то есть в фрагменте мы будем знать что выбрали и сможем передать только один продукт в следующий экран, примерно так:

Java
1
2
3
4
5
@Override
public void onProductSelected(int productIndex){
Product selectedProduct = products.get(productIndex);
//а дальше переходим с конкретным продуктом дальше куда нам надо.
}

примерно так, писал коды "от руки" может не скомпилироваться . надеюсь идею вы поймете, если нет, пишите. удачи

а и fillData не надо запускать два раза))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.10.2016, 15:26     Назначить идентификаторы кнопкам в адаптере списка
Еще ссылки по теме:

Не обновлять айтемы в адаптере когда скроллим список Android
Android Android Studio - идентификаторы
Android Filterable не понимаю как в адаптере взять String значение по позиции ?
Android Показывать или скрывать записи в адаптере
NullPointerException в адаптере RecyclerView Android

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
shavuz
69 / 75 / 12
Регистрация: 29.01.2014
Сообщений: 347
14.10.2016, 15:26     Назначить идентификаторы кнопкам в адаптере списка #10
не знаю получил ли в личку. напишу тут тоже


на счет фил дата, ты с фрагмента, или активити , передаешь в констрактор адаптера готовый лист который обрабатывает адаптер, лист у тебя обьект класса, то есть с любой функции ты можешь к нему добраться. когда будет нажата кнопка адаптер вернет индекс(позицию) то есть так как я тебе написал в примере ты уже будешь знать что выбрали остается достать конкретный обьект продукта и передать его фрагменту.
дальше. как открыть новый фрагмент, лучше почитай поподробней в гугле, вот пример:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
public class AdvancedSettingsFragment extends Fragment {
        private static final String SELECTED_LANGUAGE = "selected_language";
 
      public static AdvancedSettingsFragment newInstance(String selectedLanguage) {
        AdvancedSettingsFragment advancedSettingsFragment = new AdvancedSettingsFragment();
        Bundle bundle = new Bundle();
        bundle.putString(SELECTED_LANGUAGE, selectedLanguage);
        advancedSettingsFragment.setArguments(bundle);
        return advancedSettingsFragment;
    }
    
    
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
    }
 
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
         if (getArguments() != null) {
            mSelectedLanguage = getArguments().getString(SELECTED_LANGUAGE);
        }
    }
 
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return super.onCreateView(inflater, container, savedInstanceState);
    }
 
    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
    }
 
    @Override
    public void onResume() {
        super.onResume();
    }
 
    @Override
    public void onPause() {
        super.onPause();
    }
}
обрати внимание на функцию нью инстанс и на функцию онкриейт.

вот так переходят на фрагмент с активити или другого фрагмента:
Java
1
2
3
FragmentTransaction ft = getFragmentManager().beginTransaction();
    ft.add(AdvancedSettingsFragment.newInstance("English"), null);
    ft.commit();
как я и сказал в обрати внимание на ньюинстанс в фрагменте, через эту функцию он может принять параметры из активити, а в онкриейт он их достанет куда тебе нужно.

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

еще обрати внимание что у фрагмента есть свой хмл, просто я не показал его, нет связи
Yandex
Объявления
14.10.2016, 15:26     Назначить идентификаторы кнопкам в адаптере списка
Ответ Создать тему
Опции темы

Текущее время: 09:52. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru