ImageButton 在单独的适配器类中定义。我想从 MainActivity 引用它,以实现将项目从 Listview 添加到收藏夹。如何联系我?
这是适配器类
public class MyCursorAdapter extends CursorAdapter {
private int layout; //нужен для создания объектов класса View
public MyCursorAdapter(Context context, int layout, Cursor c, int flags) {
super(context, c, flags);
this.layout = layout;
}
public static class ViewHolder {
public TextView txtBukva;
public TextView txtSlovo;
public ImageButton btnIzbrannoe;
public void setBtnIzbrannoe(ImageButton btnIzbrannoe) {
this.btnIzbrannoe = btnIzbrannoe;
}
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
View view = inflater.inflate(layout, parent, false);
return view;
}
@Override
public void bindView(View view, Context context, final Cursor cursor) {
ViewHolder holder = new ViewHolder();
String bukva = cursor.getString(cursor.getColumnIndex(Contract.Entry.COLUMN_SLOVO)).substring(0, 1).toUpperCase();
String slovo = cursor.getString(cursor.getColumnIndex(Contract.Entry.COLUMN_SLOVO));
String izbrannoe = cursor.getString(cursor.getColumnIndex(Contract.Entry.COLUMN_IZBRANNOE));
holder.txtBukva = (TextView) view.findViewById(R.id.txtBukva);
holder.txtSlovo = (TextView) view.findViewById(R.id.txtSlovo);
holder.btnIzbrannoe = (ImageButton) view.findViewById(R.id.btnIzbrannoe);
holder.txtBukva.setText(bukva);
holder.txtSlovo.setText(slovo);
holder.btnIzbrannoe.setFocusable(false);
if (izbrannoe.equals("1")) {
holder.btnIzbrannoe.setImageResource(R.drawable.icon_star_yellow);
} else if (izbrannoe.equals("0")) {
holder.btnIzbrannoe.setImageResource(R.drawable.icon_star_outline_black);
}
}
}
首先,您需要定义一个回调接口,适配器将通过该接口向 MainActivity 返回有关单击某个项目中的“收藏夹”按钮的信息。是这样的:
第二个是向适配器添加一个方法,监听器对象将被传递到该方法。或者通过构造函数传递它。
第三。有必要将其唯一 id 绑定到每个显示的元素。我不明白 id 对你来说是什么:数据库中是否有带有 id 的列,还是来自 bukva 或 slovo 的一行。选择你自己。我会将它绑定到元素的根视图。因此,在 bindView 中你需要这样做:
第四。我们需要一个按钮单击处理程序,它将恢复 id 并使用 lisner 将其传递给 MainActivity:
第五,在 MainActivity 中,为您的按钮创建一个点击侦听器,将更改写入其中的数据库,然后重新加载适配器。
我写的是“脑洞大开”,不检查,代码中可能有错别字,钻研本质。
如果列表在一个活动中(而不是一个片段),那么
View处理对其中一个列表项的点击是非常容易的。在所需按钮的项目的 xml 标记中,指定属性onClick并指定处理单击的方法的名称(此处onFavoriteClick):在显示列表的活动中,创建一个具有此名称和以下签名的方法:
必要的附加数据可以在适配器中传递
setTag()给此按钮,并View在回调返回的活动中接收。例如,要在适配器中传递光标位置:适配器:
活动:
所以你可以传递任何对象,如果你需要多个数据,你可以使用集合或复合模型对象。
不幸的是,在fragments中,这么简单的方法是行不通的,需要自己组织回调接口(callback)
通过单独创建的类列出输出。
OnClickListener在为类对象添加输出之前:该类本身看起来大致像这样简化: