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

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

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

Собственный адаптер на основе ArrayAdapter - Программирование Android

26.01.2016, 16:53. Просмотров 423. Ответов 17

Хочу реализовать, чтобы при keydown элемент списка менял цвет фона, а при keyup возвращался в исходное положение, и в то же время выполнял действие которое прописано в методе onListItemClick в активити, которое использует этот адаптер.

Код адаптера
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 MyAdapter<T> extends ArrayAdapter<T> {
    SharedPreferences s;
    Context contextall;
 
    public MyAdapter(Context context, int resource, T[] objects) {
        super(context, resource, objects);
        contextall = context;
    }
 
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        S.pomfv(parent, contextall);
        TextView tv = (TextView) super.getView(position,convertView,parent);
        S.pom(tv, contextall);
        S.pomtv(tv, contextall);
        tv.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                s = PreferenceManager.getDefaultSharedPreferences(contextall);
                if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
                    String color1 = s.getString("menfon", "#FFFFFF");
                    if (S.isHEX(color1)) {
                        view.setBackgroundColor(Color.parseColor(color1));
                    } else {
                        color1 = "#FFFFFF";
                        view.setBackgroundColor(Color.parseColor(color1));
                    }
                } else if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
                    String color1 = s.getString("menfon2","#000000");
                            if (S.isHEX(color1)){
                                view.setBackgroundColor(Color.parseColor(color1));
                            }else{
                                color1 = "#000000";
                                view.setBackgroundColor(Color.parseColor(color1));
                            }
                }
 
                return true;
            }
        });
        return tv;
    }
 
 
 
}


Часть кода активити
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
 protected void onListItemClick(ListView l, View v, int position, long id) {
        switch (position) {
            case 0:
                Intent in0 = new Intent(Pre_Pre_Two_Activity.this,Pre_One_Pre_Activity.class);
                in0.putExtra("pre",0);
                startActivity(in0);
                break;
            case 1:
                Intent in1 = new Intent(Pre_Pre_Two_Activity.this,Pre_One_Pre_Activity.class);
                in1.putExtra("pre",1);
                startActivity(in1);
                break;
            case 2:
                Intent in2 = new Intent(Pre_Pre_Two_Activity.this,Pre_One_Pre_Activity.class);
                in2.putExtra("pre", 2);
                startActivity(in2);
                break;
            case 3:
                Intent in3 = new Intent(Pre_Pre_Two_Activity.this,Pre_One_Pre_Activity.class);
                in3.putExtra("pre",3);
                startActivity(in3);
                break;
 
 
        }
    }


То есть если я меняю onToucListener, то метод onListItemClick в активити не вызывается и нельзя перейти в другое активити. Класс MyAdapter используется во многих классах, поэтому я не могу просто в нём прописать переход. Заранее спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.01.2016, 16:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Собственный адаптер на основе ArrayAdapter (Программирование Android):

Собственный ArrayAdapter - Программирование Android
Доброго времени суток. Пытаюсь написать собственный адаптер для строкового типа: titles = new ArrayList&lt;String&gt;(messages.size());...

ACTION_SEND в ArrayAdapter - Программирование Android
Ребят,вопрос такой, есть GridView с картинками, к нему отдельным классом подключен Adapter. Необходимо по клику картинки делать ACTON_SEND....

Отличия в работе ArrayAdapter - Программирование Android
Что то не понятное с ArrayAdapter на Android 2.3, У меня есть EditText в списке, меняя значение одного, меняются все. На Android &gt;= 4.0 все...

Привязка класса к ArrayAdapter - Программирование Android
Добрый день. Есть класс, содержащий опросы private static class Polls { private final int _Id; private final...

Обновление данных в ArrayAdapter - Программирование Android
Добрый день. Есть созданный ArrayAdapter. Он добавляется в listView, при достижении конца списка происходит получение информации и...

ArrayAdapter и много заморочек - Программирование Android
Сам ArrayAdapter String data = new String{&quot;Текст 1&quot;,&quot;Текст 2&quot;}; ArrayAdapter&lt;String&gt; adapter = new ArrayAdapter&lt;&gt;(this, ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
26.01.2016, 17:10 #2
http://stackoverflow.com/a/11579132
public abstract boolean onTouch (View v, MotionEvent event)
...returns true, if the listener has consumed the event, false otherwise. So you can decide in your implementation if the Event should also be handled by OnClickListener, then just return false.
Dantes2104
0 / 0 / 0
Регистрация: 13.01.2015
Сообщений: 61
26.01.2016, 17:30  [ТС] #3
С английским у меня плохо. Может быть вы приведёте примет использования?
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
26.01.2016, 17:41 #4
Цитата Сообщение от Dantes2104 Посмотреть сообщение
С английским у меня плохо
Это нехорошо, но не упускайте шанс подучить, практикуясь на вот таких вот кошках

Цитата Сообщение от Dantes2104 Посмотреть сообщение
Может быть вы приведёте примет использования?
Там всё сказано.
Чтобы после onTouch отработал onClick, нужно, чтобы onTouch в нужном месте вернул false.
В вашем случае, после отработки MotionEvent.ACTION_UP нужно вернуть false.

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                s = PreferenceManager.getDefaultSharedPreferences(contextall);
                if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
                    String color1 = s.getString("menfon", "#FFFFFF");
                    if (S.isHEX(color1)) {
                        view.setBackgroundColor(Color.parseColor(color1));
                    } else {
                        color1 = "#FFFFFF";
                        view.setBackgroundColor(Color.parseColor(color1));
                    }
                return true;  
                } else if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
                    String color1 = s.getString("menfon2","#000000");
                            if (S.isHEX(color1)){
                                view.setBackgroundColor(Color.parseColor(color1));
                            }else{
                                color1 = "#000000";
                                view.setBackgroundColor(Color.parseColor(color1));
                            }
                return false; 
                }
             }
Dantes2104
0 / 0 / 0
Регистрация: 13.01.2015
Сообщений: 61
26.01.2016, 17:51  [ТС] #5
К сожалению мне очень не удобно использовать onClick, потому что много активити использую этот класс и у всех разные переходы. Вы случаем не знаете как, например тем же onClick вызвать метод onListItemClick из активити, которое в данный момент его использует?
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
26.01.2016, 17:55 #6
Вы код испробовали?
onListItemClick отработался?
Dantes2104
0 / 0 / 0
Регистрация: 13.01.2015
Сообщений: 61
26.01.2016, 18:00  [ТС] #7
Да опробовал, но метод не сработал.
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
26.01.2016, 19:04 #8
Цитата Сообщение от Dantes2104 Посмотреть сообщение
Да опробовал, но метод не сработал.
Да, недоработка.
В принципе, чего бы ему и срабатывать-то?
У вас onTouchListener повешен на TextView tv (кстати зачем?), а OnItemClickListener() висит на ListView.

У меня нету готового "полигона", чтобы тестить самому.
Попробуйте повесить onTouchListener на convertView, а не на TextView.
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
public View getView(int position, View convertView, ViewGroup parent) {
        S.pomfv(parent, contextall);
        TextView tv = (TextView) super.getView(position,convertView,parent);
        S.pom(tv, contextall);
        S.pomtv(tv, contextall);
        convertView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                s = PreferenceManager.getDefaultSharedPreferences(contextall);
                if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
                    String color1 = s.getString("menfon", "#FFFFFF");
                    if (S.isHEX(color1)) {
                        view.setBackgroundColor(Color.parseColor(color1));
                    } else {
                        color1 = "#FFFFFF";
                        view.setBackgroundColor(Color.parseColor(color1));
                    }
                return true;  
                } else if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
                    String color1 = s.getString("menfon2","#000000");
                            if (S.isHEX(color1)){
                                view.setBackgroundColor(Color.parseColor(color1));
                            }else{
                                color1 = "#000000";
                                view.setBackgroundColor(Color.parseColor(color1));
                            }
                return false; 
                }
             }
 
                return true;
            }
        });
        return tv;
    }
Dantes2104
0 / 0 / 0
Регистрация: 13.01.2015
Сообщений: 61
26.01.2016, 22:41  [ТС] #9
Во по этому я вешаю на tv
Ошибка
FATAL EXCEPTION: main
java.lang.NullPointerException


Добавлено через 28 минут
Научился обрабатывать keydown. Что-то вроде этого. Как я понял, чтобы он мог дальше выполнять методы надо возвращать false
Код
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
@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        S.pomfv(parent, contextall);
        final View v = super.getView(position,convertView,parent);
v.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                s = PreferenceManager.getDefaultSharedPreferences(contextall);
                if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
                    String color1 = s.getString("menfon", "#FFFFFF");
                    if (S.isHEX(color1)) {
                        view.setBackgroundColor(Color.parseColor(color1));
                    } else {
                        color1 = "#FFFFFF";
                        view.setBackgroundColor(Color.parseColor(color1));
                    }
                }
                return false;
            }
        });
        TextView tv = (TextView) super.getView(position,v,lv);
        S.pom(tv, contextall);
        S.pomtv(tv, contextall);
        return tv;
    }


В логе пишет что keydown идёт на TextView, а keyup идёт на ListView. Осталось только мне сделать ListView, но я ни где не могу его добыть. К сведенью аргумент convertView пустой. Как это ни странно. Может есть идеи на счёт того чтобы можно было оперировать как-то с ListView?
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
26.01.2016, 23:03 #10
Цитата Сообщение от Dantes2104 Посмотреть сообщение
Во по этому я вешаю на tv
FATAL EXCEPTION: main
java.lang.NullPointerException
Чё-то я в перерывах между готовкой ужина отвлекался на твои сообщения и вообще всё проглядел.
Напрочь.
Не доглядел, то что ты понаписывал.
Сорри, не со зла

Итак, имеем
super.getView(position,convertView,parent);
Эта штука возвращает ПОЛНОСТЬЮ вью соответствующее элементу-строке списка.
И да convertView поначалу может быть null, и это не странно.
Полностью, а не только TextView, который является одним из его составляющих элементов.
Приводить его к TextView - не комильфо.
Соответствующий TextView ищется через findViewById

Так что и последнее твоё
Java
1
TextView tv = (TextView) super.getView(position,v,lv);
не есть корректно.

Что такое
Java
1
2
3
4
S.pomfv(parent, contextall);
....
S.pom(tv, contextall);
S.pomtv(tv, contextall);
я не понимаю и оставляю на твоей совести.

Идем дальше.
Посмотри , ты в адаптере каждому элементу списка назначаешь НОВЫЙ слушатель касаний, который делает для всех элементов одно и то же и не зависит от конкретно выбранного элемента.
Лучше в классе адаптера ввести отдельного слушателя касаний и вешать его ОДНОГО на все элементы.

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
public class MyAdapter<T> extends ArrayAdapter<T> {
    SharedPreferences s;
    Context contextall;
    OnTouchListener myOnTouchListener;
 
    public MyAdapter(Context context, int resource, T[] objects) {
        super(context, resource, objects);
        contextall = context;
        s = PreferenceManager.getDefaultSharedPreferences(contextall);
        myOnTouchListener = new OnTouchListener(){
          @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
                    String color1 = s.getString("menfon", "#FFFFFF");
                    if (S.isHEX(color1)) {
                        view.setBackgroundColor(Color.parseColor(color1));
                    } else {
                        color1 = "#FFFFFF";
                        view.setBackgroundColor(Color.parseColor(color1));
                    }
                    return true;
                } else if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
                    String color1 = s.getString("menfon2","#000000");
                            if (S.isHEX(color1)){
                                view.setBackgroundColor(Color.parseColor(color1));
                            }else{
                                color1 = "#000000";
                                view.setBackgroundColor(Color.parseColor(color1));
                            }
                    return false; 
                }
                 return false;
            }
        };   
    }
 
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View currentView = super.getView(position,convertView,parent);
        currentView.setOnTouchListener(myOnTouchListener);
        });
 
        return currentView;
    }
 }
Добавлено через 2 минуты
P.S. Лучше будет, если ты расскажешь чего ты вообще хочешь добиться.
Не анимации ли нажатия на пункт списка часом?
Dantes2104
0 / 0 / 0
Регистрация: 13.01.2015
Сообщений: 61
27.01.2016, 18:26  [ТС] #11
Код
Java
1
2
3
4
S.pomfv(parent, contextall);
....
S.pom(tv, contextall);
S.pomtv(tv, contextall);

S.pomfv меняет цвет заднего фона у общего окна, то есть за кнопками.
S.pom меняет цвет фона у заданного элемента, то есть у TextView
S.pomtv меняет цвет текста у TextView.
S - это просто отдельный класс в котором я пишу разные функции.

Нет) Я просто хочу чтобы они работали как кнопки) Без анимаций.

Добавлено через 1 минуту
И функция getView возвращает по умолчанию TextView

Добавлено через 10 минут
Что-то не получается)
Лично я сделал отдельный класс у которого родительский класс ListActivity. Переопределил метод onListItemClick и везде где использовал ListActivity, поменял родительский класс на свой и при переопределении метода вызывал родительский метод. А в адаптере сделал только обработку на action down.
Адаптер
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
public class MyAdater<T> extends ArrayAdapter<T> {
    SharedPreferences s;
    Context contextall;
 
    public MyAdater(Context context, int resource, T[] objects) {
        super(context, resource, objects);
        contextall = context;
    }
 
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        S.pomfv(parent, contextall);
        View v = super.getView(position,convertView,parent);
 
        v.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                s = PreferenceManager.getDefaultSharedPreferences(contextall);
                if (motionEvent.getAction() == MotionEvent.ACTION_DOWN) {
                    String color1 = s.getString("ment2", "#7FFF00");
                    if (S.isHEX(color1)) {
                        view.setBackgroundColor(Color.parseColor(color1));
                    } else {
                        color1 = "#7FFF00";
                        view.setBackgroundColor(Color.parseColor(color1));
                    }
                    return false;
                }
 
                return false;
            }
        });
        TextView tv = (TextView) super.getView(position,v,parent);
        S.pom(tv, contextall);
        S.pomtv(tv, contextall);
        return tv;
    }

Свой класс
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
public class MyListActivity extends ListActivity{
    View[] globview = new View[100];
    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        if (globview[position] == null) {
            globview[position] = v;
        }
        SharedPreferences s;
        s = PreferenceManager.getDefaultSharedPreferences(this);
        String color1 = s.getString("menf","#00BFFF");
        if (S.isHEX(color1)){
            v.setBackgroundColor(Color.parseColor(color1));
        }
        else{
            color1 ="#00BFFF";
            v.setBackgroundColor(Color.parseColor(color1));
        }
    }
 
    @Override
    protected void onPause() {
        SharedPreferences s;
        s = PreferenceManager.getDefaultSharedPreferences(this);
        String color1 = s.getString("menf","#00BFFF");
        for (int a = 0; a < 100;a++){
            if (globview[a] != null){
                if (S.isHEX(color1)){
                    globview[a].setBackgroundColor(Color.parseColor(color1));
                }
                else{
                    color1 ="#00BFFF";
                    globview[a].setBackgroundColor(Color.parseColor(color1));
                }
            }
        }
        super.onPause();
    }
}

Переопределил onPause потому что цвет немного зависал.
По моему так легче чем возится с плохим адаптером.
Теперь только когда нажимаю на элемент и выхожу за его пределы он не меняет цвет. Не подскажете, есть ли такой метод, чтобы при нажимании на экран, в не зависимости от View, обрабатывал событие? Тогда было бы то, что именно я хотел.
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
27.01.2016, 18:31 #12
Как уже выяснили - з onTouch возвращай false.

В классе активити на ListView OnItemClickListener .

Для примера
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
public class MyActivity extends Activity {
    /**
     * Called when the activity is first created.
     */
    ListView lvListView;
    String[] saStringArray = {"One", "TWo", "Three", "Four", "Five"};
    MyAdapter listAdapter;
 
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_layout);
 
        lvListView = (ListView) findViewById(R.id.lvBarcodesListView);
 
        lvListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(getBaseContext(), "OnClick", Toast.LENGTH_LONG).show();
            }
        });
 
       
        listAdapter = new myAdapter(this, R.id.tvTextView, saStringArray);
 
 
        lvListView.setAdapter(listAdapter);
          
    }
}
И всё. После onTouch будет отрабатываться OnItemClick и выведется соответствущий Toast.

Добавлено через 2 минуты
А, ты пошёл через ListActivity.
Ну, пусть так.
Dantes2104
0 / 0 / 0
Регистрация: 13.01.2015
Сообщений: 61
27.01.2016, 18:48  [ТС] #13
А вы не знаете метод, когда при нажатии на любое место на экране обрабатывалось событие?

Добавлено через 3 минуты
Метод класс Activity.
Pablito
2472 / 1917 / 595
Регистрация: 12.05.2014
Сообщений: 6,741
Завершенные тесты: 1
27.01.2016, 18:53 #14
dispatchTouchEvent
Armagedo
208 / 208 / 60
Регистрация: 22.08.2014
Сообщений: 644
27.01.2016, 18:56 #15
Цитата Сообщение от Dantes2104 Посмотреть сообщение
А вы не знаете метод, когда при нажатии на любое место на экране обрабатывалось событие?
public class MyListActivity extends ListActivity implements OnClickListener
и будет глобальный onClick(), а обработчиком-слушателем тогда будет сама ListActivity, которую - т.е. this - и будешь подставлять вместо OnClickListener
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.01.2016, 18:56
Привет! Вот еще темы с ответами:

Кастомный ArrayAdapter для Spinner - Программирование Android
Создал свой адаптер. Привязал его к списку Spinner. Получил идентификатор выбранной записи. Ну вроде бы как получается в каждом элементе...

ArrayAdapter вылет на clear и add - Программирование Android
Приветствую! Вылет на clear. Если эту строку закоментить то вылет на add. В чем может быть проблема? import java.io.File; ...

Как правильно настроить ArrayAdapter? - Программирование Android
Создаю своё первое приложение, потому вопрос новичка. Статья, которой я руководствовался - поверхностная, потому во многом пришлось...

Выкидывает NullPointerException при заполнении данных через ArrayAdapter - Программирование Android
Заполняю данные из массива Food.foods с помощью ArrayAdapter в ListView макета activity_food_category.xml. При заполнении выкидывает ошибку...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
27.01.2016, 18:56
Ответ Создать тему
Опции темы

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