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));
War es hilfreich?

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);
    }
};
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top