【问题标题】:ClassCastException: Main(MainActivity) cannot be cast to PlayPauseClick(Interface)ClassCastException: Main(MainActivity) 无法转换为 PlayPauseClick(Interface)
【发布时间】:2017-07-03 02:12:04
【问题描述】:

我正在尝试从我的适配器类中调用一个方法.. 但我收到了这个错误:

ClassCastException: Main(MainActivity) 无法转换为 PlayPauseClick(Interface)

这是我的 Fragment(UpdatesFragment) 中的方法:

     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;
                }
                adapter.notifyDataSetChanged();     
           }

        });
    }

这是我的界面(PlayPauseClick):

public interface PlayPauseClick{
void imageButtonOnClick(View v, int position);
}

这是我的适配器

public class FunDapter<T> extends BaseAdapter implements Filterable {



protected List<T> mDataItems;
protected List<T> mOrigDataItems;
protected LongExtractor<T> idExtractor;
protected final Context mContext;
private final int mLayoutResource;
private final BindDictionary<T> mBindDictionary;
private int oddColorRes;
private int evenColorRes;
private FunDapterFilter<T> funDapterFilter;
private Filter mFilter;



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;

}


public void updateData(List<T> dataItems) {
    this.mDataItems = dataItems;
    this.mOrigDataItems = dataItems;
    notifyDataSetChanged();
}

@Override
public int getCount() {
    if (mDataItems == null || mBindDictionary == null) return 0;

    return mDataItems.size();
}

@Override
public T getItem(int position) {
    return mDataItems.get(position);
}

@Override
public boolean hasStableIds() {
    if(idExtractor == null) return super.hasStableIds();
    else return true;
}

@Override
public long getItemId(int position) {
    if(idExtractor == null) return position;
    else return idExtractor.getLongValue(getItem(position), position);
}

@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); 

        FunDapterUtils.initViews(v, holder, mBindDictionary);

        v.setTag(holder);


    } else {
        holder = (GenericViewHolder) v.getTag();
    }

    final T item = getItem(position);
    showData(item, holder, position);



    Product m =(Product) mDataItems.get(position);
    holder.playPause.setImageResource(m.getPlayPauseId());
    holder.playPause.setTag(position);
    holder.playPause.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ((PlayPauseClick)mContext).imageButtonOnClick(v, position);        
        }
    });


       return v;
    }

我做错了什么?

【问题讨论】:

  • 你在哪里初始化mContext?请发布您的适配器的完整代码。
  • 我更新了我的问题
  • 你又在哪里设置适配器片段?请更新。
  • PlayPauseClick接口是你的Fragment还是Activity实现的?
  • @an_droid_dev 不,我不知道我是怎么错过的,谢谢

标签: android android-fragments methods interface


【解决方案1】:
holder.playPause.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        ((PlayPauseClick)mContext).imageButtonOnClick(v, position);        
    }
});

MainActivity 无法转换为 PlayPauseClick

所以,实现它

public class MainActivity extends AppCompatActivity 
    implements PlayPauseClick { // *** HERE *** //

    @Override
    public void imageButtonOnClick(View v, int position) {
        // TODO: Implement this
    }

【讨论】:

  • 我在我的 Fragment 中创建了我的方法,为什么即使我在我的 Fragment 中实现了这个接口,我仍然得到这个 CastException ?我的意思是我也应该在我的 MainActivity 中做点什么吗?
  • 因为mContext不能是片段
  • 谢谢伙计,但是我有什么选择,我怎样才能在我的 Fragment 中创建这个方法
  • 如果您还有其他问题,请点击 按钮进行提问。您已经在这里接受了答案
猜你喜欢
  • 1970-01-01
  • 2020-10-04
  • 2012-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-28
相关资源
最近更新 更多