我正在尝试填充列表视图,其中行包含复选框,四个文本视图和两个微调器。每行上的微调器中的值需要不同,因为它们与该行上的实际项直接相关。只是为了使它变得更复杂一点,除非选中复选框,否则微调器和它们旁边的两个文本字段是不可见的(setVisibility(View.GONE))。我只希望列表项可点击(而不是复选框),并且一旦显示,微调器就需要点击。
我的所有代码都正常工作,但是当填充微调器时,我将无法单击该行上的列表项。我仍然可以从该行上的微调器中选择值,但触摸该行上的任何其他位置都没有任何作用。有些行不会将数据返回到微调器,并且它们继续正常运行,因此我认为它与连接到微调器的适配器有关。
此外,我知道我将不得不考虑列表视图回收,但我还没有那么远。
我希望有人能在我疯狂之前指出这里出了什么问题。
这是listview xml
<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>
这是行xml
<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>
以下是大部分不相关内容的活动:
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();
}
}
}
提前感谢您提供任何帮助。
答案 0 :(得分:11)
您可以尝试将android:descendantFocussability=blocksDescendants
添加到最顶部的线性布局。这可能会有所帮助。