Meh*_*ran 3 android interface android-fragments
我需要在我的适配器中调用Fragment方法,但是我收到一个错误:
ClassCastException:Main(MainActivity)无法强制转换为PlayPauseClick(接口)
我在我的片段中实现了我的界面,但我仍然得到这个错误,因为朋友已经告诉我mContext(我的适配器上下文)不能是一个Fragment.
那么我该如何解决这个问题呢?
我的片段方法:
private FunDapter<Product> adapter;
private ArrayList<Product> productList;
private ListView lvProduct;
adapter = new FunDapter<>(getActivity(), productList, R.layout.d_layout_list_d, dict);
lvProduct.setAdapter(adapter);
// My method
@Override
public void imageButtonOnClick(View v, int position){
playPause=(ImageView)v.findViewById(R.id.playPause);
Product m = productList.get(position);
playPause.setImageResource(m.getPlayPauseId());
playPause.setTag(position);
playPause.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int pos = (Integer) v.getTag();
Product m =(Product) productList.get(pos);
if (paused) {
m.setPlayPauseId(R.drawable.ic_pause);
paused=false;
}else {
m.setPlayPauseId(R.drawable.ic_play);
paused = true;
}
}
});
}
Run Code Online (Sandbox Code Playgroud)
接口:
public interface PlayPauseClick{
void imageButtonOnClick(View v, int position);
}
Run Code Online (Sandbox Code Playgroud)
我的适配器:
public class FunDapter<T> extends BaseAdapter implements Filterable {
protected List<T> mDataItems;
protected LongExtractor<T> idExtractor;
protected final Context mContext;
private final int mLayoutResource;
private final BindDictionary<T> mBindDictionary;
private FunDapterFilter<T> funDapterFilter;
public FunDapter(Context context, List<T> dataItems, int layoutResource,
BindDictionary<T> dictionary) {
this(context, dataItems, layoutResource, null, dictionary);
}
public FunDapter(Context context, List<T> dataItems, int layoutResource,
LongExtractor<T> idExtractor, BindDictionary<T> dictionary) {
this.mContext = context;
this.mDataItems = dataItems;
this.mOrigDataItems = dataItems;
this.mLayoutResource = layoutResource;
this.idExtractor = idExtractor;
this.mBindDictionary = dictionary;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View v = convertView;
final GenericViewHolder holder;
if (null == v) {
LayoutInflater vi =
(LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(mLayoutResource, null);
holder = new GenericViewHolder();
holder.root = v;
holder.playPause=(ImageView)v.findViewById(R.id.playPause);
holder.playPause.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
((PlayPauseClick)mContext).imageButtonOnClick(v, position);
}
});
return v;
}
Run Code Online (Sandbox Code Playgroud)
如果你想在Fragment上定义你的接口,那么你需要在Adapter上显式设置它,而不是依赖Context来为你处理,因为Activity它mContext不是你的Fragment.
所以,这是你的适配器定义了一个接口.单击按钮时会激活它.
public class FunDapter<T> extends BaseAdapter implements Filterable {
public interface PlayPauseClick {
void imageButtonOnClick(View v, int position);
}
private PlayPauseClick callback;
...
public void setPlayPauseClickListener(PlayPauseClick listener) {
this.callback = listener;
}
...
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
...
holder.playPause.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (callback != null) {
callback.imageButtonOnClick(v, position);
}
Run Code Online (Sandbox Code Playgroud)
在Fragment中,您可以实现该接口(也就是您的回调)
public class YourFragment extends Fragment
implements YourAdapter.PlayPauseClick // see here
// private ... adapter;
private List<Product> data = new ArrayList<Product>();
@Override
public View onCreateView(...) {
// Set your adapter
// Pass the listener here
this.adapter = new FunDapter<Product>(...);
this.adapter.setPlayPauseClickListener(this);
}
@Override
public void imageButtonOnClick(View v, int position) {
// TODO: Implement this
}
Run Code Online (Sandbox Code Playgroud)
您应该删除Activity类上的接口实现.
| 归档时间: |
|
| 查看次数: |
7670 次 |
| 最近记录: |