Attribution d'ID à une ligne dans un Android ListView
-
27-09-2019 - |
Question
J'ai un ListView. Lorsqu'un élément sur le ListView est exploité, il charge un sous-vue. Je veux attribuer un identifiant à chaque ligne de ListView, donc je peux passer cet ID le long de la sous-vue. Comment puis-je attribuer un identifiant spécifique à chaque ligne dans le ListView?
Voici comment je chargeais actuellement le ListView:
setListAdapter(new ArrayAdapter<String>(this, R.layout.list_item, mArrayList));
La solution
Voici comment je résolu le problème. Je suis les employee_ids et employee_names de la base de données SQLite locale, alors je créé un ArrayList de employeeNamesArray et un ArrayList de employeeIdArray en même temps. Ainsi, le employeeIdArray [0] correspondrait à employeeNameArray [0], employeeIdArray [1] correspondrait à employeeNameArray [1], etc.
Une fois que les ArrayLists ont été créés, je nourris employeeNameArray dans le ListView.
Plus tard, en onListItemClick, je retreive la position de la ligne ListView sélectionnée. Cette « position » sera correpondre à la position dans les ArrayLists - donc, si je sélectionne la première ligne dans la ListView, la position sera égal à zéro, et employeeNameArray [0] matchs avec employeeIdArray [0]. Je prends l'entrée coroloating de employeeIdArray et pousser à l'autre que l'activité en utilisant putExtra.
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
}
}
Autres conseils
Salut Chris vous avez déjà l'identifiant de position dans votre listView, mettre en œuvre la fonction onListItemClick ().
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();
}
si vous voulez assing votre propre usage identifiant setTag ()
v.setTag("myownID"+position);
Vous ne pouvez pas le faire avec une norme ArrayAdapter Vous nécessité d'étendre le ArrayAdapter et remplacer le getItemID () méthode et peut-être aussi le hasStableIds () < procédé / a>.
Vous devez ensuite revenir vrai dans la méthode hasStableIds et générer votre identifiant pour l'élément à la position qui est donnée à votre méthode GetItemID.
Après avoir passé des heures à ce sujet, cette façon la plus facile que j'ai trouvé pour remplacer Bindview de l'adaptateur et définir une valeur d'étiquette contenant la _id de la ligne sur la question - dans mon cas, il était un bouton dans la rangée ListView
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);
}
};