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));
Était-ce utile?

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);

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);
    }
};
scroll top