3

だから私はから移入しているListView(を使用してListActivity)を持っていSQLiteDatabaseます。行の ID (PK) をビューにアタッチしようとしているのでonListItemClick、各リスト項目でその ID を使用して処理を実行できます。

View任意のデータをusingに設定してsetTag取得できることを読みましたgetTag(実際にはまだうまく機能していないため、これが問題である可能性があります)。これは、私が使用しているものの簡略化されたバージョンです(簡単/簡潔にするため):

public class Favorites extends ListActivity {   
    public void onCreate(Bundle savedInstanceState){        
        super.onCreate(savedInstanceState);
        FavoritesDB db = FavoritesDB.getInstance(this);     
        Cursor c = db.fetchFavorites();
        startManagingCursor(c);     
        String[] columns = new String[] { "_id" };
        int[] to = new int[] { R.id.word };         
        SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.favorite, c, columns, to);     
        adapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() {
            public boolean setViewValue(View view, Cursor cursor, int columnIndex) {
                view.setTag(cursor.getInt(0));
                return true;
            }
        });
        setListAdapter(adapter);        
    }   
    @Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
        Object wordID = v.getTag();
        Toast.makeText(getBaseContext(), "ID=" + wordID, 1).show();
    }       
}

ListViewが読み込まれ、 が表示されますToastが、常にであるため、 への呼び出し"ID=null"で ID が設定されていないようです (または でプロパティが取得されていません)。ViewBindersetTaggetTag

4

2 に答える 2

2

これは、の実装によって異なりますR.layout.favorite。このレイアウトに子 TextViews を持つ親ビューが含まれている場合、たとえば、設定したタグは TextViews 用であり、から受け取った View v はonListItemClick()親ビューです。以下を使用して、設定した同じビューのタグを確実に受け取る必要があります。

    @Override      
    protected void onListItemClick(ListView l, View v, int position, long id) {
    Object wordID = v.getChild(0).getTag();          
    Toast.makeText(getBaseContext(), "ID=" + wordID, 1).show();      
    }    
于 2011-12-05T11:09:41.347 に答える
0

おそらく、アダプターからカーソルを取得する必要があります。このようにして、カーソルが置き換えられても、まだ有効なカーソルを取得しています。

@Override
    protected void onListItemClick(ListView l, View v, int position, long id) {
       Cursor cursor =  adapter.getCursor();
       cursor.moveToPosition(position);
       String id = cursor.getString(cursor.getColumnIndex("primary key field name in database");
       Toast.makeText(getBaseContext(), "ID=" + id, 1).show();
    } 

注:SimpleCursorAdapterアダプターは、ダウンキャストする必要がある別の 方法として宣言する必要があります。

于 2011-12-05T11:04:55.390 に答える