我用aListView和aSimpleCursorAdapter创建了一个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; }
}

数据库一,我只发布了相关部分:
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();
    }

最后是名单,ChannelDB.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" ));

如果你需要更多的代码,请告诉我。

最佳答案

编辑:
划掉我先前的答案。在一行中切换最喜欢的星星后向下滚动时出现错误。我想这和这些景观是如何被回收利用或者其他什么有关。
相反,我仍然在favorite中传递sqlite列from,在resource id中传递starImageViewto。然后我extend SimpleCursorAdapter@Override bindView。我调用super,然后使用ImageView获取view.findViewById的句柄,其中view是传递到bindView的参数之一。使用这个句柄,我可以有条件地设置适当的drawable(星型填充或非填充),并设置clickListener
原始答案:
我的案例比较简单,但也很相似,所以我会把我所做的发布出来。我需要一个允许用户收藏一行的星,所以我使用了ImageView。在我的from中,我通过sqlite列favorite,在我的to中,我通过resource IdImageView
在我使用SimpleCursorAdapter.ViewBinder()添加的SimpleCursorAdapter.setViewBinder中,我重写了setViewValue。然后我使用cursor.getColumnIndex("favorite")来测试传入indexsetViewValue值。如果相等,我将click listener设置为传入viewsetViewValue参数。根据数据库中favorite的值,我使用ImageView适当地切换((ImageView) view).setImageResource()。然后,我仍然在侦听器中更新数据库中的值(亲自使用ormlite)。
不完全是我想怎么做,但比扩展cursoradapter和自己处理所有事情更容易,而且似乎是可行的。

07-28 00:07