0
votes

I have a couple of AutocompleteTextView as items in ListView; these items are dynamically loaded using Custom adapter. When an item is selected in the AutoCompleteTextView, I need to update another TextView which is on the same row as the AutoCompleteTextView. I'm having trouble identifying position of AutoCompleteTextView where an item was selected. Any pointers would be appreciated:

My Activity looks like this, where Listview is defined:

<ListView
            android:id="@+id/listview_orders"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            />

ListView Items are defined in another layout file as:

<?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:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

    <AutoCompleteTextView
        android:id="@+id/product_code_row_item"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="2"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"

        android:ems="10" />

    <AutoCompleteTextView android:id="@+id/product_name_row_item"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="3"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        />

    <TextView android:id="@+id/product_size_row_item"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="2"
        />



</LinearLayout>

ListView adapter is being set as below:

ListView view = (ListView) findViewById(R.id.listview_orders);
        ListViewItemAdapter adapter = new ListViewItemAdapter(this, orderItems, prodCodeList, prodNameList);
        view.setAdapter(adapter);

Custom Adapter getView method implementation is as follows:

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

        if (convertView == null) {
            LayoutInflater inflater = activity.getLayoutInflater();
            convertView = inflater.inflate(R.layout.order_list_row, null);
        }
        AutoCompleteTextView  productCode = (AutoCompleteTextView ) convertView.findViewById(R.id.product_code_row_item);
        AutoCompleteTextView productName = (AutoCompleteTextView) convertView.findViewById(R.id.product_name_row_item);

        TextView productSize = (TextView) convertView.findViewById(R.id.product_size_row_item);
        TextView mQty = (TextView) convertView.findViewById(R.id.product_mqty_row_item);




        OrderItem orderItem = (OrderItem)orderItemList.get(position);

        productCode.setText(orderItem.getProductCode());
        productCode.setTag(position);

        productName.setText(orderItem.getDescription());
        productName.setTag(position);

        productSize.setText(orderItem.getProductSize());



        //Setting up autocorrect adapter for product codes
        ArrayAdapter<String> adapter = new ArrayAdapter<String>
                (activity, android.R.layout.select_dialog_item, prodCodeList);
        //Getting the instance of AutoCompleteTextView

        productCode.setThreshold(1);//will start working from first character
        productCode.setAdapter(adapter);//setting the adapter data into the AutoCompleteTextView
        productCode.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View arg1, int pos,
                                    long id) {
                Toast.makeText(OrderApplication.getCustomAppContext(), (CharSequence)parent.getItemAtPosition(pos), Toast.LENGTH_LONG).show();


                int itemPosition = (Integer) arg1.getTag();

                //loadOrderItem(newOrderItem, (String) parent.getItemAtPosition(pos), true);
            }
        });

        //Setting up autocorrect adapter for product names
        adapter = new ArrayAdapter<String>
                (activity, android.R.layout.select_dialog_item, prodNameList);
        //Getting the instance of AutoCompleteTextView

        productName.setThreshold(2);//will start working from first character
        productName.setAdapter(adapter);//setting the adapter data into the AutoCompleteTextView

        return convertView;
    }
2
Try: LinearLayout itemRoot = (LinearLayout) parent.getParent(); AutoCompleteTextView productName = (AutoCompleteTextView) itemRoot.findViewById(R.id.product_name_row_item); inside your onItemClick() for AutoCompleteTextView [productCode].. Hope that helps!i_A_mok
This is throwing exception...neodapi
Could you update your code? Also where and what exception occurs?i_A_mok
Hi @I_A_Mok, Thanks for checking-in. Here's code snippet: Toast.makeText(OrderApplication.getCustomAppContext(), (CharSequence)parent.getItemAtPosition(pos), Toast.LENGTH_LONG).show(); Object temp = parent.getParent(); LinearLayout itemRoot = (LinearLayout)temp; AutoCompleteTextView productName = (AutoCompleteTextView) itemRoot.findViewById(R.id.product_name_row_item); temp is of type android.widget.PopupWindow$PopupBackgroundView. It throws exception in type casting to LinearLayoutneodapi

2 Answers

0
votes

you should use -

adapter.getItem(pos)

inside your onItemClick

0
votes

I found a workaround to get reference of AutoCompleteTextView in listview.

holder.productCodeView.setOnFocusChangeListener(new View.OnFocusChangeListener() {
        public void onFocusChange(View v, boolean hasFocus) {
            if(hasFocus) {
                currentFocusView = v;
            }

        }
    });

    holder.productCodeView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View arg1, int pos, long id) {


            if (currentFocusView != null) {
                int iPosition = (Integer) currentFocusView.getTag();

            }


        }
    });