我使用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" ));
如果您需要更多代码,请告诉我。
答案 0 :(得分:0)
修改强>
抓我以前的回答。在连续切换最喜欢的星形后向下滚动时出现了一个错误。我想这与视图的回收方式有关。
相反,我仍然将favorite
中的SQLite列from
和resource id
中的明星ImageView
的{{1}}传递出去。然后我to
和extend SimpleCursorAdapter
。我致电@Override bindView
,然后使用super
获取ImageView
的句柄,其中view.findViewById
是传递到view
的参数之一。使用该句柄,我能够有条件地设置适当的drawable(星形填充或未填充),并设置bindView
。
原始回答:
我的情况比较简单,但很相似,所以我会发布我的所作所为。我需要一个允许用户喜欢一行的星号,所以我使用了clickListener
。在我的ImageView
我传递了SQLite专栏from
,在我的favorite
我传递了to
的{{1}}。
在我使用resource Id
添加的ImageView
中,我覆盖了SimpleCursorAdapter.ViewBinder()
。然后,我使用SimpleCursorAdapter.setViewBinder
来测试传递到setViewValue
的{{1}}值。如果相等,我会将cursor.getColumnIndex("favorite")
设置为传递到index
的{{1}}参数。根据我的数据库中setViewValue
的值,我使用click listener
适当地切换view
。然后,我仍然在监听器中更新数据库中的值(个人使用OrmLite)。
不完全是我想要的方式,但比扩展CursorAdapter和处理所有内容更容易,而且似乎有效。
答案 1 :(得分: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
}
}
}