Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ViewHolder在getView方法中返回不正确的位置_Java_Android_Adapter_Getview - Fatal编程技术网

Java ViewHolder在getView方法中返回不正确的位置

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<

我有CardView,我需要更改其中的一些。问题是,当我有多个cardview时,我单击其中一个,它会更改我拥有的最后一个cardview的数据,而不是我单击的数据

    @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