Ich habe eine Listenansicht mit Text und Schaltfläche in jeder Zeile, Listenansicht setOnItemClickListener () funktioniert nicht. Ist es möglich, Elementklick- und Schaltflächenklickereignisse unterschiedlich zu behandeln (Elementklick sollte ActivityA aufrufen und Schaltflächenklick sollte ActivityB aufrufen). Hat jemand eine Lösung
private ArrayList<String> userIDArr = null;
private ArrayList<String> userNameArr = null;
private DatabaseHelper dbHelper = null;
private ListView userListView=null;
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.list_view);
dbHelper = new DatabaseHelper(this.getApplicationContext());
Map<String,ArrayList<String>> displayMap = dbHelper.getUserListToDisplay();
userIDArr = displayMap.get("UserID");
userNameArr = displayMap.get("FirstName1");
userListView = (ListView) findViewById(R.id.listView2);
userListView.setAdapter(new UserListAdapter(this,userIDArr));
userListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
Toast.makeText(usersListActivity.this,
"Item in position " + position + " clicked", Toast.LENGTH_LONG).show();
}
});
}
public class UserListAdapter extends ArrayAdapter<String>
{
Activity context;
public UserListAdapter(Activity context, ArrayList<String> names) {
super(context, R.layout.list_item, names);
this.context = context;
}
private class ViewHolder {
public TextView UserNameAndID;
public TextView Description;
public Button UploadBtn;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
View rowView = convertView;
if (rowView == null) {
LayoutInflater inflater = context.getLayoutInflater();
rowView = inflater.inflate(R.layout.list_item, null, true);
holder = new ViewHolder();
holder.UserNameAndID = (TextView) rowView.findViewById(R.id.User_detailsTxt);
holder.Description = (TextView) rowView.findViewById(R.id.User_status);
holder.UploadBtn = (Button) rowView.findViewById(R.id.uploadbutton);
holder.UploadBtn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Toast.makeText(usersListActivity.this," Button clicked",Toast.LENGTH_SHORT).show();
}
});
rowView.setTag(holder);
} else {
holder = (ViewHolder) rowView.getTag();
}
String s = userNameArr.get(position)+","+userIDArr.get(position);
holder.UserNameAndID.setText(s);
holder.Description.setText("U r in middle");
return rowView;
}
}
}`
android:focusableInTouchMode="false"
löst meine. Ich verwende zwei TextView in einer benutzerdefinierten LinearLayout-Zeile. Yuk Android ...Manchmal kann die Liste den Click Listener immer noch nicht zum Bestehen bringen. In diesem Fall müssen Sie möglicherweise ein weiteres Attribut hinzufügen.
Dieses Attribut muss dem obersten Layout Ihres XML hinzugefügt werden, in dem Sie die ListView-Elemente bereitgestellt haben.
quelle
Wenn Ihre Listenansicht eine aktive Ansicht / fokussierbare Ansicht enthält, wird diese deaktiviert
onItemClickListener
. Sie können versuchen, sie nicht fokussierbar zu machen, indem Sie Folgendes hinzufügen:android:focusable="false"
zu jeder Ansicht, die normalerweise fokussierbar ist.quelle
Die Sache mit dem Teig ist, sowohl
Listener
das GanzerowView
als auch dasButton
Innere zu ergänzenAdapter
. Etwas wie das.quelle
Versuchen Sie setzen
setClickable(false)
für jedenButton
,ImageButton
usw. undView
wie folgt aus :Auch muss man hinzufügen
zum Hauptlayout (erste Ebene)
quelle
Anstatt eine Schaltfläche hinzuzufügen
ImageView
, fügen Sie einensetOnItemClcik
Listener hinzu, der gut funktionieren würde.quelle
Ich bekomme auch den gleichen Fehler. Wenn Sie im Listenlayout eine Schaltfläche haben, durch die Sie diese ersetzen können, z.
TextView
B.ImageButton
durchImageView
. Als Referenz ist mein Code:Denken Sie auch daran, das Listenlayout so zu gestalten,
android:focussable="true"
wie es für diese Schaltfläche / Textparameter verwendet wirdandroid:focussable="false"
.quelle
In
android:focusable="false"
Attribut - Taste und zu übergeordnetem Ansicht Add -android:descendantFocusability="blocksDescendants"
Attribute wie diese.quelle
Es ist erstaunlich zu bemerken, dass die Änderung von XML dazu führt, dass der in Java angeklickte Satz für mich funktioniert.
quelle
Machen Sie das übergeordnete anklickbare Attribut wie folgt auf false
android:clickable="false"
.Wieder vor dem Problem, dann fügen Sie für alle untergeordneten Ansichten dieses anklickbare Falsch hinzu.
quelle
Ich weiß nicht genau warum, aber manchmal, wenn Sie den Adapter einstellen, werden die Listener gelöscht. Dann müssen Sie
setOnClickListener
nachsetAdapter
oder anrufensetListAdapter
.quelle
android:clickable="true"
Aus der internen Kundenansicht aus dem entfernenListView
.quelle