I created a ViewBinder
, to hold my items in a ListView
, which get its contents from a SimpleCursorAdapter
and in this there's a ImageButton
. I successfully get the list but the ImageButton
just won't respond to my onclick
event to bring a string from the data base to another Activity
. That is the problem I have.
public class ChannelViewBinder implements SimpleCursorAdapter.ViewBinder {
private ChannelDB mDB;
public boolean setViewValue(View view, final Cursor cursor, int columnIndex) {
final Context mContext = null;
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(mDB.KEY_DBLINK));
Intent intent = new Intent();
intent.setClass(mContext, Doubanframe.class);
Bundle bunde = new Bundle();
bunde.putString("dblink",dblink);
intent.putExtras(bunde);
}
});
}
return false;
}
}
and below is my MainActivity
class:
private Button likebutton;
private ImageButton about;
private ChannelDB mDB;
private ListView channellist;
private Cursor c;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
likebutton=(Button) findViewById(R.id.share);
about =(ImageButton)findViewById(R.id.about);
channellist = (ListView) findViewById(R.id.Channel);
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;
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);
channellist.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
c.moveToPosition(position);
Intent intent = new Intent();
intent.setClass(HDtvs.this,Showlist.class);
intent .putExtra("path",mDB.KEY_PATH);
intent .putExtra("cname",mDB.KEY_CHANNEL);
intent .putExtra("dblink",mDB.KEY_DBLINK);
startActivity(intent);
}
});
}
In the onClickListener on your ImageButton
you are creating a new Intent
, but you don't seem to call startActivity
? You will need to have a reference to some sort of context in order to be able to do so. Your mContext
variable appears to be a good candidate for that, although I don't see it being set to anything but null
in the code snippet.
You can easily add a reference to a valid Context by creating a constructor for your ChannelViewBinder
class.
public class ChannelViewBinder implements SimpleCursorAdapter.ViewBinder {
private Context mContext = null;
public ChannelViewBinder(Context context) {
mContext = context;
}
...
}
You can then later on use it to call mContext.startActivity(intent)
in the ImageButton's onClick. Obviously you will also need to change instantiating the object: adapter.setViewBinder(new ChannelViewBinder(this))
, where this
will reference your MainActivity
class.