我用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
中传递starImageView
的to
。然后我extend SimpleCursorAdapter
和@Override bindView
。我调用super
,然后使用ImageView
获取view.findViewById
的句柄,其中view
是传递到bindView
的参数之一。使用这个句柄,我可以有条件地设置适当的drawable(星型填充或非填充),并设置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和自己处理所有事情更容易,而且似乎是可行的。