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

Программирование Android

Войти
Регистрация
Восстановить пароль
 
DeadRayder
0 / 0 / 0
Регистрация: 28.11.2014
Сообщений: 25
#1

Передача данных между ListView - Android

14.08.2015, 17:21. Просмотров 370. Ответов 10
Метки нет (Все метки)

Доброго времени суток форумчане! Не получается решить одну проблему, надеюсь на вашу помощь. В классе фрагмента есть метод onCreateView, который создает мне 3 разных представления в зависимости от выбранной страницы. В первом представлении есть ListView, в который подгружаются данные, мне нужно выбранный элемент из этого списка передать в другое view этого же фрагмента и отобразить. Выводит ошибку NPE, то есть как я почитал где-то возвращается null. Из тех методов которые я вызывал это возможно в mAda.notifyDataSetChanged();, об этом тоже статейка попадалась. Эту проблему я решил тем, что инициализацию адаптера я перенес в первое view, так данные добавляются в коллекцию, но в listView ничего не отображается. Как мне исправить это?

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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
@Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
 
        View view;
 
        if (pageNumber == 0) {
 
            view = inflater.inflate(R.layout.fragment_products, null);
 
            productCollection = new ArrayList<>();
 
            final ImageView mImg = (ImageView) view.findViewById(R.id.products_img);
            mAdap = new ArrayAdapterItem(getActivity(),productCollection);
            mAdap.setNotifyOnChange(true);
            mList = (ListView) view.findViewById(R.id.list_products);
            mList.setAdapter(mAdap);
 
            final String TAG = "myTag";
 
            mAutoCompleteSearchProduct = (DelayAutoCompleteTextView) view.findViewById(R.id.search_product_autoCompl);
            mAutoCompleteSearchProduct.setThreshold(3);
            mAutoCompleteSearchProduct.setAdapter(new AutoCompleteArrayAdapter(getActivity()));
            mAutoCompleteSearchProduct.setLoadingIndicator((ProgressBar) view.findViewById(R.id.progressBar_fragment));
         
            mAutoCompleteSearchProduct.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
 
                    mImg.setVisibility(view.GONE);
 
                    Products myNewProd = (Products) parent.getItemAtPosition(position);
                    mProduct = myNewProd.productName;
 
                    ResultSet resultSet1;
 
                    Statement statement = null;
                    try {
                        statement = MainActivity.connect.createStatement();
                        resultSet1 = statement.executeQuery("select distinct Barcode_value\n" +
                                "from EXPORT_TABLE\n" +
                                "where Product_name = '" + mProduct + "'");
                        while (resultSet1.next())
                        {
                            mBarCodeProduct = resultSet1.getString("Barcode_value");
                        }
 
                        resultSet1.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
 
                    productCollection.clear();
 
                    ResultSet resultSetProd;
                    try {
                        resultSetProd = statement.executeQuery("select Product_name, Price, shop_name, Barcode_value, address\n" +
                                "from EXPORT_TABLE\n" +
                                "where Barcode_value = '" +mBarCodeProduct + "' AND City_name = '"+ SelectCityScreen.mCity +"' AND Quantity = 1");
 
                        while (resultSetProd.next()) {
                            productCollection.add(new PorductItem(resultSetProd.getString("Product_name"),
                                    resultSetProd.getString("Price"),
                                    resultSetProd.getString("shop_name"),
                                    resultSetProd.getString("Barcode_value"),
                                    resultSetProd.getString("address")));
                        }
 
                        Log.i(TAG, "Данные по поиску: " + productCollection);
 
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                }
            });
 
            
            mList.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
                @Override
                public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                    PorductItem mPorductItem = (PorductItem) parent.getItemAtPosition(position);
                    basketCollection.add(new PorductItem(mPorductItem.itemName,mPorductItem.price,mPorductItem.networkName,mPorductItem.barCode,mPorductItem.networkAddress));
 
                    Log.i(TAG, "Данные в корзине: " + basketCollection);
                    mAda.notifyDataSetChanged();
                    countProductInBasket++;
                    ((TextView)getActivity().findViewById(R.id.txt_column_product_in_basket)).setText(""+ countProductInBasket);
                    Toast.makeText(getActivity(),"Товар " + position + "был добавлен в корзину", Toast.LENGTH_LONG).show();
                    return false;
 
                }
 
            });
            return  view;
        }
        else if(pageNumber == 1)
        {
            final String TAG = "Log";
            view = inflater.inflate(R.layout.fragment_basket,null);
 
            Log.i(TAG, "Коллекция инициализирована");
 
            mAda = new ArrayAdapterItem(getActivity(),basketCollection);
            mAda.setNotifyOnChange(true);
 
            basketCollection.add(new PorductItem("fdsaf", "fdaf", "fdasf", "fdasfasd", "fasdfas"));
            mAda.notifyDataSetChanged();
 
            basketList = (ListView) view.findViewById(R.id.list_view_basket);
            basketList.setAdapter(mAda);
 
            basketList.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
                @Override
                public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
 
                    PorductItem mProduct = (PorductItem) parent.getItemAtPosition(position);
                    mAda.remove(mProduct);
 
                    countProductInBasket--;
                    ((TextView)getActivity().findViewById(R.id.txt_column_product_in_basket)).setText(""+ countProductInBasket);
 
                    return false;
 
                }
 
            });
 
            return  view;
        }
        else
        {
            view = inflater.inflate(R.layout.fragment_sale,null);
            Typeface mType = Typeface.createFromAsset(getActivity().getAssets(),"fonts/GothamBook.ttf");
            TextView mTextViewSale = (TextView) view.findViewById(R.id.txt_sale);
            mTextViewSale.setTypeface(mType);
            mTextViewSale.setText("dfsaf: " + mBarCodeProduct);
            return  view;
 
        }
 
    }
Лог ошибки
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
08-14 14:08:05.029    8854-8854/com.example.deadrayder_1.shopperguidev20 W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x409bf1f8)
08-14 14:08:05.049    8854-8854/com.example.deadrayder_1.shopperguidev20 E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.NullPointerException
            at com.example.deadrayder_1.shopperguidev20.HomeScreenFragment.onItemLongClick(HomeScreenFragment.java:249)
            at android.widget.AbsListView.performLongPress(AbsListView.java:2580)
            at android.widget.AbsListView$CheckForLongPress.run(AbsListView.java:2530)
            at android.os.Handler.handleCallback(Handler.java:605)
            at android.os.Handler.dispatchMessage(Handler.java:92)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:4424)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
            at dalvik.system.NativeStart.main(Native Method)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
14.08.2015, 18:05     Передача данных между ListView #2
Не вникая в код - что в HomeScreenFragment.java:249?
DeadRayder
0 / 0 / 0
Регистрация: 28.11.2014
Сообщений: 25
14.08.2015, 18:12  [ТС]     Передача данных между ListView #3
вот это mAda.notifyDataSetChanged();

Добавлено через 1 минуту
я попадал на статью, где были описаны методы, которые могут вернуть Null, вот как я понимаю это и произошло с данным методом, он входил в ту группу)
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
14.08.2015, 18:16     Передача данных между ListView #4
Цитата Сообщение от DeadRayder Посмотреть сообщение
вот это mAda.notifyDataSetChanged();
Ни в одном методе onItemLongClick в вашем куске кода нет mAda.notifyDataSetChanged()

Так что повторяю свой вопрос,

Цитата Сообщение от Armagedo Посмотреть сообщение
что в HomeScreenFragment.java:249?
DeadRayder
0 / 0 / 0
Регистрация: 28.11.2014
Сообщений: 25
14.08.2015, 18:22  [ТС]     Передача данных между ListView #5
В logcat нажимаю на HomeScreenFragment.java:249 и меня перекидывает на строку в коде mAda.notifyDataSetChanged();

Добавлено через 1 минуту
есть в методе для mList вот тут:
Log.i(TAG, "Данные в корзине: " + basketCollection);
mAda.notifyDataSetChanged();
Паблито
резкий
1960 / 1695 / 525
Регистрация: 12.05.2014
Сообщений: 6,046
Завершенные тесты: 1
14.08.2015, 18:30     Передача данных между ListView #6
а где строка инициализации mAda ?
DeadRayder
0 / 0 / 0
Регистрация: 28.11.2014
Сообщений: 25
14.08.2015, 19:27  [ТС]     Передача данных между ListView #7
Она находится во втором View. Если viewpager = 1, то есть вторая страница, то инициализируется
Java
1
2
mAda = new ArrayAdapterItem(getActivity(),basketCollection);
mAda.setNotifyOnChange(true);
Добавлено через 54 минуты
Для того чтобы решить проблему NullPointerException, достаточно инициализацию адаптера поместить в первое view, но тогда при добавлении объекта в коллекцию Listview не обновляется, хотя Log показывает, что новый элемент добавился в коллекцию
DeadRayder
0 / 0 / 0
Регистрация: 28.11.2014
Сообщений: 25
17.08.2015, 17:32  [ТС]     Передача данных между ListView #8
Получается совсем никаких предположений нет?)
androbro
318 / 278 / 54
Регистрация: 17.10.2014
Сообщений: 825
17.08.2015, 17:43     Передача данных между ListView #9
Цитата Сообщение от DeadRayder Посмотреть сообщение
тогда при добавлении объекта в коллекцию Listview не обновляется, хотя Log показывает, что новый элемент добавился в коллекцию
ну так добавить эт половина дела, после же надо notifyDataSetChanged() вызвать
DeadRayder
0 / 0 / 0
Регистрация: 28.11.2014
Сообщений: 25
18.08.2015, 10:36  [ТС]     Передача данных между ListView #10
Вызываю этот метод всегда после добавления) Может я уже просто какой-то мелочи не замечаю...Я для теста сделал во viewpager = 1 так, инициализировал адаптер, установил setNotifyOnChange(true), определил ListView, затем добавил в коллекцию произвольный объект и вызвал notifyDataSetChanged(), передал адаптер ListView. Дальше на клик по этому элементу должен добавляться этот же объект, это все замечательно отрабатывает. Как только я переношу код по добавлению элемента и обновление адаптера в часть кода где viewpager = 0, перестает отрисовывать данные по новой.

Добавлено через 24 минуты
хм...решил проблему вот так
Java
1
((ListView)getActivity().findViewById(R.id.list_view_basket)).setAdapter(mAda);
после клика по элементу каждый раз по новой передаю адаптер, это вообще легально?))
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.08.2015, 10:44     Передача данных между ListView
Еще ссылки по теме:

Передача данных между активити Android
Android Передача данных между тремя Activity
Передача данных между Activity Android
Передача данных между устройствами Android
Android Передача данных между потоками

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

Или воспользуйтесь поиском по форуму:
Armagedo
18.08.2015, 10:44     Передача данных между ListView
  #11

Не по теме:

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

Yandex
Объявления
18.08.2015, 10:44     Передача данных между ListView
Ответ Создать тему
Опции темы

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