我正在开发一个项目,我需要在单击recyclelerView项目后更改recyclelerView的数据。我在onBindViewHolder方法中尝试了setOnClickListener:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private List<Dataset> mDataset = Collections.emptyList();
private static Context sContext;
private SharedPreferences sharedPrefs;
// Create new views (invoked by layout manager)
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = null;
sharedPrefs = Functions.getShPreferences(parent.getContext(), "selected_view");
viewType = sharedPrefs.getInt("selected_view", 0);
switch (viewType) {
case 0:
v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_view, parent, false);
break;
case 1:
v = LayoutInflater.from(parent.getContext()).inflate(R.layout.grid_view, parent, false);
break;
}
// set the view's size, margins, paddings and layout parameters
return new ViewHolder(v);
}
// Replace the contents of a view (invoked by layout manager)
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
// - get element from your dataset at this position
// - replace the contents of the view with that element
final Dataset current = mDataset.get(position);
holder.mName.setText(current.getName());
holder.mIcon.setImageResource(current.getIconId());
holder.mLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// make your click listener here
String f = Functions.getRoot(current.getFile());
mDataset = Functions.getData(f);
new FileAdapter(sContext, f);
notifyDataSetChanged();
Toast.makeText(v.getContext(), f, Toast.LENGTH_SHORT).show();
}
});
}
// Return the size of your dataset (invoked by layout manager)
@Override
public int getItemCount() {
return mDataset.size();
}
@Override
public int getItemViewType(int position) {
return super.getItemViewType(position);
}
public static class ViewHolder extends RecyclerView.ViewHolder {
TextView mName;
ImageView mIcon;
RelativeLayout mLayout;
//TextView mFileDateModified;
public ViewHolder(View v) {
super(v);
mLayout = (RelativeLayout) v.findViewById(R.id.recycler_view_layout);
mName = (TextView) v.findViewById(R.id.file_name);
mIcon = (ImageView) v.findViewById(R.id.file_icon);
}
}
public MyAdapter(Context context, String ph) {
context = sContext;
mDataset = Functions.getData(ph);
}
}
我已将此代码放在onBindViewHolder中。但它不起作用。任何帮助将不胜感激。谢谢。
答案 0 :(得分:3)
您可以在ViewHolder内部类中设置侦听器。代码就像;
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public ViewHolder(View itemView) {
super(itemView);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
mDataset = Functions.getData();
new FileAdapter();
notifyDataSetChanged();
int position = getAdapterPosition();
// or
position = getLayoutPosition();
// both worked for me
}
}
答案 1 :(得分:0)
我认为打电话给notifyDataSetChanged();
不是一个好主意,因为如果有长数据,它会更改并刷新所有可能让您遇到麻烦的数据,因此建议使用
notifyItemChanged(getAdapterPosition());
我的ViewHolder看起来像这样:
public class AttendanceListViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
TextView rollNo, name,isPresent;
public AttendanceListViewHolder(View itemView) {
super(itemView);
if (isRecyclerViewClickable) {
isPreset.setOnClickListener(this);
}
}
@Override
public void onClick(View v) {
data.get(getAdapterPosition()).wasPresent = "false";
notifyItemChanged(getAdapterPosition());
}
}