Ich habe also ein benutzerdefiniertes ListView-Objekt. Die Listenelemente haben zwei übereinander gestapelte Textansichten sowie einen horizontalen Fortschrittsbalken, den ich verbergen möchte, bis ich tatsächlich etwas tue. Ganz rechts befindet sich ein Kontrollkästchen, das ich nur anzeigen möchte, wenn der Benutzer Aktualisierungen in seine Datenbank (en) herunterladen muss. Wenn ich das Kontrollkästchen deaktiviere, indem ich die Sichtbarkeit auf Visibility.GONE setze, kann ich auf die Listenelemente klicken. Wenn das Kontrollkästchen sichtbar ist, kann ich nur auf die Kontrollkästchen in der Liste klicken. Ich habe etwas gesucht, aber nichts gefunden, was für meine aktuelle Situation relevant ist. Ich habe diese Frage gefundenIch verwende jedoch einen überschriebenen ArrayAdapter, da ich ArrayLists verwende, um die Liste der Datenbanken intern zu enthalten. Muss ich nur die LinearLayout-Ansicht abrufen und einen onClickListener hinzufügen, wie es Tom getan hat? Ich bin mir nicht sicher.
Hier ist das XML-Listenlayout für die Listenansicht:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:padding="6dip">
<LinearLayout
android:orientation="vertical"
android:layout_width="0dip"
android:layout_weight="1"
android:layout_height="fill_parent">
<TextView
android:id="@+id/UpdateNameText"
android:layout_width="wrap_content"
android:layout_height="0dip"
android:layout_weight="1"
android:textSize="18sp"
android:gravity="center_vertical"
/>
<TextView
android:layout_width="fill_parent"
android:layout_height="0dip"
android:layout_weight="1"
android:id="@+id/UpdateStatusText"
android:singleLine="true"
android:ellipsize="marquee"
/>
<ProgressBar android:id="@+id/UpdateProgress"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:indeterminateOnly="false"
android:progressDrawable="@android:drawable/progress_horizontal"
android:indeterminateDrawable="@android:drawable/progress_indeterminate_horizontal"
android:minHeight="10dip"
android:maxHeight="10dip"
/>
</LinearLayout>
<CheckBox android:text=""
android:id="@+id/UpdateCheckBox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout>
Und hier ist die Klasse, die die ListActivity erweitert. Offensichtlich befindet es sich noch in der Entwicklung. Verzeihen Sie also die Dinge, die fehlen oder möglicherweise herumliegen:
public class UpdateActivity extends ListActivity {
AccountManager lookupDb;
boolean allSelected;
UpdateListAdapter list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
lookupDb = new AccountManager(this);
lookupDb.loadUpdates();
setContentView(R.layout.update);
allSelected = false;
list = new UpdateListAdapter(this, R.layout.update_row, lookupDb.getUpdateItems());
setListAdapter(list);
Button btnEnterRegCode = (Button)findViewById(R.id.btnUpdateRegister);
btnEnterRegCode.setVisibility(View.GONE);
Button btnSelectAll = (Button)findViewById(R.id.btnSelectAll);
btnSelectAll.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
allSelected = !allSelected;
for(int i=0; i < lookupDb.getUpdateItems().size(); i++) {
lookupDb.getUpdateItem(i).setSelected(!lookupDb.getUpdateItem(i).isSelected());
}
list.notifyDataSetChanged();
// loop through each UpdateItem and set the selected attribute to the inverse
} // end onClick
}); // end setOnClickListener
Button btnUpdate = (Button)findViewById(R.id.btnUpdate);
btnUpdate.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
} // end onClick
}); // end setOnClickListener
lookupDb.close();
} // end onCreate
@Override
protected void onDestroy() {
super.onDestroy();
for (UpdateItem item : lookupDb.getUpdateItems()) {
item.getDatabase().close();
}
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
UpdateItem item = lookupDb.getUpdateItem(position);
if (item != null) {
item.setSelected(!item.isSelected());
list.notifyDataSetChanged();
}
}
private class UpdateListAdapter extends ArrayAdapter<UpdateItem> {
private List<UpdateItem> items;
public UpdateListAdapter(Context context, int textViewResourceId, List<UpdateItem> items) {
super(context, textViewResourceId, items);
this.items = items;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = null;
if (convertView == null) {
LayoutInflater li = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = li.inflate(R.layout.update_row, null);
} else {
row = convertView;
}
UpdateItem item = items.get(position);
if (item != null) {
TextView upper = (TextView)row.findViewById(R.id.UpdateNameText);
TextView lower = (TextView)row.findViewById(R.id.UpdateStatusText);
CheckBox cb = (CheckBox)row.findViewById(R.id.UpdateCheckBox);
upper.setText(item.getName());
lower.setText(item.getStatusText());
if (item.getStatusCode() == UpdateItem.UP_TO_DATE) {
cb.setVisibility(View.GONE);
} else {
cb.setVisibility(View.VISIBLE);
cb.setChecked(item.isSelected());
}
ProgressBar pb = (ProgressBar)row.findViewById(R.id.UpdateProgress);
pb.setVisibility(View.GONE);
}
return row;
}
} // end inner class UpdateListAdapter
}
edit: Ich habe immer noch dieses Problem. Ich betrüge und füge den Textansichten onClick-Handler hinzu, aber es scheint äußerst dumm, dass meine onListItemClick () -Funktion überhaupt nicht aufgerufen wird, wenn ich nicht auf mein Kontrollkästchen klicke.
quelle
Wenn sich ImageButton im Listenelement befindet, sollten Sie den
descendantFocusability
Wert im Element des Stammlistenelements auf 'blocksDescendants' setzen.Und die
focusableInTouchMode
Flaggetrue
in derImageButton
Ansicht.quelle
Ich habe ein ähnliches Problem festgestellt und festgestellt, dass die CheckBox in einer ListView ziemlich pingelig ist. Was passiert, ist, dass es dem gesamten ListItem seinen Willen auferlegt und den onListItemClick überschreibt. Möglicherweise möchten Sie dafür einen Klick-Handler implementieren und die Texteigenschaft auch für die CheckBox festlegen, anstatt die TextViews zu verwenden.
Ich würde sagen, schauen Sie sich auch dieses View-Objekt an, es funktioniert möglicherweise besser als die CheckBox
Überprüfte Textansicht
quelle
Verwenden Sie diese Zeile in der Stammansicht des Listenelements
android: descantFocusability = "blocksDescendants"
quelle