How to change text of a TextView that are in ListView using setOnKeyListener?

147 Views Asked by At

I have a question. I want to change text in TextView (this TextView is in ListView) using RIGHT DPAD button. I already studied few solutions which are first is setOnClickListener. I guess setOnClickListener cannot be use for keycode since this listener is for touch mode. Also I studied using setOnItemClickListener. From my understanding, this listener is working only when pressing DPAD CENTER only right? And lastly using setOnKeyListener which I not so familiar. I prepare some code below. Could anyone suggest me what's wrong with my code?

java code:

public class ListViewExampleActivity extends Activity {

    String[] items = { "a", "b", "c", "d" };

    String[] itemsParameters = { "1", "2", "3", "4" };

    ListView list;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        populateListView();
    }

    private void populateListView() {

        CustomList adapter = new CustomList(this, items, itemsParameters);
        list = (ListView) findViewById(R.id.ListView);
        list.setAdapter(adapter);
    }

    private class CustomList extends BaseAdapter {
        private final Activity context;
        private final String[] items;
        private final String[] itemsParameters;

        public CustomList(Activity context, String[] items, String[] itemsParameters) {
            super();
            this.context = context;
            this.items = items;
            this.itemsParameters = itemsParameters;
        }

        public class Holder {
            TextView txtitems;
            TextView txtitemsParameters;
        }

        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {

            final Holder holder = new Holder();
            LayoutInflater layoutinflater = context.getLayoutInflater();
            View rowView = null;
            rowView = layoutinflater.inflate(R.layout.text_views_1, null, true);
            holder.txtitems = (TextView) rowView.findViewById(R.id.items);
            holder.txtitemsParameters = (TextView) rowView.findViewById(R.id.itemsParameters);
            holder.txtitems.setText(items[position]);

            rowView.setOnKeyListener(new OnKeyListener() {
                @Override
                public boolean onKey(View v, int keyCode, KeyEvent event) {
                    if (event.getAction() == KeyEvent.ACTION_DOWN) {
                        if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT) {
                            holder.txtitemsParameters.setText(itemsParameters[position]);
                            return true;
                        }
                    }
                    return false;
                }
            });

            return rowView;
        }

        @Override
        public int getCount() {
            return 4;
        }

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

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

activity_main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@color/black"
    android:baselineAligned="true"
    android:orientation="vertical"
    tools:context="com.example.publicmodeexample.MainActivity" >

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/blue"
            android:divider="@color/black"
            android:gravity="center"
            android:text="LIST VIEW"
            android:textColor="@color/white" />

        <ListView
            android:id="@+id/ListView"
            android:layout_width="318dp"
            android:layout_height="wrap_content"
            android:choiceMode="singleChoice"
            android:divider="@color/black"
            android:dividerHeight="1dp"
            android:listSelector="@drawable/text_color_change" >

        </ListView>
    </LinearLayout>

</LinearLayout>

text_views_1.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:paddingLeft="5dp"
    android:paddingRight="5dp" >

    <TextView
        android:id="@+id/items"
        android:layout_width="200sp"
        android:layout_height="wrap_content"
        android:textColor="#FFFFFFFF" />

    <TextView
        android:id="@+id/itemsParameterOpenBracket"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="["
        android:textColor="#FFFFFFFF" />

    <TextView
        android:id="@+id/itemsParameter"
        android:layout_width="100sp"
        android:layout_height="wrap_content"
        android:gravity="end"
        android:textColor="#FFFFFFFF"/>

    <TextView
        android:id="@+id/itemsParameterCloseBracket"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="]"
        android:textColor="#FFFFFFFF" />

</LinearLayout>

@drawable/text_color_change:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/custom_border" android:state_focused="true"/>

</selector>

do I need to add the focusable property? I'm so noob to this property.

0

There are 0 best solutions below