Java ViewHolder在getView方法中返回不正确的位置
我有CardView,我需要更改其中的一些。问题是,当我有多个cardview时,我单击其中一个,它会更改我拥有的最后一个cardview的数据,而不是我单击的数据Java ViewHolder在getView方法中返回不正确的位置,java,android,adapter,getview,Java,Android,Adapter,Getview,我有CardView,我需要更改其中的一些。问题是,当我有多个cardview时,我单击其中一个,它会更改我拥有的最后一个cardview的数据,而不是我单击的数据 @RequiresApi(api = Build.VERSION_CODES.N) public class ReagendarAdapter extends BaseAdapter { private static final String TAG = "vania"; private List<
@RequiresApi(api = Build.VERSION_CODES.N)
public class ReagendarAdapter extends BaseAdapter {
private static final String TAG = "vania";
private List<Visita> visitaList;
private Context context;
private Calendar dateTime = Calendar.getInstance();
private String dataAntiga;
private Date novaDataInicio = new Date();
private Date novaDataFinal = new Date();
private ViewHolder holder;
public ReagendarAdapter(List<Visita> visitaList, Context context) {
this.visitaList = visitaList;
this.context = context;
}
@Override
public int getCount() {
return visitaList.size();
}
@Override
public Visita getItem(int position) {
return visitaList.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
class ViewHolder {
@BindView(R.id.txtCliente)
TextView txtCliente;
@BindView(R.id.txtAtividade)
TextView txtAtividade;
@BindView(R.id.txtData)
TextView txtData;
@BindView(R.id.txtDuracao)
TextView txtDuracao;
@BindView(R.id.txtNovaData)
TextView txtNovaData;
@BindView(R.id.llData)
LinearLayout llData;
@BindView(R.id.llMudarDuracao)
LinearLayout llMudarDuracao;
@BindView(R.id.btnReagendr)
Button btnReagendr;
ViewHolder(View view) {
ButterKnife.bind(this, view);
}
}
@SuppressLint({"SimpleDateFormat", "SetTextI18n"})
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
if (row == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
assert inflater != null;
row = inflater.inflate(R.layout.reagendar_row, parent, false);
holder = new ViewHolder(row);
row.setTag(holder);
} else {
holder = (ViewHolder) row.getTag();
}
final Visita visita = visitaList.get(position);
assert visita != null;
Date dataInicio = new Date(visita.getDtinicio() + (3 * 3600 * 1000));
if (visita.getNome() != null)
holder.txtCliente.setText(visita.getNome());
if (visita.getDtinicio() != null) {
dataAntiga = " " + new SimpleDateFormat("dd/MM 'às' HH:mm").format(dataInicio);
holder.txtData.setText(dataAntiga);
}
if (visita.getTipoevento() != null) {
String atividade = getPrefString(visita.getTipoevento().toString(), context);
holder.txtAtividade.setText(atividade);
}
holder.txtDuracao.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (!dataAntiga.equalsIgnoreCase(String.valueOf(holder.txtData))){
holder.btnReagendr.setBackgroundColor(context.getResources().getColor(R.color.BrightBlue));
holder.btnReagendr.setEnabled(true);
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
holder.llData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
updateDate();
}
});
holder.llMudarDuracao.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
updateDate();
}
});
holder.btnReagendr.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
visita.setStatusVisita("reagendada");
visita.setDataInicio(novaDataInicio);
visita.setDataFim(novaDataFinal);
updateAtvidade(context, visita);
}
});
return row;
}
private void updateDate() {
new DatePickerDialog(context, R.style.Picker, d, dateTime.get(Calendar.YEAR), dateTime.get(Calendar.MONTH), dateTime.get(Calendar.DAY_OF_MONTH)).show();
}
private void updateTime() {
new TimePickerDialog(context, R.style.Picker, t, dateTime.get(Calendar.HOUR_OF_DAY), dateTime.get(Calendar.MINUTE), true).show();
}
private void updateHour() {
NumberPicker numberPicker = new NumberPicker(context);
numberPicker.setMinValue(0);
numberPicker.setMaxValue(10);
numberPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
@SuppressLint("SetTextI18n")
@Override
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
if (newVal != 1)
holder.txtDuracao.setText(" " + newVal + " horas");
else
holder.txtDuracao.setText(" " + newVal + " hora");
holder.txtNovaData.setText("Nova Data: ");
holder.llMudarDuracao.setVisibility(View.VISIBLE);
holder.txtDuracao.setTextColor(ColorStateList.valueOf(context.getResources().getColor(R.color.BrightBlue)));
novaDataFinal = new Date(novaDataInicio.getTime() + ( newVal* 3600 * 1000));
}
});
AlertDialog.Builder builder = new AlertDialog.Builder(context).setView(numberPicker);
builder
.setTitle("Duração")
.setIcon(R.drawable.ic_action_timer)
.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.show();
}
private DatePickerDialog.OnDateSetListener d = new DatePickerDialog.OnDateSetListener()
{
@Override
public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
dateTime.set(Calendar.YEAR, year);
dateTime.set(Calendar.MONTH, month);
dateTime.set(Calendar.DAY_OF_MONTH, dayOfMonth);
updateTime();
}
};
private TimePickerDialog.OnTimeSetListener t = new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
dateTime.set(Calendar.HOUR_OF_DAY, hourOfDay);
dateTime.set(Calendar.MINUTE, minute);
novaDataInicio = dateTime.getTime();
atualizaString(holder.txtData);
updateHour();
}
};
@SuppressLint("SimpleDateFormat")
private void atualizaString(TextView textView) {
textView.setText(String.format(" %s", new SimpleDateFormat("dd/MM 'às' HH:mm").format(dateTime.getTime())));
textView.setTextColor(ColorStateList.valueOf(context.getResources().getColor(R.color.BrightBlue)));
}
@RequiresApi(api=Build.VERSION\u CODES.N)
公共类ReagendaAdapter扩展了BaseAdapter{
私有静态最终字符串TAG=“vania”;
私人名单探视者;
私人语境;
private Calendar dateTime=Calendar.getInstance();
私有字符串dataAntiga;
私有日期novaDataInicio=新日期();
私有日期novaDataFinal=新日期();
私人持票人;
公共ReagendaAdapter(列表访问列表、上下文){
this.visitaList=visitaList;
this.context=上下文;
}
@凌驾
public int getCount(){
返回visitaList.size();
}
@凌驾
公众访问getItem(内部位置){
返回visitaList.get(位置);
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
类视图持有者{
@BindView(R.id.txtCliente)
TextView-txtCliente;
@BindView(R.id.txtAtividade)
TextView-txtAtividade;
@BindView(R.id.txtData)
TextView txtData;
@BindView(R.id.txtDuraco)
TextView-txtDuracao;
@BindView(R.id.txtNovaData)
TextView TXTData;
@BindView(R.id.llData)
线性布局数据;
@BindView(R.id.llmudaracao)
线性布局llmudaracao;
@BindView(R.id.btnReagendr)
按钮btnReagendr;
视图保持器(视图){
ButterKnife.bind(这个,视图);
}
}
@SuppressLint({“SimpleDataFormat”,“SetTextI18n})
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图行=转换视图;
if(行==null){
LayoutFlater充气器=(LayoutFlater)context.getSystemService(context.LAYOUT\u充气器\u服务);
断言充气器!=null;
行=充气机。充气(R.layout.reagendar\u行,父级,false);
支架=新的视图支架(行);
row.setTag(支架);
}否则{
holder=(ViewHolder)row.getTag();
}
最终访问Visita=visitaList.get(位置);
断言访问!=null;
Date dataInicio=新日期(visita.getDtinicio()+(3*3600*1000));
if(visita.getNome()!=null)
holder.txtCliente.setText(visita.getNome());
if(visita.getDtinicio()!=null){
dataAntiga=“”+新简化格式(“dd/MM'a's'HH:MM”)。格式(dataInicio);
holder.txtData.setText(dataAntiga);
}
if(visita.getTipoevento()!=null){
字符串atividade=getPrefString(visita.getTipoevento().toString(),上下文);
holder.txtAtividade.setText(atividade);
}
holder.txtDuracao.addTextChangedListener(新的TextWatcher(){
@凌驾
更改前文本之前的公共void(字符序列s、int start、int count、int after){
}
@凌驾
public void onTextChanged(字符序列、int start、int before、int count){
if(!dataAntiga.equalsIgnoreCase(String.valueOf(holder.txtData))){
holder.btnReagendr.setBackgroundColor(context.getResources().getColor(R.color.BrightBlue));
holder.btnReagendr.setEnabled(true);
}
}
@凌驾
公共无效后文本已更改(可编辑){
}
});
holder.llData.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
updateDate();
}
});
holder.llmudaracao.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
updateDate();
}
});
holder.btnReagendr.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
访问。设置状态访问(“Reagenda”);
访问setDataInicio(novaDataInicio);
访问setDataFim(novaDataFinal);
更新视频(上下文、访问);
}
});
返回行;
}
私有void updateDate(){
新建DatePickerDialog(context,R.style.Picker,d,dateTime.get(Calendar.YEAR),dateTime.get(Calendar.MONTH),dateTime.get(Calendar.DAY/u/u MONTH)).show();
}
私有void updateTime(){
new TimePickerDialog(context,R.style.Picker,t,dateTime.get(Calendar.HOUR_OF u DAY),dateTime.get(Calendar.MINUTE),true).show();
}
私有void updateHour(){
NumberPicker NumberPicker=新的NumberPicker(上下文);
numberPicker.setMinValue(0);
numberPicker.setMaxValue(10);
numberPicker.setOnValueChangedListener(新的numberPicker.OnValueChangeListener(){
@SuppressLint(“SetTextI18n”)
@凌驾
public void onValueChange(NumberPicker选择器、int-oldVal、int-newVal){
如果(newVal!=1)
holder.txtDuracao.setText(“+newVal+”horas”);
其他的
holder.txtDuracao.setText(“+newVal+”hora”);
holder.txtNovaData.setText(“Nova数据:”);
holder.llmudaracao.setVisibility(View.VISIBLE);
holder.txtDuracao.setTextColor(ColorStateList.valueOf(context.getResources().getColor(R.color.BrightBlue));
novaDataFinal=新日期(novaDataInicio.getTime()+(newVal*3600*1000));
}
});
AlertDialog.Builder=新建AlertDialog.Builder(上下文).setView(numberPicker);
建设者
.setTitle(“Duração”)
.setIcon(R.drawable.ic_ac