Focus on EditText in ListView when block descendants (Android)
Asked Answered
V

5

7

I have a customized ListView. Each row has an EditText, Buttons & TextView. In order to make the ListView items clickable I have kept android:descendantFocusability="blocksDescendants" for row layout. If I don't keep the descendantFocusability I am not able to implement an action for onItemClick. If I keep descendantFocusability the EditTextwhich is present in my row is not gaining focus. I want the EditText focusable and also I should be able to click on each row to navigate to another Activity. Can anyone please help me in this. Thanks all.

Edit : In the CustomAdapter for EditText, I tried keeping onTouchListenerand also onClickListenerwhere I requestFocus but that does not seem to work.

row.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/recentrowLayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/margin_left_5"
android:clickable="true"
tools:ignore="UseCompoundDrawables,HardcodedText,ContentDescription,UselessParent" >

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/edit_text_bg"
    android:padding="@dimen/margin_left_5" >

    <RelativeLayout
        android:id="@+id/rl1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >

        <ImageView
            android:id="@+id/addSubscribe"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true" />

        <TextView
            android:id="@+id/flikart_textview"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:text="FLIKART"
            android:textColor="@color/gray"
            android:textSize="@dimen/medium_text_size" />

        <ImageView
            android:id="@+id/addToFav"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true" />
    </RelativeLayout>

    <LinearLayout
        android:id="@+id/rl2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/rl1"
        android:layout_marginLeft="@dimen/margin_30"
        android:layout_marginRight="@dimen/margin_30"
        android:layout_marginTop="10dp"
        android:gravity="center"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/text_desciption"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:gravity="center_horizontal"
            android:lines="2"
            android:text="20% off on Smart Phones and basic Handsets has upto 50% OFF only"
            android:textColor="@color/blue" />

        <TextView
            android:id="@+id/text_desciption2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:lines="1"
            android:text="somethign something,......."
            android:textColor="@color/gray" />

        <TextView
            android:id="@+id/couponTypeText"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="@dimen/margin_left_10"
            android:background="@drawable/button_bg"
            android:gravity="center"
            android:padding="@dimen/margin_left_10"
            android:text="STEAL THE DEAL"
            android:textColor="@color/white"
            android:textSize="@dimen/little_small_text_size" />
    </LinearLayout>

    <RelativeLayout
        android:id="@+id/rl3"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/rl2"
        android:layout_marginTop="@dimen/margin_left_10" >

        <TextView
            android:id="@+id/text_offer_expiry"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_centerVertical="true"
            android:layout_marginRight="@dimen/margin_left_5"
            android:text="Ends 10 days"
            android:textColor="@color/red"
            android:textSize="16sp" />

        <RelativeLayout
            android:id="@+id/rightLayout"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:layout_marginRight="5dp" >

            <ImageView
                android:id="@+id/comment_image_total"
                android:layout_width="@dimen/dimenstion_25"
                android:layout_height="@dimen/dimenstion_20"
                android:background="@drawable/comments" />

            <TextView
                android:id="@+id/text_comments"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:layout_toRightOf="@id/comment_image_total"
                android:text="100 Comments"
                android:textColor="@color/gray"
                android:textSize="16sp" />
        </RelativeLayout>

        <RelativeLayout
            android:id="@+id/ll2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_marginLeft="10dp"
            android:layout_marginRight="10dp"
            android:layout_toLeftOf="@id/rightLayout"
            android:layout_toRightOf="@id/text_offer_expiry"
            android:gravity="center_horizontal" >

            <ImageView
                android:id="@+id/like_image_total"
                android:layout_width="@dimen/dimenstion_25"
                android:layout_height="@dimen/dimenstion_25"
                android:background="@drawable/like" />

            <TextView
                android:id="@+id/text_total_likes"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:layout_toRightOf="@id/like_image_total"
                android:text="999 Likes"
                android:textColor="@color/gray"
                android:textSize="16sp" />
        </RelativeLayout>
    </RelativeLayout>

    <View
        android:id="@+id/view"
        android:layout_width="fill_parent"
        android:layout_height="4dp"
        android:layout_below="@id/rl3"
        android:layout_marginTop="@dimen/margin_5"
        android:background="@color/purple_clor" />

    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="@dimen/title_bar_height"
        android:layout_below="@id/view"
        android:layout_centerVertical="true"
        android:layout_marginTop="@dimen/margin_5" >

        <RelativeLayout
            android:id="@+id/likesLayout"
            android:layout_width="@dimen/dimenstion_40"
            android:layout_height="@dimen/dimenstion_40"
            android:layout_centerVertical="true"
            android:background="@drawable/unratedbkg" >

            <Button
                android:id="@+id/likesBtn"
                android:layout_width="@dimen/dimenstion_30"
                android:layout_height="@dimen/dimenstion_30"
                android:layout_centerInParent="true"
                android:background="@drawable/unrated" />
        </RelativeLayout>

        <RelativeLayout
            android:id="@+id/footermain"
            android:layout_width="fill_parent"
            android:layout_height="@dimen/dimenstion_40"
            android:layout_centerVertical="true"
            android:layout_toRightOf="@id/likesLayout"
            android:background="@color/white" >

            <RelativeLayout
                android:id="@+id/animLayout"
                android:layout_width="100dp"
                android:layout_height="@dimen/dimenstion_40"
                android:layout_marginLeft="10dp"
                android:layout_toRightOf="@id/likesLayout"
                android:background="@drawable/ratingbkg"
                android:visibility="gone" >

                <RelativeLayout
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignParentLeft="true"
                    android:layout_margin="@dimen/margin_5" >

                    <ImageView
                        android:id="@+id/like_image"
                        android:layout_width="@dimen/dimenstion_30"
                        android:layout_height="@dimen/dimenstion_30"
                        android:layout_centerInParent="true"
                        android:background="@drawable/like" />
                </RelativeLayout>

                <RelativeLayout
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignParentRight="true"
                    android:layout_margin="@dimen/margin_5" >

                    <ImageView
                        android:id="@+id/dislike_image"
                        android:layout_width="@dimen/dimenstion_30"
                        android:layout_height="@dimen/dimenstion_30"
                        android:layout_centerInParent="true"
                        android:background="@drawable/dislike" />
                </RelativeLayout>
            </RelativeLayout>

            <EditText
                android:id="@+id/add_comment"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerVertical="true"
                android:layout_marginLeft="5dp"
                android:layout_toRightOf="@id/animLayout"
                android:focusable="false"
                android:focusableInTouchMode="false"
                android:hint="Add Comment"
                android:inputType="text" />
        </RelativeLayout>
    </RelativeLayout>
</RelativeLayout>

</LinearLayout>
Vituline answered 20/12, 2013 at 5:0 Comment(2)
Do the 3 View occupy all the space or is there any space left?Joacimah
Could you post your XML layout for the row?Joacimah
P
16

please Don't use setOnItemClickListener for item click .. i think that you should be use item view click inside adapter method

convertView.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Toast.makeText(context, "click item",Toast.LENGTH_LONG).show();
            }
        });

Remove this from main list item layout

android:descendantFocusability="blocksDescendants" 

Thanks and enjoy this code !

Phototransistor answered 24/12, 2013 at 6:4 Comment(1)
Thanks a lot, I've tried all kind of things to handle both my EditText focus and ListItem's and ListItem's Child's onClick: Manually enabling and disabling onFocusable for the EditTexts in the onTouchListener; using adjustPan in Manifest; using descendantFocusability on the ListView or ListItem's layout; Manually using requestFocus, requestFocusFromTouch and post on my EditText, and a few other things. In the end only this solution worked and also isn't some work-around like with the other methods I've tried! Only took me little over 3 hours.. So once again, thanks!Trichroism
U
4

Try to add this line to your activity in the manifest.xml

android:windowSoftInputMode="stateHidden|adjustResize|adjustPan"
Unmentionable answered 24/12, 2013 at 13:43 Comment(2)
Accepted answer worked for me only in combination with this one. Without this line the ListView kept reloading the items when EditText gains focus. May be thats because im hiding/showing the EditText on item click, maybe its normal android 5.0 behaviorPham
i did. Thats why its 0 instead of -1Pham
W
2

you do like this:

first set in your listview's android:focusable="false";

then you want row to be clicked: for this in your customAdapter you should do like this

 v.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) { 
                // TODO Auto-generated method stub
            Toast.makeText(context, "Hello world",2000).show(); 

            }
        });

It will work.

By default, your items should now have the click option, when you made android:focusable="false" in listview.

No need to use descendantFocusability in listview.

Wraith answered 27/12, 2013 at 7:20 Comment(0)
L
-1

main.xml

<ListView
android:id="@+id/listView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:animationCache="false"
android:scrollingCache="false"
android:smoothScrollbar="true" >
</ListView>

Create ArrayList add data into the arraylist.

lv=(ListView)findViewById(R.id.listView1);
lv.setItemsCanFocus(true);

for(int i=0;i<30 data-blogger-escaped-br="" data-blogger-escaped-i=""> list.add(i);
}

1)create adapter for the listview and set the position as tag for the edittext.

2)Normally,when scrolling the item position will change.So,you have to get the edittext tag and set it into the edittext id.from that you can avoid the change of the item position.

holder.caption = (EditText) convertView
.findViewById(R.id.editText12);
holder.caption.setTag(position); 
holder.caption.setText(list.get(position).toString());
convertView.setTag(holder);

}else {
holder = (ViewHolder) convertView.getTag();
}
int tag_position=(Integer) holder.caption.getTag();
holder.caption.setId(tag_position); 

Finally,add the text watcher to the edittext and store the changes into correct position in the list.

holder.caption.addTextChangedListener(new TextWatcher() {

             @Override
            public void onTextChanged(CharSequence s, int start, int before,
                    int count) {
                      final int position2 = holder.caption.getId();
                      final EditText Caption = (EditText) holder.caption;
                      if(Caption.getText().toString().length()>0){
                       list.set(position2,Integer.parseInt(Caption.getText().toString()));
                      }else{
                       Toast.makeText(getApplicationContext(), "Please enter some value", Toast.LENGTH_SHORT).show();
                      }

                  }

             @Override
            public void beforeTextChanged(CharSequence s, int start, int count,
                    int after) {
                // TODO Auto-generated method stub
            }

             @Override
            public void afterTextChanged(Editable s) {

            }

         });

Refer this link..http://velmuruganandroidcoding.blogspot.in/2014/08/edittext-in-listview-android-example.html

Likker answered 8/8, 2014 at 9:53 Comment(1)
Welcome to Stack overflow. FYI, Answering in links is discouraged in Stack overflow. Provide the portion of that page that answers the question of OP in your answer so that future readers may be able to read it even if the link is broken.Twombly
F
-2

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <ListView android:id="@+id/MyList" android:layout_height="fill_parent"
        android:layout_width="fill_parent" android:descendantFocusability="beforeDescendants">
    </ListView>
</LinearLayout>

item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <EditText android:id="@+id/ItemCaption"
        android:layout_height="wrap_content" android:layout_width="fill_parent"
        android:layout_marginLeft="2dip" android:singleLine="true">
    </EditText>

</LinearLayout>

AndroidCustomListViewActivity

public class AndroidCustomListViewActivity extends Activity {
    private ListView myList;
    private MyAdapter myAdapter;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        myList = (ListView) findViewById(R.id.MyList);
        myList.setItemsCanFocus(true);
        myAdapter = new MyAdapter();
        myList.setAdapter(myAdapter);

    }

    public class MyAdapter extends BaseAdapter {
        private LayoutInflater mInflater;
        public ArrayList myItems = new ArrayList();

        public MyAdapter() {
            mInflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            for (int i = 0; i < 20; i++) {
                ListItem listItem = new ListItem();
                listItem.caption = "Caption" + i;
                myItems.add(listItem);
            }
            notifyDataSetChanged();
        }

        public int getCount() {
            return myItems.size();
        }

        public Object getItem(int position) {
            return position;
        }

        public long getItemId(int position) {
            return position;
        }

        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder;
            if (convertView == null) {
                holder = new ViewHolder();
                convertView = mInflater.inflate(R.layout.item, null);
                holder.caption = (EditText) convertView
                        .findViewById(R.id.ItemCaption);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }
            //Fill EditText with the value you have in data source
            holder.caption.setText(myItems.get(position).caption);
            holder.caption.setId(position);

            //we need to update adapter once we finish with editing
            holder.caption.setOnFocusChangeListener(new OnFocusChangeListener() {
                public void onFocusChange(View v, boolean hasFocus) {
                    if (!hasFocus){
                        final int position = v.getId();
                        final EditText Caption = (EditText) v;
                        myItems.get(position).caption = Caption.getText().toString();
                    }
                }
            });

            return convertView;
        }
    }

    class ViewHolder {
        EditText caption;
    }

    class ListItem {
        String caption;
    }
}
Frock answered 23/12, 2013 at 11:28 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.