Zuweisen von ID zu einer Reihe in einem Android Listview
-
27-09-2019 - |
Frage
Ich habe eine Listview. Wenn ein Element auf dem Listview abgegriffen wird, lädt es ein SubView. Ich will eine ID an jede Zeile des Listview zuzuweisen, so dass die I-ID zusammen mit dem SubView passieren kann. Wie ordne ich eine bestimmte ID für jede Zeile in der Listview?
Hier ist, wie ich zur Zeit das Listview bin Laden:
setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item, mArrayList));
Lösung
Hier ist, wie ich das Problem gelöst. Ich habe die employee_ids und employee_names aus dem lokalen SQLite-Datenbank, dann habe ich eine Arraylist von employeeNamesArray erstellt und eine Arraylist von employeeIdArray zugleich. Somit würden die employeeIdArray [0] mit employeeNameArray match [0], employeeIdArray [1] würde mit employeeNameArray entspricht [1], usw.
Nachdem die Arraylisten erstellt wurden, fütterte ich employeeNameArray in die Listview.
Später in onListItemClick, retreive ich die Position der Listview-Reihe ausgewählt. Diese ‚Position‘ in die Position in den Arraylisten corrospond wird - also, wenn ich die erste Zeile in der Listview wählen, wird die Position Null, und employeeNameArray [0] Begegnungen mit employeeIdArray [0] sein. Ich packe den coroloating Eintrag von employeeIdArray und Push, dass auf die nächste Aktivität von putExtra verwendet wird.
public class MyFirstDatabase extends ListActivity {
ArrayList<String> employeeIdArray = new ArrayList<String>(); // List of EmployeeIDs
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Open the database
SQLiteDatabase db;
db = openOrCreateDatabase("mydb.db",SQLiteDatabase.CREATE_IF_NECESSARY, null);
db.setVersion(1);
db.setLocale(Locale.getDefault());
db.setLockingEnabled(true);
// Query the database
Cursor cur = db.query("employee", null, null, null, null, null, "employee_lastname");
cur.moveToFirst(); // move to the begin of the db results
ArrayList<String> employeeNameArray = new ArrayList<String>(); // Initialize mArrayList
while (cur.isAfterLast() == false) {
employeeNameArray.add(cur.getString(1)); // add the employee name to the nameArray
employeeIdArray.add(cur.getString(0)); // add the employee id to the idArray
cur.moveToNext(); // move to the next result set in the cursor
}
cur.close(); // close the cursor
// put the nameArray into the ListView
setListAdapter(new ArrayAdapter<String>(this,R.layout.list_item,employeeNameArray));
ListView lv = getListView();
lv.setTextFilterEnabled(true);
}
protected void onListItemClick(ListView l, View v, final int position, long id) {
super.onListItemClick(l, v, position, id);
Intent myIntent = new Intent(this, SubView.class); // when a row is tapped, load SubView.class
Integer selectionID = Integer.parseInt(employeeIdArray.get(position)); // get the value from employeIdArray which corrosponds to the 'position' of the selected row
myIntent.putExtra("RowID", selectionID); // add selectionID to the Intent
startActivityForResult(myIntent, 0); // display SubView.class
}
}
Andere Tipps
Hallo Chris Sie bereits die Position ID in Ihrem Listview haben, implementieren die onListItemClick () Funktion.
protected void onListItemClick(ListView l, View v, final int position, long id) {
super.onListItemClick(l, v, position, id);
Toast.makeText(this, "my id to pass along the subview is " + position,Toast.LENGTH_LONG).show();
}
Wenn Sie Ihre eigene ID verwenden setTag assing ()
v.setTag("myownID"+position);
Sie können das nicht mit einem Standard- ArrayAdapter müssen, um die ArrayAdapter zu erweitern und überschreiben die GetItemID () Methode und vielleicht auch die hasStableIds () Methode.
Sie müssen dann in der hasStableIds Methode true zurück, und Ihre ID für das Element an der Position zu erzeugen, die auf Ihre GetItemID Methode gegeben ist.
Nach Stunden auf diesen Ausgaben, diese einfachste Weg, ich fand, war Bindview des Adapters außer Kraft zu setzen und einen Tag-Wert gesetzt die Zeile des _id auf dem Objekt vorkommt - in meinem Fall war es eine Schaltfläche in der Listview-Zeile
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
R.layout.note, cursor, fromColumns, toViews, 0) {
@Override
// add the _id field value to the button's tag
public void bindView(View view, Context context, Cursor cursor) {
super.bindView(view, context, cursor);
Integer index = cursor.getColumnIndex("_id");
Integer row_id = cursor.getInt(index);
Button button = (Button) view.findViewById(R.id.button_delete_record);
button.setTag(row_id);
}
};