2017-07-27 114 views
0

我试图在用户点击它时从我的RecyclerView删除一个项目。但是,即使Adapter中的delete方法是public,当试图从MyViewHolder中的onClick调用'delete'方法时,出现错误“无法解析方法delete(int)”。无法从ViewHolder调用适配器中的方法(RecyclerView)

什么给?它是公开的,为什么我不能称它?

GroceryItemAdapter

public class GroceryItemAdapter extends RecyclerView.Adapter<MyViewHolder> { 
    private LayoutInflater inflater; 
    private Context context; 

    List<MetaData> data = Collections.emptyList(); 

    public GroceryItemAdapter(Context context, List<MetaData> data) { 
     this.context = context; 
     inflater = LayoutInflater.from(context); 
     this.data = data; 
    } 

    public void delete(int position) { 
     data.remove(position); 
     notifyItemRemoved(position); 
    } 


    @Override 
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = inflater.inflate(R.layout.grocery_item_row, parent, false); 
     MyViewHolder holder = new MyViewHolder(view); 
     Log.i("GroceryHero", "onCreateViewHolder called"); 

     return holder; 
    } 

    @Override 
    public void onBindViewHolder(MyViewHolder holder, int position) { 
     MetaData current = data.get(position); 
     holder.title.setText(current.title); 
     holder.icon.setImageResource(current.iconid); 
     Log.i("GroceryHero","onBindViewHolder called " + position); 
    } 

    @Override 
    public int getItemCount() { 
     return data.size(); 
    } 

} 

MyViewHolder:

class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 
TextView title; 
ImageView icon; 

public MyViewHolder(View itemView) { 
    super(itemView); 
    Log.i("GroceryHero", "MyViewHolder called"); 
    title = (TextView) itemView.findViewById(R.id.grocery_text); 
    icon = (ImageView) itemView.findViewById(R.id.grocery_icon); 
    itemView.setOnClickListener(this); 
} 

@Override 
public void onClick(View v) { 
    Toast.makeText(v.getContext(), "Item clicked at " + getAdapterPosition(), Toast.LENGTH_SHORT).show(); 
    delete(getAdapterPosition()); // ERROR: Cannot resolve method 
} 
} 
+0

您的MyViewHolder是recyclerview的内部类吗? –

+0

将您的MyViewHolder类移入GroceryItemAdapter的内部类 –

+0

谢谢Sam!移动课程的确有窍门。 – Xarsiss

回答

1

你试图调用从视图holder类delete。但delete是适配器类的一种方法。您可以将适配器实例传递给onCreateViewHolder中的视图持有者,并将其存储为专用字段。

GroceryItemAdapter mAdapter; 
public MyViewHolder(View itemView, GroceryItemAdapter adapter) { 
    mAdapter = adapter; 
    ... 
} 

// now you can call 
mAdapter.delete(getAdapterPosition()); 
+0

这样做感谢Amarghosh!我使用'MyViewHolder holder = new MyViewHolder(view,this)'将适配器实例传递给视图持有者;'然后可以使用mAdapter.delete完成删除操作。奖励! – Xarsiss

+0

@ Xarsiss Samuel的建议也可以。你可以从内部类访问一个类的成员。所以如果你不介意让视图持有者成为适配器的内部类,那应该可以工作。 – Amarghosh

+0

完美,谢谢Amarghosh和Samuel。我没有把它作为内部课程来解决它。我很高兴我能看到这两种解决方案。 – Xarsiss

相关问题