Как настроить прослушиватель onClick для ImageButton в ViewBinder? - PullRequest
4 голосов
/ 20 ноября 2011

Я сделал ListView с SimpleCursorAdapter и ViewBinder, чтобы установить для него представления, и я хочу поместить ImageButton в ViewBinder, но не знаю, как установить onClick событие. Должен ли я создать MySimpleCursorAdapter и поместить его туда или я должен написать его в классе ViewBinder?

Вот мой код:

ViewBinder.java

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, представляющие запись в ListView`:

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 база данных одна, я выкладываю только относящуюся часть:

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" ));

Если вам нужно больше кода, просто скажите мне.

Ответы [ 2 ]

0 голосов
/ 27 ноября 2013

Вам не нужно расширять 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
         }
    }
}
0 голосов
/ 26 ноября 2013

Редактировать:

Поцарапать мой предыдущий ответ.Была ошибка при прокрутке вниз после переключения любимой звезды в ряду.Я предполагаю, что это связано с тем, как представления перерабатываются или что-то в этом роде.

Вместо этого я все еще передаю свой столбец SQLite favorite в from и resource id звезды ImageViewв to.Тогда я extend SimpleCursorAdapter и @Override bindView.Я вызываю super, затем получаю дескриптор ImageView, используя view.findViewById, с view, являющимся одним из параметров, передаваемых в bindView.Используя эту ручку, я смог условно установить соответствующий чертеж (звездочка заполнена или не заполнена) и установить clickListener.

Исходный ответ:

Мой случайПроще, но похоже, поэтому я выложу то, что сделалМне нужна была звезда, которая позволяла бы пользователю добавлять строки в избранное, поэтому я использовал ImageView.В моем from я передаю столбец SQLite favorite, а в моем to я передаю resource Id из ImageView.

В моем SimpleCursorAdapter.ViewBinder(), который я добавил с помощью SimpleCursorAdapter.setViewBinder Я переиграл setViewValue.Затем я использую cursor.getColumnIndex("favorite") для проверки значения index, переданного в setViewValue.Если равно, я установил click listener для параметра view, переданного в setViewValue.В зависимости от значения favorite в моей базе данных, я переключаю ImageView соответствующим образом, используя ((ImageView) view).setImageResource().Затем я, все еще находясь в слушателе, обновляю значение в базе данных (лично используя OrmLite).

Не совсем так, как я хотел, но проще, чем расширение CursorAdapter и обработка всего себя, и это, кажется, работает.

...