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

EditText в одном из Item ListView

07.06.2013, 19:25. Показов 9973. Ответов 84
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите решить довольно нестандартную задачу. У меня есть ListView, есть Adapter который делает кастомный вид разметки. В ListView выводится список слов и один из элементов ListView содержит надпись "мой текст". Мне нужно, чтобы при клике на элемент ListView где написано "мой текст", появилась клавиатура и предлагало сюда ввести текст, т.е. в этой ячейке должен быть editText, но в других ячейках должен быть только текст и вписать в них ничего нельзя.

Ещё на элементе должна быть справа картинка (типа radiobutton но своя картинка), которая будет говорить какой элемент выбран и после по нажатию кнопки которая будет находится под 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
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
 
public class Registration_Activity extends FragmentActivity {
    PagerAdapter pagerAdapter;
    public ViewPager mViewPager;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        setContentView(R.layout.registration_activity);     
        
        mViewPager = (ViewPager) findViewById(R.id.pager);      
        TitleAdapter titleAdapter = new TitleAdapter(getSupportFragmentManager());
        mViewPager.setAdapter(titleAdapter);
        mViewPager.setCurrentItem(0);
       
    }
    
    public class TitleAdapter extends FragmentPagerAdapter {        
        private final Fragment frags[] = new Fragment[3];    
        public TitleAdapter(FragmentManager fm) {
            super(fm);
            
            frags[0] = new Registration_Fragment1();
            frags[1] = new Registration_Fragment2();
            frags[2] = new Registration_Fragment3();
        }
     
        @Override
        public Fragment getItem(int position) {
            return frags[position];
        }
     
        @Override
        public int getCount() {
            return frags.length;
        }
    }
 
        
    }
Фрагмент где всё происходит
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
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
 
public class Registration_Fragment1 extends Fragment {
 
    private String[] listview_array = { "ONE", "TWO", "THREE", "мой текст" };
 
    ListView myList;
 
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        AdapterFragment mAdapter = new AdapterFragment(getActivity(),
                listview_array);
        myList.setAdapter(mAdapter);
        super.onActivityCreated(savedInstanceState);
 
    }
 
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
 
        View myView = inflater.inflate(R.layout.registration_screen_2,
                container, false);
 
        myList = (ListView) myView.findViewById(R.id.listView);
 
        AdapterFragment mAdapter = new AdapterFragment(getActivity(),
                listview_array);
        myList.setAdapter(mAdapter);
 
        Helper.getListViewSize(myList);
 
        return myView;
    }
 
}
Адаптер
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
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
 
public class AdapterFragment extends ArrayAdapter<String> {
    private final Context context;
    private final String[] values;
 
    public AdapterFragment(Context context, String[] values) {
        super(context, R.layout.item, values);
        this.context = context;
        this.values = values;
    }
 
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 
        View rowView = inflater.inflate(R.layout.item, parent, false);
        TextView textView = (TextView) rowView.findViewById(R.id.textView111);
        ImageView imageView = (ImageView) rowView.findViewById(R.id.imageView111);
        textView.setText(values[position]);
 
        // Change icon based on name
        String s = values[position];
 
        System.out.println(s);
 
        return rowView;
    }
}
разметка
XML
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
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/ic_launcher"
    android:orientation="vertical" >
 
    <LinearLayout
        android:id="@+id/linearLayout1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:background="@drawable/ic_launcher"
        android:orientation="vertical" >
    </LinearLayout>
 
    <ScrollView
        android:id="@+id/scrollView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/linearLayout1" >
 
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="499dp" >
 
            <LinearLayout
                android:id="@+id/linearLayout2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerHorizontal="true"
                android:layout_marginTop="10dp"
                android:orientation="vertical" >
 
                <ImageView
                    android:id="@+id/imageView1"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_horizontal"
                    android:src="@drawable/ic_launcher" />
 
                <TextView
                    android:id="@+id/textViewTitleQuiz"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="10dp"
                    android:layout_marginRight="10dp"
                    android:text="TextView" />
            </LinearLayout>
 
            <TextView
                android:id="@+id/textView2"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignLeft="@+id/linearLayout2"
                android:layout_below="@+id/linearLayout2"
                android:layout_marginTop="5dp"
                android:text="TextView" />
 
            <LinearLayout
                android:id="@+id/linearLayout3"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/textView2"
                android:layout_centerHorizontal="true"
                android:orientation="vertical" >
 
                <TextView
                    android:id="@+id/textView3"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="10dp"
                    android:layout_marginTop="5dp"
                    android:text="TextView" />
            </LinearLayout>
 
            <LinearLayout
                android:id="@+id/linearLayout4"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/linearLayout3"
                android:layout_centerHorizontal="true"
                android:orientation="vertical" >
 
                <ListView
                    android:id="@+id/listView"
                    android:layout_width="fill_parent"
                    android:layout_height="fill_parent"
                    android:layout_marginTop="10dp" >
                </ListView>
            </LinearLayout>
 
            <Button
                android:id="@+id/buttonApply"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignLeft="@+id/linearLayout3"
                android:layout_below="@+id/linearLayout4"
               android:text="Apply" />
        </RelativeLayout>
 
    </ScrollView>
 
</RelativeLayout>
разметка Item

XML
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
<?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="match_parent"
    android:orientation="vertical" >
 
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/close_task_item_answer">
 
        <TextView
            android:id="@+id/textView111"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_centerVertical="true"
            android:text="Medium Text"
            android:textAppearance="?android:attr/textAppearanceMedium" />
 
        <ImageView
            android:id="@+id/imageView111"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:layout_marginRight="22dp"
            android:src="@android:drawable/ic_delete" />
 
    </RelativeLayout>
 
</LinearLayout>
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.06.2013, 19:25
Ответы с готовыми решениями:

Создание ListView из EditText
Выдает ошибку в строке при создании адаптера. Пишет, что не распознает конструкцию ArrayAdapter...

Фильтрация ListView из EditText
Не могу разобраться с фильтрацией в ListView. Фильтрация происходит правильно (находит нужное...

EditText.Listener внутри ListView
Добрый день. Помогите пожалуйста с задачкой. У меня есть ListView, который пополняется записями...

Цвет item в listview
учусь работать с listview и наткнулся на такую проблему: когда проверял в эмуляторе, то все было...

84
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
09.06.2013, 01:06  [ТС] 61
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от V0v1k Посмотреть сообщение
рассматривали вариант сделать все такое-же только без использования ListView? просто в скролвью добавлять айтемы и вешать на них клик лысенеры.
рассматривал, но я без понятия вообще как это делать... поэтому и остановился всё-таки на листе
0
1162 / 986 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
09.06.2013, 01:45 62
а как вам такой вариант:
айтем "мой вариант" делаете обычным как остальные, но при клики на нем будет вызываться диалог когда можно ввести свой вариант, или просто под листом будет появляться едит.
если такое не подходит, тогда, возможно, вам поможет написание кастомного View, сможете перехватывать клики по эдиту без использования setFocusable.
или ищите другие костыли.

Добавлено через 21 минуту
или можно отдельно от списка внизу добавить этот эдит с имеджем, при фокусе на эдит вставлять галочку а в адаптер setSelectedIndex(-1), а при клике на айтем списка убрать галочку возле эдита.
0
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
09.06.2013, 13:13  [ТС] 63
Цитата Сообщение от V0v1k Посмотреть сообщение
или можно отдельно от списка внизу добавить этот эдит с имеджем, при фокусе на эдит вставлять галочку а в адаптер setSelectedIndex(-1), а при клике на айтем списка убрать галочку возле эдита.
Вы знаете меня вполне бы устроил такой вариант. Ведь у меня не всегда буде возможность ввести свой вариант, это будет зависеть от получаемых данных. Иногда будут просто варианты ответа т.е. EditText будет не всегда выводится.

Но мне кажется, это наверное же сложнее всё переделать на такой вариант чем сейчас есть, если нет дайте мне знать и помогите с примером.
0
1162 / 986 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
09.06.2013, 13:57 64
чтобы фокус отлавливать есть метод setOnFocusChangeListener.
0
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
09.06.2013, 14:44  [ТС] 65
Цитата Сообщение от V0v1k Посмотреть сообщение
чтобы фокус отлавливать есть метод setOnFocusChangeListener.
помогло так решить вопрос:
Java
1
2
3
                        holder.editText.setFocusable(true);
            holder.editText.setFocusableInTouchMode(true);
            holder.editText.requestFocus();
Уже с фокусами разобрался, всё работает как надо, отметки ставятся где нужно, но есть ещё один вопрос: Как можно не показывать item c EditText. т.е. не скрыть его, а именно сразу не отображать вообще. Просто будет приходить пометка, нужно отображать или нет.
0
1162 / 986 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
09.06.2013, 14:58 66
Цитата Сообщение от Stylish2013 Посмотреть сообщение
setFocusableInTouchMode
ах да, совсем забыл про этот метод...


Цитата Сообщение от Stylish2013 Посмотреть сообщение
Как можно не показывать item c EditText. т.е. не скрыть его, а именно сразу не отображать вообще. Просто будет приходить пометка, нужно отображать или нет.
адаптер:
Java
1
2
3
4
5
6
7
8
9
10
private boolean mDisplayEdit;
 
    @Override
    public int getItemViewType(int position) {
        return (position == this.getCount() - 1) && mDisplayEdit ? 1 : 0;
    }
 
    public void setDisplayEdit(boolean display) {
        mDisplayEdit = display;
    }
0
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
09.06.2013, 15:10  [ТС] 67
когда false оно EditText не отображает, но сам item виден...?
0
1162 / 986 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
09.06.2013, 15:15 68
просто не передавайте лишний айтем для эдита если едит не нужен.
0
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
09.06.2013, 15:16  [ТС] 69
Цитата Сообщение от V0v1k Посмотреть сообщение
просто не передавайте лишний айтем для эдита если едит не нужен.
не понял....
0
1162 / 986 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
09.06.2013, 15:18 70
ладно, просто добавьте в адаптер
Java
1
2
3
4
 @Override
    public int getCount() {
        return mDisplayEdit ? super.getCount() : super.getCount() - 1;
    }
1
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
09.06.2013, 15:29  [ТС] 71
да спасибо это работает!!!

но есть ещё интересное поведение.
передаю:
Java
1
    private String[] listview_array = { "ONE", "TWO", "THREE", "FOUR"};
а отображается только
Java
1
"ONE", "TWO", "THREE"
а если добавить item с edit text, то в нем отображается
Java
1
"FOUR"
неужели надо всегда передавать дополнительно ""
Java
1
    private String[] listview_array = { "ONE", "TWO", "THREE", "FOUR", ""};
0
1162 / 986 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
09.06.2013, 15:42 72
ну так о чем я и говорил или просто не передавайте лишний айтем ("мой текст") или добавьте тот код.

Добавлено через 55 секунд
если не передаете "мой текст", то метод getCount не нужен.
0
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
09.06.2013, 15:49  [ТС] 73
так я и не передаю у меня в xml пометка подсказка
XML
1
   android:hint="Мой ответ"
и всё. Или что значит не передавать.??? здесь:
Java
1
private String[] listview_array = { "ONE", "TWO", "THREE", "FOUR"};
????

Добавлено через 1 минуту
Цитата Сообщение от Stylish2013 Посмотреть сообщение
а если добавить item с edit text, то в нем отображается

Java
1
"FOUR"
точнее в нем это тоже не обтображается
0
1162 / 986 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
09.06.2013, 15:51 74
ну, в том примере что вы мне дали есть
Java
1
private String[] listview_array = { "ONE", "TWO", "THREE", "мой текст" };
вот благодаря "мой текст" создавался дополнительный айтем для эдита, если писать просто
Java
1
private String[] listview_array = { "ONE", "TWO", "THREE" };
то метод getCount можете удалить.
0
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
09.06.2013, 16:10  [ТС] 75
когда в метод setDisplayEdit передаю false и удаляю метод getCount. ТО всё отображается как надо. А вот когда передаю true, то тогда съедается последний item, он как бы переходит в item с Edit Text
0
1162 / 986 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
09.06.2013, 16:24 76
ну так добавляйте "" для эдита когда передаете true.
или
Java
1
2
3
4
@Override
    public int getCount() {
        return mDisplayEdit ? super.getCount()+1 : super.getCount();
    }
0
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
09.06.2013, 16:37  [ТС] 77
Цитата Сообщение от V0v1k Посмотреть сообщение
ну так добавляйте "" для эдита когда передаете true.
а это надо вычислить все элементы в String[] циклом и после в конце добавить "" ????

если добавить это метод getCount то при нажатии на item с editText вылетает exeption
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
06-09 15:32:23.889: E/AndroidRuntime(24750): FATAL EXCEPTION: main
06-09 15:32:23.889: E/AndroidRuntime(24750): java.lang.IndexOutOfBoundsException
06-09 15:32:23.889: E/AndroidRuntime(24750):    at java.util.Arrays$ArrayList.get(Arrays.java:75)
06-09 15:32:23.889: E/AndroidRuntime(24750):    at android.widget.ArrayAdapter.getItem(ArrayAdapter.java:298)
06-09 15:32:23.889: E/AndroidRuntime(24750):    at android.widget.AdapterView.getItemAtPosition(AdapterView.java:740)
06-09 15:32:23.889: E/AndroidRuntime(24750):    at by.example.fragmentexample.Registration_Fragment1$1.onItemClick(Registration_Fragment1.java:76)
06-09 15:32:23.889: E/AndroidRuntime(24750):    at android.widget.AdapterView.performItemClick(AdapterView.java:284)
06-09 15:32:23.889: E/AndroidRuntime(24750):    at android.widget.ListView.performItemClick(ListView.java:3763)
06-09 15:32:23.889: E/AndroidRuntime(24750):    at android.widget.AbsListView$PerformClick.run(AbsListView.java:1918)
06-09 15:32:23.889: E/AndroidRuntime(24750):    at android.os.Handler.handleCallback(Handler.java:587)
06-09 15:32:23.889: E/AndroidRuntime(24750):    at android.os.Handler.dispatchMessage(Handler.java:92)
06-09 15:32:23.889: E/AndroidRuntime(24750):    at android.os.Looper.loop(Looper.java:130)
06-09 15:32:23.889: E/AndroidRuntime(24750):    at android.app.ActivityThread.main(ActivityThread.java:3687)
06-09 15:32:23.889: E/AndroidRuntime(24750):    at java.lang.reflect.Method.invokeNative(Native Method)
06-09 15:32:23.889: E/AndroidRuntime(24750):    at java.lang.reflect.Method.invoke(Method.java:507)
06-09 15:32:23.889: E/AndroidRuntime(24750):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
06-09 15:32:23.889: E/AndroidRuntime(24750):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
06-09 15:32:23.889: E/AndroidRuntime(24750):    at dalvik.system.NativeStart.main(Native Method)
0
1162 / 986 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
09.06.2013, 16:43 78
Цитата Сообщение от Stylish2013 Посмотреть сообщение
а это надо вычислить все элементы в String[] циклом и после в конце добавить "" ????
ничего не понял.


Цитата Сообщение от Stylish2013 Посмотреть сообщение
если добавить это метод getCount то при нажатии на item с editText вылетает exeption
ну так добавьте проверку не последний ли это айтем прежде чем вызывать getItemAtPosition.
0
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
09.06.2013, 18:07  [ТС] 79
Цитата Сообщение от V0v1k Посмотреть сообщение
ничего не понял.
просто я не понимаю как передать "" для эдита когда передаю true.


Цитата Сообщение от V0v1k Посмотреть сообщение
ну так добавьте проверку не последний ли это айтем прежде чем вызывать getItemAtPosition.
простите, а как это сделать?

p.s. не ругайте, за мою несообразительность....

Добавлено через 46 минут
сделал так:
Java
1
2
3
4
5
6
               try{
                String item = (String) myList.getItemAtPosition(position);
                Toast.makeText(getActivity(),"You selected : " + item,Toast.LENGTH_SHORT).show();   
                }catch (Exception e) {
                System.out.println("нажат последний элемент");
                }
Добавлено через 32 минуты
После ScroolView вставляю кнопку, но при большом списке ListView эту кнопку становится не видно.
Как после ScrollView расположить Button чтоб он был виден когда пролистаешь в низ???
Если Button вложить в ScrollView то она видна.
0
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
09.06.2013, 19:20  [ТС] 80
Цитата Сообщение от Stylish2013 Посмотреть сообщение
После ScroolView вставляю кнопку, но при большом списке ListView эту кнопку становится не видно.
Как после ScrollView расположить Button чтоб он был виден когда пролистаешь в низ???
Если Button вложить в ScrollView то она видна.
или проще сказать. Как сделать появление клавиатуры вплотную к item с EditText скрываю всё под собой. В приложении к письму видно. на первом снимке видна ещё кнопка, а результат нужен как на втором снимке - вплотную к listView.
Миниатюры
EditText в одном из Item ListView   EditText в одном из Item ListView  
0
09.06.2013, 19:20
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.06.2013, 19:20
Помогаю со студенческими работами здесь

ListView: передача данных в item
Элементы ListView содержат три TextView и два ImageView. В первый TextView записываю данные так: ...

ListView. Задать высотку Item-а
Посмотрите этот пример(очень простой) - http://freehabr.ru/blog/android/2022.html Как там изменить...

Custom ListView item setColor
Всех С Новым Годом! Начал изучать разработку под Android на IDE Android Studio. Создал TabHost с...

Изменить цвет у item-a в listView
Привет, вопрос такой. Задача такая: Допустим у меня есть элементы listview разноцветные: (мне...


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

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