3

(ListActivity 사용)이 SQLiteDatabase에서 채워집니다. 각 행의 onListItemClick 항목에 ID (PK)를 첨부하여 해당 ID로 작업을 수행 할 수 있습니다.SimpleCursorAdapter 및 ViewBinder - 클릭시 검색 할 ListView 항목에 데이터 바인딩

나는 임의의 데이터를 을 사용하여 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는 아닙니다 분명히 을 호출하거나 getTag이라는 속성을 검색하지 않는 경우 ViewBinder으로 설정됩니다.

+0

무엇을하려고합니까? – confucius

+0

onListItemClick, 목록 항목 (이 예제에서는 데이터를 할당 한 SQLite 행의 ID (기본 키))에 할당 된 임의의 데이터 조각으로 작업 할 수 있기를 원합니다. – momo

답변

2

이것은 구현시 R.layout.favorite에 따라 다릅니다. 이 레이아웃이있는 경우 예를 들어 하위 TextViews가있는 상위보기가 포함되어 있습니다. onListItemClick()에서받은 View v가 상위 View 인 동안 설정 한 태그는 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 parent로 설정할 수있는 방법이 있습니까? 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로 선언해야합니다.