Android onListItemClick does not work when spinners filled in list

I am trying to populate a list where the lines contain a check box, four text boxes and two spinners. The values ​​in the spinners in each row must be different, since they are directly related to the actual item in this row. To make this a bit more complicated, the spinners and the two text boxes next to them are not visible (setVisibility (View.GONE)) if the check box is not selected. I just want the list item to be accessible to the click (not the check box), and the spinners should be available to clicks after they are shown.

All my code works correctly, except that when filling the spinners, I lose the ability to click on the list item on this line. I can still select values ​​from the spinners in this row, but touching anywhere in the row does nothing. There are a few lines that do not return data to the spinners, and they continue to work correctly, so I believe that this is due to the adapters associated with the spinners.

I also know that I will have to consider reworking the list, but I don't have one yet.

Hopefully someone can point out what's wrong here before I go crazy.

Here is the xml list

<ListView android:id="@+id/android:list" android:layout_width="fill_parent" android:layout_height="fill_parent"/> <TextView android:id="@+id/android:empty" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/empty"/> </LinearLayout> 

And here is the xml line

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content"> <CheckBox android:id="@+id/pl_selected" android:layout_width="fill_parent" android:layout_height="wrap_content" android:focusableInTouchMode="false" android:clickable="false" android:focusable="false" android:layout_weight="1"/> <TextView android:id="@+id/name" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" android:focusableInTouchMode="false" android:clickable="false" android:focusable="false"/> <TextView android:id="@+id/name2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" android:focusableInTouchMode="false" android:clickable="false" android:focusable="false"/> </LinearLayout> <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/pl_tv1" android:text="@string/pl_tv1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" android:focusableInTouchMode="false" android:clickable="false" android:focusable="false" android:visibility="gone"/> <Spinner android:id="@+id/pl_spin1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" android:visibility="gone" android:focusableInTouchMode="false" android:focusable="false"/> </LinearLayout> <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content"> <TextView android:id="@+id/pl_tv2" android:text="@string/pl_tv2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" android:focusableInTouchMode="false" android:clickable="false" android:focusable="false" android:visibility="gone"/> <Spinner android:id="@+id/pl_spin2" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" android:visibility="gone" android:focusableInTouchMode="false" android:focusable="false"/> </LinearLayout> </LinearLayout> 

And here is the activity with most irrelevant things:

 import android.widget.SimpleCursorAdapter; import mdhsoft.band.Tab.DbAdapter; import mdhsoft.band.Tab.R; import android.os.Bundle; import android.app.ListActivity; import android.database.Cursor; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.CheckBox; import android.widget.ListView; import android.widget.Spinner; import android.widget.TextView; public class PLActivity extends ListActivity { private static final int DONE_ID = Menu.FIRST; private DbAdapter mDbHelper; private int mPlId; private CheckBox mCheckBox; private Spinner mSpin1; private Spinner mSpin2; private TextView mtv1; private TextView mtv2; private int mItemId; private SimpleCursorAdapter mAllItems; private Cursor mSCursor; private Cursor mcurSpin1; private Cursor mcurSpin2; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.pl_list); Bundle extras = getIntent().getExtras(); mPlId = extras.getInt(DbAdapter.KEY_PLID); mDbHelper = new DbAdapter(this); mDbHelper.open(); fillData(); registerForContextMenu(getListView()); } private void fillData() { mSCursor = mDbHelper.fetchAllPl(mPlId); startManagingCursor(mSCursor); String[] from = new String[] {"pl_selected", DbAdapter.KEY_SNAME, DbAdapter.KEY_SNAME2}; int[] to = new int[]{R.id.pl_selected, R.id.name, R.id.name2}; mAllItems = new SimpleCursorAdapter(this, R.layout.pl_row, mSCursor, from, to); mAllItems.setViewBinder(new SimpleCursorAdapter.ViewBinder() { public boolean setViewValue(View view, Cursor cursor, int columnIndex) { if(columnIndex == 3) { CheckBox cb = (CheckBox) view; cb.setChecked(cursor.getInt(3) > 0); ViewGroup row = (ViewGroup)view.getParent(); if (cursor.getInt(3) > 0) { mcurSpin1 = (Spinner) row.findViewById(R.id.pl_spin1); mcurSpin2 = (Spinner) row.findViewById(R.id.pl_spin2); mtv1 = (TextView) row.findViewById(R.id.pl_tv1); mtv2 = (TextView) row.findViewById(R.id.pl_tv2); mcurSpin1.setVisibility(View.VISIBLE); mtv1.setVisibility(View.VISIBLE); mcurSpin2.setVisibility(View.VISIBLE); mtv2.setVisibility(View.VISIBLE); PopulateSpinner1(); PopulateSpinner2(); } return true; } return false; } }); setListAdapter(mAllItems); } private void PopulateSpinner1(){ mcurSpin1 = mDbHelper.fetchSByItemId(mItemId); startManagingCursor(mcurSpin1); String[] from = new String[]{DbAdapter.KEY_SNAME}; int[] to = new int[]{android.R.id.text1}; SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_spinner_item, mcurSpin1, from, to ); adapter.setDropDownViewResource( android.R.layout.simple_spinner_dropdown_item); mSpin1.setAdapter(adapter); } private void PopulateSpinner2(){ mcurSpin2 = mDbHelper.fetchMByItemId(mItemId); startManagingCursor(mcurSpin2); String[] from = new String[]{DbAdapter.KEY_MNAME}; int[] to = new int[]{android.R.id.text1}; SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_spinner_item, mcurSpin2, from, to ); adapter.setDropDownViewResource( android.R.layout.simple_spinner_dropdown_item); mSpin2.setAdapter(adapter); } @Override protected void onListItemClick(ListView l, View v, int position, long id) { super.onListItemClick(l, v, position, id); ViewGroup row = (ViewGroup)v; mSCursor.moveToPosition(position); mItemId = mSCursor.getInt(mSCursor.getColumnIndex(DbAdapter.KEY_SID)); mCheckBox = (CheckBox) row.findViewById(R.id.pl_selected); mcurSpin1 = (Spinner) row.findViewById(R.id.pl_spin1); mcurSpin2 = (Spinner) row.findViewById(R.id.pl_spin1); mtv1 = (TextView) row.findViewById(R.id.pl_tv1); mtv2 = (TextView) row.findViewById(R.id.pl_tv2); if (mCheckBox.isChecked()) { mCheckBox.setChecked(false); mcurSpin1.setVisibility(View.GONE); mtv1.setVisibility(View.GONE); mcurSpin2.setVisibility(View.GONE); mtv2.setVisibility(View.GONE); } else { mCheckBox.setChecked(true); mcurSpin1.setVisibility(View.VISIBLE); mtv1.setVisibility(View.VISIBLE); mcurSpin2.setVisibility(View.VISIBLE); PopulateSpinner1(); PopulateSpinner2(); } } } 

Thanks in advance for any help you can give.

+6
source share
1 answer

You can try adding android:descendantFocussability=blocksDescendants to the topmost linear layout. This may be helpful.

+11
source

Source: https://habr.com/ru/post/916320/


All Articles