3

ListViewListActivityを使用)をSQLiteDatabaseから移入しています。私はビューの行のID(PK)を添付しようとしているので、各リスト項目のonListItemClick、私はそのIDで物事を行うことができます。SimpleCursorAdapterとViewBinder - データをリストビューアイテムにバインドしてクリック時に取得する

私は、任意のデータがsetTagを使用してViewに設定し、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ではありません明らかにViewBindersetTagの呼び出しで設定されています(または、getTagのプロパティが取得されていません)。

+0

あなたは何をしようとしていますか:あなたが設定した同じビューのタグを受け取ることを確認する必要がありますか? – confucius

+0

onListItemClick、リスト項目(この例では、データを割り当てたSQLite行のID(主キー))に割り当てられた任意のデータで作業する必要があります。 – momo

答えて

2

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

@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();  
    }  
+0

これは有望です。あなたが正しいです、お気に入りのレイアウトは、子のtextviewsと直線レイアウトです。クリックで子を取得するのではなく、(ViewBinderの)タグをtextviewではなくlinearlayoutの親に設定する方法はありますか? ViewBinderが「メイン」コンテナの代わりにそれを子に設定する理由はありますか? – momo

+0

ViewBinderがそれを子に設定するのは、アダプターがカーソル列からビュー "to"を塗りつぶすたびにViewBinderが実行されるためです。 ViewBinderで 'view.setTag(cursor.getInt(0));' 'view.getParent()。setTag(cursor.getInt(0));'を使ってこれを行うことができると思います。 –

+1

カスタムアダプターがありますが、あなたが与えた情報は、それを稼働させるだけでなく(あなたの答えも同様です) - 貴重なものです。 – momo

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として宣言する必要があります。

関連する問題