Ich habe überall nach einer Lösung dafür gesucht, aber ich kann nicht herausfinden, wie ich es implementieren kann. Meine OnItemClickListener
wurde in meinen ListView
-Zeilen irgendwie deaktiviert, da ich im Zeilenlayout eine ImageButton
habe, die den Fokus übernimmt. Es gab zahlreiche Fragen, die ich gefunden habe, aber keine davon hat mich irgendwohin gebracht.
Ich habe diese Frage überprüft, aber ich konnte nicht wirklich Köpfe oder Schwänze daraus machen. Ich brauche nur einen Weg, um die Zeilen anklickbar zu machen, damit ich erkennen kann, wann eine Zeile gedrückt wird. Langes Drücken und Fokus funktionieren gut.
Fügen Sie statt eines OnItemClickListener - einen OnClickListener zu jeder der von Ihrem Adapter zurückgegebenen Ansichten hinzu. Sie müssen setItemsCanFocus
verwenden, um Ihre Liste einzurichten:
ListView list = (ListView) findViewById(R.id.myList);
list.setAdapter(new DoubleClickAdapter(this));
list.setItemsCanFocus(true);
und dann in Ihrer Adapter getView
ergibt sich eine anklickbare Zeile. Es wird angenommen, dass sich die Schaltfläche in der aufgeblasenen XML befindet.
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = View.inflate(context, R.layout.cell, null);
view.setClickable(true);
view.setFocusable(true);
view.setBackgroundResource(Android.R.drawable.menuitem_background);
view.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
new AlertDialog.Builder(context).setTitle("touched").show();
}
});
return view;
}
setze dein ImageButton
Attribut:
Android:focusable="false"
Weil AbsListView.onTouchEvent
child.hasFocusable()
überprüft.
Ich habe die folgende Lösung auf den SDK-Leveln 8 und 16 getestet.
In getView()
setFocusable(false);
setClickable(false);
anstatt sie in der getView()
des Adapters auf true zu setzen, wird die ursprüngliche Frage erfüllt und bedeutet, dass ein OnItemClickListener
aufgerufen wird, sofern in getView()
kein OnClickListener
festgelegt ist.
Ich gehe davon aus, dass alles, was Sie in der OnClickListener
einer Ansicht tun können, Sie genauso einfach in der ListView
einer OnItemClickListener
tun können. (setOnClickListener
in einer Ansicht legt implizit fest, dass auf die Ansicht geklickt werden kann, wodurch anscheinend verhindert wird, dass der entsprechende ListView
der OnItemClickListener
aufgerufen wird.)
Das Verhalten entspricht dem visuellen Status von ImageButton
, wenn das Element gedrückt oder über das Element gefahren wird.
Die Lösung ist insofern eine kleine Illusion, als es sich bei dem gedrückten Listenelement nicht um das ImageButton
selbst handelt. Wenn die Schaltfläche also nicht das gesamte Listenelement belegt, spiegelt das Klicken auf eine andere Stelle im Element weiterhin den Zeichenstatus der Schaltfläche wider . Gleiches gilt für den Fokus. Das könnte einen Preis wert sein.
Das wird definitiv funktionieren. Fügen Sie dies der Layoutdefinition hinzu.
Android:descendantFocusability="blocksDescendants"
Die Lösung gefunden hier
am besten tun Sie dies:
Android:focusable="false"
Android:focusableInTouchMode="false"
legen Sie diese Eigenschaften für Imagebutton
fest und versuchen Sie es mit ..__
Eine Alternative zum Festlegen eines OnClickListener
für jede Ansicht besteht darin, KEIN ImageButton
zu verwenden. Verwenden Sie stattdessen ein ImageView
. Die ImageView
kann immer noch Ereignisse an eine OnClickListener
senden und übernimmt nicht den Fokus.
Für meine Version dieses Problems bestand das Problem darin, dass ich mein TextView
-Objekt auf Android:inputType="textMultiLine"
gesetzt hatte. Als ich diese Zeile entfernte, war das Problem der Liste nicht anklickbar. Sieht aus wie ein böser kleiner Fehler.
Außerdem kann ich die Android:minLines/Android:maxLines
-Eigenschaften ohne Probleme verwenden, daher ist dies kein großes Problem. Nur nicht die Lösung, die ich erwartet hatte.
Als alternative Lösung, die für mich funktioniert hat, können Sie versuchen, Ihren Adapter um BaseAdapter
zu erweitern (iso implementiert ListAdapter
interface).
Die folgende Zeile hat das Problem in meinem Projekt gelöst:
<TextView ... Android:textIsSelectable="false" />
Ich habe die Unterklasse ImageButton
und setFocusable="false"
in der Layoutdefinition für mich nicht funktioniert. Es wurde der Aufruf von setFocusable(false)
im Konstruktor der Unterklasse behoben.
Setzen Sie diesen Code ImageView nextpage= (ImageView)findViewById(R.id.btnEdit);
anstelle von ImageButton
. Jetzt ist das Listenelement aktiv
listView= (ListView) findViewById(R.id.listview_names);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
{
Toast.makeText(getBaseContext(),"Clicked Button",Toast.LENGTH_LONG).show();
Log.d("h","clicked");
/* Intent intent=new Intent(MainActivity.this,Display_data.class);
intent.putExtra("NAME",n);
intent.putExtra("AGE",a);
startActivity(intent);*/
}
});
Ja, dieser Toast funktioniert nicht