Android benutzerdefiniertes ListView kann nicht auf Elemente klicken

Ich habe also ein benutzerdefiniertes ListView-Objekt. Die Listenelemente haben zwei übereinander gestapelte Textansichten sowie einen horizontalen Fortschrittsbalken, der so lange verborgen bleiben soll, bis ich etwas mache. Ganz rechts ist ein Kontrollkästchen, das nur angezeigt werden soll, wenn der Benutzer Updates in seine database (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 mit Ausnahme der Kontrollkästchen auf nichts in der Liste klicken. Ich habe ein wenig gesucht, aber nichts gefunden, was für meine derzeitige Situation relevant ist. Ich habe diese Frage gefunden , aber ich verwende ein überschriebenes ArrayAdapter, da ich ArrayLists verwende, um die Liste der databaseen intern zu enthalten. Muss ich nur die LinearLayout-Ansicht aufrufen und einen onClickListener wie Tom hinzufügen? Ich bin mir nicht sicher.

Hier ist die Listview-Zeilenlayout-XML:

         

Und hier ist die class, die die ListActivity erweitert. Offensichtlich ist es noch in der Entwicklung, also vergib die Dinge, die fehlen oder liegengelassen werden:

 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 { private List items; public UpdateListAdapter(Context context, int textViewResourceId, List 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ügt den Textansichten onClick-Handler hinzu, aber es scheint extrem dumm zu sein, dass meine onListItemClick () – function überhaupt nicht aufgerufen wird, wenn ich nicht auf meine Checkbox klicke.

Das Problem besteht darin, dass Android Ihnen nicht erlaubt, Listenelemente auszuwählen, die fokussierbare Elemente enthalten. Ich änderte das Kontrollkästchen auf dem Listenelement, um ein Attribut wie folgt zu haben:

 android:focusable="false" 

Nun sind meine Listenelemente, die Kontrollkästchen enthalten (funktionieren auch für Schaltflächen), im herkömmlichen Sinne “auswählbar” (sie leuchten auf, Sie können irgendwo in das Listenelement klicken und der “onListItemClick” -Handler wird ausgetriggers usw.).

BEARBEITEN: Als Update erwähnte ein Kommentator “Nur eine Notiz, nachdem ich die Sichtbarkeit der Schaltfläche geändert hatte, musste ich den Fokus programmatisch wieder deaktivieren.”

Falls Sie ImageButton innerhalb des Listenelements haben, sollten Sie den Wert für den abcendantFocusability-Wert im Blockelement “root” auf “blocksDescendents” setzen.

 android:descendantFocusability="blocksDescendants" 

Und das focusableInTouchMode Flag in der ImageButton Ansicht auf true .

 android:focusableInTouchMode="true" 

Ich hatte ein ähnliches Problem und stellte fest, dass die CheckBox in einem ListView ziemlich knifflig ist. Was geschieht, ist, dass es Willen auf das gesamte ListItem auferlegt, und eine Art überschreibt das onListItemClick. Möglicherweise möchten Sie dafür einen Click-Handler implementieren und auch die Text-Eigenschaft für das Kontrollkästchen festlegen, anstatt die TextViews zu verwenden.

Ich würde sagen, dass Sie in dieses View-Objekt schauen, es funktioniert vielleicht besser als die CheckBox

Überprüfte Textansicht

Verwenden Sie diese Zeile in der Stammansicht des Listenelements

android: descendantFocusability = “blocksDescendants”