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

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

Войти
Регистрация
Восстановить пароль
 
Alex_Fedor
30 / 30 / 4
Регистрация: 20.01.2015
Сообщений: 225
#1

Нажать кнопку в ListView - Программирование Android

06.09.2015, 15:31. Просмотров 370. Ответов 6
Метки нет (Все метки)

Понимаю что простой вопрос, но не нашел как. Почти все работает
Есть простая разметка состоящая из TextView и Button
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >
 
    <TextView
        android:id="@+id/tvOut"
        android:textIsSelectable="false"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="TextView" />
 
    <Button
        android:id="@+id/btnDel"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="0"
        android:text="X"
         />
 
</LinearLayout>
Которая выводится в ListView. Необходимо событие нажатия на кнопку отлавливать где нибудь в MainActivity
Для этого пишем свой адаптер в методе getView все заполняем. Код работает, но событие нажатия на кнопку происходить внутри его метода, а надо в где нибудь в 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
public class OganizerAdapter extends BaseAdapter  {
    private Context cont;
    LayoutInflater layoutInflater;
    ArrayList<String> object ;
    final String LOG_TAG="myLog";
    public OganizerAdapter(Context context,String[] inRec) {
        // TODO Auto-generated constructor stub
        cont=context;
        object=new ArrayList<String>();
        for (int i = 0; i < inRec.length; i++) {
            object.add(inRec[i]);
        }
        layoutInflater=(LayoutInflater) cont.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }
 
    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return object.size();
    }
 
    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return object.get(position);
    }
 
    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }
 
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        if(convertView == null){
            convertView = layoutInflater.inflate(R.layout.my_list_item_btn,parent,false);//загрузили view
        }
        TextView txtView=(TextView) convertView.findViewById(R.id.tvOut);//нашли  TextView txtView
        txtView.setText(object.get(position));//вывели в txtView текст 
        Button btnDel = (Button) convertView.findViewById(R.id.btnDel);//нашли Button btnDel
        btnDel.setTag(position);//присвоили тег, чтобы знать вкакой позиции нажали кноку
        btnDel.setFocusable(false);//убрали фокус иначе у ListView в MainActivity не будет работать метод onItemClick
        btnDel.setOnClickListener(new View.OnClickListener()// событие нажатия на кнопку
        {
            @Override
            public void onClick(View v)
            {
                //Это событие надо как то отлавливать в MainActivity
                Log.d(LOG_TAG,"OganizerAdapter: нажата кнопка в позиции = "+v.getTag() );
            }
        });
 
        return convertView;
    }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.09.2015, 15:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Нажать кнопку в ListView (Программирование Android):

Програмно нажать кнопку - Программирование Android
Почему обрабатывается &quot;KEYCODE_BACK&quot; , а &quot;KEYCODE_MEDIA_PLAY&quot;, &quot;KEYCODE_VOLUME_UP&quot;... не обрабатываются при нажатии на кнопку? ...

Программно нажать кнопку другого приложения - Программирование Android
Приветствую. Есть ли возможность под android программно: 1. Нажать кнопку другого приложения? 2. Минимизировать\закрыть чужое...

Как нажать кнопку основого активити из фрагмента - Программирование Android
Здравствуйте! Столкнулся с такой проблемой, что получается в фрагменте добраться до кнопки, которая в разметке самого фрагмента. Но...

Как найти id записи в SQlite таблице при клике на кнопку расположенную в Listview item? - Программирование Android
привет ! подскажите пожалуйста решение((( Кейс: у меня есть листвью , который выводит записи из локальной БД. На каждом айтеме...

ListView. После добавления кнопки перестал быть доступен сам ListView - Программирование Android
Кастомизировал ListView с помощью нескольких TextView. Но после того, как добавил ImageButton сам список стал недоступен для клика, а...

Listview вывод данных и переход по нажатию на другой Listview SQLite - Программирование Android
Доброго извините за название темы, долго не мог сформировать название, В общем у меня беда с пытаюсь написать программу где первый экран...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
androbro
326 / 286 / 60
Регистрация: 17.10.2014
Сообщений: 842
06.09.2015, 16:06 #2
Цитата Сообщение от Alex_Fedor Посмотреть сообщение
а надо в где нибудь в MainActivity
можно через интерфейс
Alex_Fedor
30 / 30 / 4
Регистрация: 20.01.2015
Сообщений: 225
06.09.2015, 16:59  [ТС] #3
Цитата Сообщение от androbro Посмотреть сообщение
можно через интерфейс
Спасибо конечно. Носом натыкайте, с примерчиком, третий день уже парюсь

Добавлено через 32 минуты
Сам себе авось кому пригодится.
кнопку в getView описываем таким образом
Java
1
2
3
4
Button btnDel = (Button) convertView.findViewById(R.id.btnDel);//нашли Button btnDel
        btnDel.setTag(position);//присвоили тег, чтобы знать вкакой позиции нажали кноку
        btnDel.setFocusable(false);//убрали фокус иначе у ListView в MainActivity не будет работать метод onItemClick
        btnDel.setOnClickListener(new MainActivity());// событие нажатия на кнопку
тогда событие нажатия на кнопку попадает в MainActivity в метод onClick(View v).
вычислить что нажали можно по тегу.
В MainActtivity не забываем прописывать public class MainActivity extends Activity implements OnClickListener
Mikalai
256 / 232 / 93
Регистрация: 11.01.2015
Сообщений: 655
06.09.2015, 17:00 #4
Не нужно новый экземпляр создавать - new MainActivity(). Нужно ссылку попросить в конструкторе и там её испоользовать
Alex_Fedor
30 / 30 / 4
Регистрация: 20.01.2015
Сообщений: 225
06.09.2015, 17:32  [ТС] #5
Цитата Сообщение от Mikalai Посмотреть сообщение
Не нужно новый экземпляр создавать - new MainActivity(). Нужно ссылку попросить в конструкторе и там её испоользовать
Если вам будет не трудно, напишите плз. правильную последовательность нажатия кнопок.Сам я уже не в состоянии сообразить.
REALIST07
Автор FAQ
Автор FAQ
176 / 176 / 13
Регистрация: 11.06.2010
Сообщений: 932
06.09.2015, 17:55 #6
Создаешь интерфейс :
Java
1
2
3
4
public interface OnButtonClickListener {
       
        void onButtonClick();
}
В конструкторе адаптера передаешь экземпляр:
Java
1
2
3
4
5
6
7
8
9
10
11
12
private OnButtonClickListener listener;
 public OganizerAdapter(Context context,String[] inRec,OnButtonClickListener listener) {
        // TODO Auto-generated constructor stub
        cont=context;
        object=new ArrayList<String>();
        for (int i = 0; i < inRec.length; i++) {
            object.add(inRec[i]);
        }
        layoutInflater=(LayoutInflater) cont.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 
this.listener = listener;
    }
Вызываешь так:
Java
1
2
3
4
5
6
7
8
9
10
 btnDel.setOnClickListener(new View.OnClickListener()// событие нажатия на кнопку
        {
            @Override
            public void onClick(View v)
            {
                listener.OnButtonClick();
                //Это событие надо как то отлавливать в MainActivity
                Log.d(LOG_TAG,"OganizerAdapter: нажата кнопка в позиции = "+v.getTag() );
            }
        });
В MainActivity
Java
1
2
3
4
5
6
OnButtonClickListener listener  = new OnButtonClickListener() {
        @Override
        public void onButtonClick() {
         // тут обработка
        }
    };
передать в адаптер так:
Java
1
new OganizerAdapter(this,..,listener);
Mikalai
256 / 232 / 93
Регистрация: 11.01.2015
Сообщений: 655
06.09.2015, 18:24 #7
Примерно так всё должно выглядеть:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class MainActivity extends Activity implements View.OnClickListener{
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        String[] data = {"1", "2"};
        OganizerAdapter adapter = new OganizerAdapter(this, data);
        //....................
    }
 
    @Override
    public void onClick(View v) {
        //этот метод будет вызываться
    }
}
Адаптер:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class OganizerAdapter extends BaseAdapter {
    View.OnClickListener listener;
    //...............
    public OganizerAdapter(Context context,String[] inRec) {
        listener = (View.OnClickListener) context;
        //...............
    }
//...............
 
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        //.................
        btnDel.setOnClickListener(listener);
 
        return convertView;
    }
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.09.2015, 18:24
Привет! Вот еще темы с ответами:

Данные из SQlite в ListView, обработка события ListView - Программирование Android
Ребят, есть БД, ListView. Надо при нажатии на строчку ListView вытащить данные int из БД. mList.setOnItemClickListener(new...

ListView, ToggleButton, SQLite, CursorAdapter. Как найти idItem в ListView, где была нажата ToggleButton? - Программирование Android
Добрый день. Затрудняюсь понять один момент: У меня есть ListView, который заполнен Items. Каждый Item - это свой XML. Пока...

Копирование данных из 1 listView во 2 listView - Программирование Android
Нужно что бы при нажатии на один элемент в первом ListView он копировался во второй ListView причём многократно.Но я использую...

Действие на кнопку физическую кнопку Меню - Программирование Android
Здравствуйте. Хочу в своё приложение добавить QuickAction3D, взялся разбирать их пример и взял код import android.app.Activity; ...


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

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

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