我创建了一个ViewBinder
,用于将我的项目保存在ListView
中,从SimpleCursorAdapter
获取其内容,其中包含ImageButton
。我成功获取了列表,但ImageButton
只是不响应我的onclick
事件,将数据库中的字符串带到另一个Activity
。这就是我遇到的问题。
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;
}
}
以下是我的MainActivity
课程:
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);
}
});
}
答案 0 :(得分:2)
在ImageButton
上的onClickListener中,您正在创建一个新的Intent
,但您似乎无法拨打 startActivity
?您需要引用某种上下文才能够这样做。您的mContext
变量似乎是一个很好的候选者,虽然我没有看到它被设置为代码段中的null
以外的任何内容。
您可以通过为ChannelViewBinder
类创建构造函数,轻松添加对有效上下文的引用。
public class ChannelViewBinder implements SimpleCursorAdapter.ViewBinder {
private Context mContext = null;
public ChannelViewBinder(Context context) {
mContext = context;
}
...
}
稍后您可以使用它在ImageButton的onClick中调用mContext.startActivity(intent)
。显然,您还需要更改实例化对象:adapter.setViewBinder(new ChannelViewBinder(this))
,其中this
将引用您的MainActivity
类。