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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.64
Ametistos
0 / 0 / 0
Регистрация: 23.02.2013
Сообщений: 37
#1

OnLongClickListener - Android

31.03.2013, 18:43. Просмотров 2009. Ответов 5
Метки нет (Все метки)

Подскажите, есть ли какие нибудь тонкости в работе с OnLongClickListener?

Возникла такая проблема, попробую описать подробно:

ест MainActivity в которой выводится список (ListView), к списку привязываю ArrayList<Product> следующим адаптером:

Java
1
2
3
4
5
6
7
8
9
10
11
12
public class ProductAdapter extends ArrayAdapter<Product> {
    public ProductAdapter(Context _context, int _resource,  List<Product> _items) {
        super(_context, _resource, _items);     
    }
 
    
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {     
        Product product = getItem(position);        
        return product.getItem();
    }
}
Product - это мой класс который содержит в себе вьюшку Item типа LinearLayou.

Теперь о MainActivity, в ней я хочу обрабатывать короткие и долгие клики по элементам списка и по кнопкам по которым будут вызываться новые активити для удаления/редактирования/добавления элементов списка. следовательно пишем примерно так:


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
public class MainActivity extends Activity implements OnClickListener, OnLongClickListener {
    
    
    private static ArrayList<Product> products;
    
    private ListView myListView;
    private ProductAdapter aa;
    
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
                
        setContentView(R.layout.main);
                        
        myListView = (ListView)findViewById(R.id.myListView);
        
        products = new ArrayList<Product>();
        
        aa = new ProductAdapter(this, 0, products);
        myListView.setAdapter(aa);
                
        Product p0 = new Product(this, "fgfgfg", 10f, 1f);
        Product p1 = new Product(this, "sdf", 10f, 1f);
        Product p2 = new Product(this, "hgmn", 10f, 1f);
        Product p3 = new Product(this, "dfgh", 10f, 1f);
        
        products.add(p0);
        products.add(p1);
        products.add(p2);
        products.add(p3);
        
        int  id = 0;
        for(Product p: products) {
               View v = p.getItem();
               v.setOnLongClickListener(this);
               v.setOnClickListener(this);
               v.setId(id); 
               id++;
               
            }
        
        
        aa.notifyDataSetChanged();
        
       
       
        
    }
    
    @Override
    public void onResume() {
        super.onResume();
        
        for(Product p: products) {
               View v = p.getItem();
               v.setOnLongClickListener(this);
               v.setOnClickListener(this);
               
            }
        aa.notifyDataSetChanged();
    }
    
    @Override
    public void onRestart() {
        super.onResume();
        Log.v("A", "onRestart");
        for(Product p: products) {
               View v = p.getItem();
               v.setOnLongClickListener(this);
               v.setOnClickListener(this);             
            }
        aa.notifyDataSetChanged();
    }
 
//дальше методы для обработки кликов.....
 
}


Беда в том, что OnClickListener работает замечательно, а OnLongClickListener почему то через раз после каждого изменения в списке какие то элементы перестают откликаться...

С чем это может быть связано, может есть другой способ?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.03.2013, 18:43     OnLongClickListener
Посмотрите здесь:

Почему onclicklistener void, а onlongclicklistener возвращает boolean? Android

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
01.04.2013, 11:40     OnLongClickListener #2
list.setOnItemClickListener(...);
list.setOnItemLongClickListener(...);
Ametistos
0 / 0 / 0
Регистрация: 23.02.2013
Сообщений: 37
01.04.2013, 16:59  [ТС]     OnLongClickListener #3
Написал так:

Java
1
2
3
4
5
6
myListView.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> aa, View view, int position, long id) {
                
              Log.v("FFF","HHHHH");
            }
          });
чтобы понять откликается ли он вообще. Почему то в лог ничего не выводится(( в общем никакой реакции на клик( В чем же проблема? может в класс Адаптера дописать чего?

Добавлено через 39 минут
Создал для проверки элементарный проект:

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
package com.listtest;
 
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
 
import android.widget.ArrayAdapter;
import android.widget.ListView;
 
public class MainActivity extends Activity {
    
    ListView myListView;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        String[] values = new String[] { "Android", "iPhone", "WindowsMobile",
                "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X",
                "Linux", "OS/2" };
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, values);
        
        myListView = (ListView)findViewById(R.id.listView1);
        myListView.setAdapter(adapter);
        adapter.notifyDataSetChanged();
        
        myListView.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
              Log.d("000", "itemClick: position = " + position + ", id = "
                  + id);
            }
          });
    }
 
    
}
все равно в логе тишина.. что я делаю не так?
GiGaBiTe911
24 / 24 / 1
Регистрация: 04.02.2013
Сообщений: 132
Записей в блоге: 1
01.04.2013, 17:32     OnLongClickListener #4
на первый взгляд - все правильно. могу показать свой полностью рабочий пример. он немного отличается но общий принцип тот же. и так вот?
в методе onCreate:
Java
1
2
3
4
5
6
                m_lvDetectedList = (ListView)findViewById(R.id.lvDetectedList);
        // Слушатели
        m_lvDetectedList.setOnItemClickListener(OnListItemClick);
        m_lvDetectedList.setOnItemLongClickListener(OnListItemLongClick);
        
        m_lvDetectedList.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,ds.DetectPeoplesArr));
вот сами слушатели, на клик по итему открывается новая:
Java
1
2
3
4
5
6
7
8
9
10
OnItemClickListener OnListItemClick = new OnItemClickListener() 
    {
          public void onItemClick(AdapterView<?> parent, View view, int position, long id) 
          {                     
            Intent intent = new Intent(getApplicationContext(), DetectedPersonActivity.class);
            //intent.putExtra ..... пеердаем данные для новой активити          
            
            startActivity(intent);
          }
    };
и длинный клик по итему для удаления данного итема (вначале открывается диалог для подтверждения)
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
OnItemLongClickListener OnListItemLongClick = new  OnItemLongClickListener () 
    {
 
        @SuppressWarnings("deprecation")
        @Override
        public boolean onItemLongClick(AdapterView<?> arg0, View arg1,int arg2, long arg3) 
        {
            Log.d("LIST_VIEW", "LONG EVENT");
            m_selectedItem = arg2;
            showDialog(IDD_DELETE_ITEM); // этот метод депрекейтед 
            return false;
        }
    };
вообщем то вот так вот.. и все прекрасно работает.
Ametistos
0 / 0 / 0
Регистрация: 23.02.2013
Сообщений: 37
01.04.2013, 17:37  [ТС]     OnLongClickListener #5
кажется разобрался, у меня в каждом пункте списка было много Вьюшек, установил всем кроме одной setFocusable(false); - заработало))

теперь другая проблема - при длительном нажатии срабатывают сразу два обработчика и долгий и короткий? как этого избежать? вот мой код:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
myListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            
            public void onItemClick(AdapterView<?> parent, View itemClicked, int position, long id) {
                
                Log.v("click", "id= " + id);
            }
        });
        
        myListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            
            
 
            public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int id, long arg3) {
                
                Log.v("Long", ""id= " + id");
                return true;
            }
        });
в лог при длительном нажатии выводится:

Long id= 0
click id= 0

как этого избежать?
V0v1k
1158 / 982 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
01.04.2013, 18:33     OnLongClickListener #6
а если return false;?

Добавлено через 5 минут
хотя нет, все правильно, если в лонг клике возвращать true, то клик уже не должен срабатывать.

Добавлено через 13 минут
Цитата Сообщение от V0v1k Посмотреть сообщение
если в лонг клике возвращать true, то клик уже не должен срабатывать.
проверил у себя, так и есть.
Yandex
Объявления
01.04.2013, 18:33     OnLongClickListener
Ответ Создать тему
Опции темы

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