4

SimpleCursorAdapterViewBinder이있는보기를 설정하고 ImageButtonViewBinder에 넣고 싶지만 onClick 이벤트를 설정하는 방법을 모르겠습니다. MySimpleCursorAdapter을 만들고 거기에 넣어야합니까, 아니면 ViewBinder 클래스에 써야합니까? 나는ViewBinder의 ImageButton에 onClick 수신기를 설정하는 방법은 무엇입니까?

public class ChannelPoster { 
    private Bitmap poster; 
    private String channel; 
    private String path; 
    private String dblink; 

    public ChannelPoster(Bitmap pi, String c, String p, String d) { 
     poster = pi; 
     channel = c; 
     path = p; 
     dblink = d; 
    } 

    public Bitmap getPoster() { return poster; } 
    public String getChannel() { return channel; } 
    public String getPath() { return path; } 
    public String getDBlink() { return dblink; } 
} 

ChannelDB.java 데이터베이스 방법 1 : ListView`에있는 항목을 나타내는

public class ChannelViewBinder implements SimpleCursorAdapter.ViewBinder { 
     public boolean setViewValue(View view, final Cursor cursor, int columnIndex) { 

       if(view instanceof ImageView) { 
         ImageView iv = (ImageView) view; 
         byte[] img = cursor.getBlob(columnIndex); 
         iv.setImageBitmap(BitmapFactory.decodeByteArray(img, 0, img.length)); 
         return true; 
       } 

       if(view instanceof ImageButton) { 
         ImageButton ib = (ImageButton) view; 
         ib.setOnClickListener(new View.OnClickListener() {  
          @Override 
          public void onClick(View v) { 
           String dblink = cursor.getString(cursor.getColumnIndex(ChannelDB.KEY_DBLINK)); 
           Intent intent = new Intent(); 

           Bundle bundle = new Bundle(); 
           bundle.putString("dblink",dblink); 
           intent.putExtras(bundle); 
           } 
          }); 

       } 
       return false; 
     } 
} 

ChannelPoster.java :

ViewBinder.java : 여기

내 코드입니다 관련 부분 만 게시 :

public void createchannelEntry(ChannelPoster channel) { 
     openDB(); 
     ByteArrayOutputStream out = new ByteArrayOutputStream(); 
     channel.getPoster().compress(Bitmap.CompressFormat.PNG, 100, out); 
     ContentValues cv = new ContentValues(); 
     cv.put(KEY_POSTER, out.toByteArray());    
     cv.put(KEY_CHANNEL, channel.getChannel()); 
     cv.put(KEY_DBLINK, channel.getDBlink()); 
     cv.put(KEY_PATH, channel.getPath()); 
     mDb.insert(channelS_TABLE, null, cv); 
     closeDB(); 
    } 

마지막으로 목록 , Tv.java는 :

ListView channellist = (ListView) findViewById(android.R.id.list); 
     mDB = new ChannelDB(this); 

     String[] columns = {mDB.KEY_ID, mDB.KEY_POSTER, mDB.KEY_CHANNEL, mDB.KEY_PATH, mDB.KEY_DBLINK}; 
     String table = mDB.channelS_TABLE; 

     Cursor c = mDB.getHandle().query(table, columns, null, null, null, null, null); 

     startManagingCursor(c); 

     SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, 
       R.layout.channelview, 
       c, 
       new String[] {mDB.KEY_POSTER, mDB.KEY_CHANNEL, mDB.KEY_DBLINK}, 
       new int[] {R.id.poster, R.id.channel, R.id.douban}); 

     adapter.setViewBinder(new ChannelViewBinder()); 

     channellist.setAdapter(adapter); 

이 도움이된다면 내가 항목을 추가하는 방법입니다 :

mDB.createchannelEntry(new ChannelPoster(image, "name" ,"link" ,"link")); 

그냥 말해 더 많은 코드를 필요로합니다.

답변

0

편집 :

내 이전 대답을 스크래치. 좋아하는 별을 연속으로 토글 한 후 스크롤 할 때 버그가 발생했습니다. 나는 그것이 재생되고있는 방법이나 무엇인가와 관련이 있다고 생각한다.

대신, 난 여전히 to의 스타 ImageViewresource idfrom 내 SQLite는 열 favorite을 통과합니다. 그런 다음 나는 extend SimpleCursorAdapter@Override bindView입니다. super을 호출 한 다음 view.findViewById을 사용하여 ImageView 핸들을 가져오고 viewbindView에 전달 된 매개 변수 중 하나입니다. 이 핸들을 사용하여 적절한 드로어 블 (별 채움 또는 채움 없음)을 조건부로 설정하고 clickListener을 설정할 수있었습니다.

원래 답 :

내 경우는 간단하지만 유사한, 그래서 내가 무슨 짓을 게시합니다. 사용자가 행을 좋아할 수있는 별이 필요했기 때문에 ImageView을 사용했습니다. 내 from에서 SQLite 열 favorite을 전달하고 내 to에 의 resource Id을 전달합니다.

SimpleCursorAdapter.setViewBinder을 사용하여 추가 한 내 SimpleCursorAdapter.ViewBinder()에는 setViewValue을 오버로드했습니다. 그 다음 을 사용하여 setViewValue에 전달 된 index 값을 테스트합니다. 같으면 click listenersetViewValue에 전달 된 view 매개 변수로 설정합니다. 데이터베이스에있는 favorite의 값에 따라 ((ImageView) view).setImageResource()을 사용하여 ImageView을 적절하게 전환합니다.그런 다음 청취자에게 (OrmLite를 개인적으로 사용하여) 데이터베이스의 값을 업데이트합니다.

정확히 어떻게하고 싶지는 않지만 CursorAdapter를 확장하고 모든 것을 직접 처리하는 것보다 쉽지만 작동하는 것 같습니다.

0

SimpleCursorAdapter를 확장 할 필요가없는 경우 onClick 이벤트를 ViewBinder 클래스 내부에 배치 할 수 있습니다. 다음은 내가 한 일입니다.

private class MyViewBinder implements ViewBinder 
{ 
@Override 
public boolean setViewValue(View view, Cursor cursor, int columnIndex) 
{    
     if (columnIndex == cursor.getColumnIndex(COLUMN_NAME_CUSTOM)) 
     { 
      // If the column is COLUMN_NAME_CUSTOM then we use custom view. 
      // The following two lines are needed so that you can still click 
      // elsewhere in the list row to select it 
      view.setFocusable(false); 
      view.setFocusableInTouchMode(false); 
      // Set your onClickListener 
      view.setOnClickListener(new MyListener(someArgument)); 

      return true; 
     } 
     // For other columns, simply return false so that the default binding happens. 
     return false; 
    } 

    // Define your onclicklistener   
    private class MyListener implements OnClickListener 
    { 
     private String someArg = null; 

     // Constructor that lets you pass an argument to the listener 
     public MyListener(String someArg){ 
      this.someArg = someArg; 
     } 

     @Override 
     public void onClick(View v) { 
      //Handle your click event here 
     } 
    } 
}