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

EditText в одном из Item ListView - Android

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 44, средняя оценка - 4.73
Stylish2013
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
07.06.2013, 19:25     EditText в одном из Item ListView #1
Помогите решить довольно нестандартную задачу. У меня есть 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>
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Stylish2013
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
09.06.2013, 01:06  [ТС]     EditText в одном из Item ListView #61
Цитата Сообщение от V0v1k Посмотреть сообщение
рассматривали вариант сделать все такое-же только без использования ListView? просто в скролвью добавлять айтемы и вешать на них клик лысенеры.
рассматривал, но я без понятия вообще как это делать... поэтому и остановился всё-таки на листе
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
V0v1k
1157 / 981 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
09.06.2013, 01:45     EditText в одном из Item ListView #62
а как вам такой вариант:
айтем "мой вариант" делаете обычным как остальные, но при клики на нем будет вызываться диалог когда можно ввести свой вариант, или просто под листом будет появляться едит.
если такое не подходит, тогда, возможно, вам поможет написание кастомного View, сможете перехватывать клики по эдиту без использования setFocusable.
или ищите другие костыли.

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

Но мне кажется, это наверное же сложнее всё переделать на такой вариант чем сейчас есть, если нет дайте мне знать и помогите с примером.
V0v1k
1157 / 981 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
09.06.2013, 13:57     EditText в одном из Item ListView #64
чтобы фокус отлавливать есть метод setOnFocusChangeListener.
Stylish2013
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
09.06.2013, 14:44  [ТС]     EditText в одном из Item ListView #65
Цитата Сообщение от V0v1k Посмотреть сообщение
чтобы фокус отлавливать есть метод setOnFocusChangeListener.
помогло так решить вопрос:
Java
1
2
3
                        holder.editText.setFocusable(true);
            holder.editText.setFocusableInTouchMode(true);
            holder.editText.requestFocus();
Уже с фокусами разобрался, всё работает как надо, отметки ставятся где нужно, но есть ещё один вопрос: Как можно не показывать item c EditText. т.е. не скрыть его, а именно сразу не отображать вообще. Просто будет приходить пометка, нужно отображать или нет.
V0v1k
1157 / 981 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
09.06.2013, 14:58     EditText в одном из Item ListView #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;
    }
Stylish2013
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
09.06.2013, 15:10  [ТС]     EditText в одном из Item ListView #67
когда false оно EditText не отображает, но сам item виден...?
V0v1k
1157 / 981 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
09.06.2013, 15:15     EditText в одном из Item ListView #68
просто не передавайте лишний айтем для эдита если едит не нужен.
Stylish2013
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
09.06.2013, 15:16  [ТС]     EditText в одном из Item ListView #69
Цитата Сообщение от V0v1k Посмотреть сообщение
просто не передавайте лишний айтем для эдита если едит не нужен.
не понял....
V0v1k
1157 / 981 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
09.06.2013, 15:18     EditText в одном из Item ListView #70
ладно, просто добавьте в адаптер
Java
1
2
3
4
 @Override
    public int getCount() {
        return mDisplayEdit ? super.getCount() : super.getCount() - 1;
    }
Stylish2013
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
09.06.2013, 15:29  [ТС]     EditText в одном из Item ListView #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", ""};
V0v1k
1157 / 981 / 1
Регистрация: 28.06.2012
Сообщений: 3,462
09.06.2013, 15:42     EditText в одном из Item ListView #72
ну так о чем я и говорил или просто не передавайте лишний айтем ("мой текст") или добавьте тот код.

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

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

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


Цитата Сообщение от Stylish2013 Посмотреть сообщение
если добавить это метод getCount то при нажатии на item с editText вылетает exeption
ну так добавьте проверку не последний ли это айтем прежде чем вызывать getItemAtPosition.
Stylish2013
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
09.06.2013, 18:07  [ТС]     EditText в одном из Item ListView #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 то она видна.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.06.2013, 19:20     EditText в одном из Item ListView
Еще ссылки по теме:

Custom ListView item setColor Android
Фильтрация ListView из EditText Android
EditText.Listener внутри ListView Android
Живой поиск через один EditText в разных Listview ? Android
Изменить цвет у item-a в listView Android

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

Или воспользуйтесь поиском по форуму:
Stylish2013
7 / 7 / 1
Регистрация: 20.04.2013
Сообщений: 666
09.06.2013, 19:20  [ТС]     EditText в одном из Item ListView #80
Цитата Сообщение от Stylish2013 Посмотреть сообщение
После ScroolView вставляю кнопку, но при большом списке ListView эту кнопку становится не видно.
Как после ScrollView расположить Button чтоб он был виден когда пролистаешь в низ???
Если Button вложить в ScrollView то она видна.
или проще сказать. Как сделать появление клавиатуры вплотную к item с EditText скрываю всё под собой. В приложении к письму видно. на первом снимке видна ещё кнопка, а результат нужен как на втором снимке - вплотную к listView.
Миниатюры
EditText в одном из Item ListView   EditText в одном из Item ListView  
Yandex
Объявления
09.06.2013, 19:20     EditText в одном из Item ListView
Ответ Создать тему
Опции темы

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