Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 13.01.2015
Сообщений: 61
1

Собственный адаптер на основе ArrayAdapter

26.01.2016, 16:53. Показов 1551. Ответов 17

Author24 — интернет-сервис помощи студентам
Хочу реализовать, чтобы при 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 используется во многих классах, поэтому я не могу просто в нём прописать переход. Заранее спасибо.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.01.2016, 16:53
Ответы с готовыми решениями:

Собственный ArrayAdapter
Доброго времени суток. Пытаюсь написать собственный адаптер для строкового типа: titles =...

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

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

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

17
210 / 210 / 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.
1
0 / 0 / 0
Регистрация: 13.01.2015
Сообщений: 61
26.01.2016, 17:30  [ТС] 3
С английским у меня плохо. Может быть вы приведёте примет использования?
0
210 / 210 / 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; 
                }
             }
1
0 / 0 / 0
Регистрация: 13.01.2015
Сообщений: 61
26.01.2016, 17:51  [ТС] 5
К сожалению мне очень не удобно использовать onClick, потому что много активити использую этот класс и у всех разные переходы. Вы случаем не знаете как, например тем же onClick вызвать метод onListItemClick из активити, которое в данный момент его использует?
0
210 / 210 / 60
Регистрация: 22.08.2014
Сообщений: 644
26.01.2016, 17:55 6
Вы код испробовали?
onListItemClick отработался?
1
0 / 0 / 0
Регистрация: 13.01.2015
Сообщений: 61
26.01.2016, 18:00  [ТС] 7
Да опробовал, но метод не сработал.
0
210 / 210 / 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;
    }
1
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?
0
210 / 210 / 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. Лучше будет, если ты расскажешь чего ты вообще хочешь добиться.
Не анимации ли нажатия на пункт списка часом?
1
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, обрабатывал событие? Тогда было бы то, что именно я хотел.
0
210 / 210 / 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.
Ну, пусть так.
1
0 / 0 / 0
Регистрация: 13.01.2015
Сообщений: 61
27.01.2016, 18:48  [ТС] 13
А вы не знаете метод, когда при нажатии на любое место на экране обрабатывалось событие?

Добавлено через 3 минуты
Метод класс Activity.
0
2883 / 2295 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
27.01.2016, 18:53 14
dispatchTouchEvent
1
210 / 210 / 60
Регистрация: 22.08.2014
Сообщений: 644
27.01.2016, 18:56 15
Цитата Сообщение от Dantes2104 Посмотреть сообщение
А вы не знаете метод, когда при нажатии на любое место на экране обрабатывалось событие?
public class MyListActivity extends ListActivity implements OnClickListener
и будет глобальный onClick(), а обработчиком-слушателем тогда будет сама ListActivity, которую - т.е. this - и будешь подставлять вместо OnClickListener
1
0 / 0 / 0
Регистрация: 13.01.2015
Сообщений: 61
27.01.2016, 19:13  [ТС] 16
Ладно. Сделал через dispatchTouchEvent.
Приводу полный код родительского класса активити.
Код
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 MyListActivity extends ListActivity{
 
 
    View[] globview = new View[20];
    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        for (int i = 0; i < 20;i++){
            if (l.getChildAt(i) != null){
                globview[i] = l.getChildAt(i);
            }
        }
        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
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_UP){
            super.dispatchTouchEvent(ev);
            SharedPreferences s;
            s = PreferenceManager.getDefaultSharedPreferences(this);
            String color1 = s.getString("menf","#00BFFF");
            ListView lv = (ListView) getCurrentFocus();
            for (int a = 0;a < lv.getCount();a++){
                    if (S.isHEX(color1)){
                        lv.getChildAt(a).setBackgroundColor(Color.parseColor(color1));
                    }
                    else{
                        color1 ="#00BFFF";
                        lv.getChildAt(a).setBackgroundColor(Color.parseColor(color1));
                    }
            }
            return true;
        }
        return super.dispatchTouchEvent(ev);
    }
}

Не по теме:


Как-то так. Спасибо всем за помощь)



Добавлено через 2 минуты

Не по теме:

По идее это подсвечивание нажатий кнопок в ArrayAdapter.

0
Pablito
27.01.2016, 19:13
  #17

Не по теме:

код ужасен, я бы все вытер и начал заново
и метод, который я дал, он не для этого

0
0 / 0 / 0
Регистрация: 13.01.2015
Сообщений: 61
27.01.2016, 19:20  [ТС] 18

Не по теме:

Я только начинаю. Поэтому он и плох. Но мне очень интересно, как ты бы осуществил нажатие кнопок в ArrayAdapter?



Добавлено через 1 минуту

Не по теме:

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

0
27.01.2016, 19:20
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.01.2016, 19:20
Помогаю со студенческими работами здесь

Отличия в работе ArrayAdapter
Что то не понятное с ArrayAdapter на Android 2.3, У меня есть EditText в списке, меняя значение...

Обновление данных в ArrayAdapter
Добрый день. Есть созданный ArrayAdapter. Он добавляется в listView, при достижении конца списка...

ArrayAdapter вылет на clear и add
Приветствую! Вылет на clear. Если эту строку закоментить то вылет на add. В чем может быть...

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


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru