更改 RecyclerView ItemClick 上的数据
Change data on RecyclerView ItemClick
这是我的适配器 class 我想单击一个 textview,以便在我输入一个值时出现一个对话框,该值存储在 textview 中。这就是我所需要的,但值是在随机位置输入的。
public class myAdapter extends RecyclerView.Adapter<myAdapter.ViewHolder> {
public List<Student> list;
static public Context context;
public myAdapter(List<Student> stdList) {
this.list = stdList;
}
@Override
public myAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
context = parent.getContext();
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.single_item, null);
ViewHolder viewHolder = new ViewHolder(itemView);
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.name.setText(list.get(position).getSname());
}
class ViewHolder extends RecyclerView.ViewHolder {
protected TextView name;
protected TextView amt;
public ViewHolder(View itemView) {
super(itemView);
this.name = (TextView) itemView.findViewById(R.id.Name);
this.amt = (TextView) itemView.findViewById(R.id.et_amount);
this.amt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final int pos = getAdapterPosition();
final AlertDialog.Builder inputAlert = new AlertDialog.Builder(context);
inputAlert.setTitle("Pay for picnic");
inputAlert.setMessage("We need the amount to proceed");
final EditText userInput = new EditText(context);
userInput.setInputType(InputType.TYPE_CLASS_NUMBER);
inputAlert.setView(userInput);
inputAlert.setPositiveButton("Submit", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String userInputValue = userInput.getText().toString();
amt.setText(calc(userInputValue));
notifyItemChanged(pos);
}
});
inputAlert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
AlertDialog alertDialog = inputAlert.create();
alertDialog.show();
}
});
}
}
public String calc(String val) {
int i = Integer.parseInt(val);
if (i > 850) {
Toast.makeText(context, "Incorrect amount", Toast.LENGTH_SHORT).show();
} else {
i = 850 - i;
Toast.makeText(context, "Successful", Toast.LENGTH_SHORT).show();
}
String value = String.valueOf(i);
return value;
}
@Override
public int getItemCount() {
return list.size();
}
}
尝试将您的 OnClickListener
从 ViewHolder
移至 onBindViewHolder
如果你尝试像这样直接填充那么它不会在任何地方存储值,并且在回收视图滚动或通知更改时它会从视图中清除你的数据,所以你需要先存储值然后使用它显示,我刚刚修改了您的 onCLick 方法,如下所示,所以请检查它。
@Override
public void onClick(DialogInterface dialog, int which) {
String userInputValue = userInput.getText().toString();
amt.setText(calc(userInputValue));
final Student stud = list.get(pos);
stud.setAmt(calc(userInputValue));
notifyItemChanged(pos);
}
然后在onBindViewHolder处也加一行显示数据,如下,
@Override
public void onBindViewHolder(ViewHolder holder, int position)
{
holder.name.setText(list.get(position).getSname());
holder.amt.setText(list.get(position).getAmt());
}
这是我的适配器 class 我想单击一个 textview,以便在我输入一个值时出现一个对话框,该值存储在 textview 中。这就是我所需要的,但值是在随机位置输入的。
public class myAdapter extends RecyclerView.Adapter<myAdapter.ViewHolder> {
public List<Student> list;
static public Context context;
public myAdapter(List<Student> stdList) {
this.list = stdList;
}
@Override
public myAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
context = parent.getContext();
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.single_item, null);
ViewHolder viewHolder = new ViewHolder(itemView);
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.name.setText(list.get(position).getSname());
}
class ViewHolder extends RecyclerView.ViewHolder {
protected TextView name;
protected TextView amt;
public ViewHolder(View itemView) {
super(itemView);
this.name = (TextView) itemView.findViewById(R.id.Name);
this.amt = (TextView) itemView.findViewById(R.id.et_amount);
this.amt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final int pos = getAdapterPosition();
final AlertDialog.Builder inputAlert = new AlertDialog.Builder(context);
inputAlert.setTitle("Pay for picnic");
inputAlert.setMessage("We need the amount to proceed");
final EditText userInput = new EditText(context);
userInput.setInputType(InputType.TYPE_CLASS_NUMBER);
inputAlert.setView(userInput);
inputAlert.setPositiveButton("Submit", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String userInputValue = userInput.getText().toString();
amt.setText(calc(userInputValue));
notifyItemChanged(pos);
}
});
inputAlert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
AlertDialog alertDialog = inputAlert.create();
alertDialog.show();
}
});
}
}
public String calc(String val) {
int i = Integer.parseInt(val);
if (i > 850) {
Toast.makeText(context, "Incorrect amount", Toast.LENGTH_SHORT).show();
} else {
i = 850 - i;
Toast.makeText(context, "Successful", Toast.LENGTH_SHORT).show();
}
String value = String.valueOf(i);
return value;
}
@Override
public int getItemCount() {
return list.size();
}
}
尝试将您的 OnClickListener
从 ViewHolder
移至 onBindViewHolder
如果你尝试像这样直接填充那么它不会在任何地方存储值,并且在回收视图滚动或通知更改时它会从视图中清除你的数据,所以你需要先存储值然后使用它显示,我刚刚修改了您的 onCLick 方法,如下所示,所以请检查它。
@Override
public void onClick(DialogInterface dialog, int which) {
String userInputValue = userInput.getText().toString();
amt.setText(calc(userInputValue));
final Student stud = list.get(pos);
stud.setAmt(calc(userInputValue));
notifyItemChanged(pos);
}
然后在onBindViewHolder处也加一行显示数据,如下,
@Override
public void onBindViewHolder(ViewHolder holder, int position)
{
holder.name.setText(list.get(position).getSname());
holder.amt.setText(list.get(position).getAmt());
}