简体   繁体   中英

Items are repeating in listview when scrolling

Thanks everyone who helps! I have problems when I scroll the ListView: the values, that I enter to AutoCompleteTextView or to EditText fields repeat when I add more items-operations (I add from Activity) and scroll to the bottom. So, it's lookes like the items repeat in some order. I try search this problem and try much with viewHolder and viewInflate, change the place of inicialization, but problem doesn't go ot

Below is my OperationAdapter.java---------------------------------

class OperationAdapter extends BaseAdapter {
    public ArrayList<Operation> operations;
    private Context context;
    private ArrayList<String> operationns = new ArrayList<>();

    SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");        

    public OperationAdapter(Context context, ArrayList<Operation> operations) {
        this.operations = operations;
        this.context = context;
        operationns.add("Maltcev");
        operationns.add("Loskut");
    }

    @Override
    public int getCount() {
        return operations.size();
    }

    @Override
    public Object getItem(int position) {
        return operations.get(position);
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder holder;

        if (convertView == null) {
            LayoutInflater lInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = lInflater.inflate(R.layout.operation_item, null);

            holder = new ViewHolder();

            holder.timeEndOperation = (EditText) convertView.findViewById(R.id.timeEndOperation);
            holder.etc = (EditText) convertView.findViewById(R.id.etc);
            holder.deleteOperationBut = (Button) convertView.findViewById(R.id.deleteOperation);
            holder.saveOperationBut = (Button) convertView.findViewById(R.id.saveOperation);
            holder.startTimeBut = (Button) convertView.findViewById(R.id.startTimeBut);
            holder.finishTimeBut = (Button) convertView.findViewById(R.id.finishTimeBut);
            holder.timeBeginOperation = (EditText) convertView.findViewById(R.id.timeBeginningOperation);
            holder.operationsAutocomplete = (AutoCompleteTextView) convertView.findViewById(R.id.operationAutocomplete);

            convertView.setTag(holder);



        } else {
            holder = (ViewHolder)convertView.getTag();
        }



        ArrayAdapter<String> adapterOperations = new ArrayAdapter<String>(context, R.layout.support_simple_spinner_dropdown_item, operationns);
        holder.operationsAutocomplete.setAdapter(adapterOperations);


        operations.get(position).timeOfStart = holder.timeBeginOperation.getText().toString();
        operations.get(position).timeOfFinish = holder.timeEndOperation.getText().toString();
        operations.get(position).etc = String.valueOf(position);
        operations.get(position).nameOfOperation = holder.operationsAutocomplete.getText().toString();

        final ViewHolder viewHolderFinal = holder;


        holder.deleteOperationBut.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                viewHolderFinal.timeBeginOperation.clearComposingText();
                viewHolderFinal.timeEndOperation.clearComposingText();
                viewHolderFinal.etc.clearComposingText();
                viewHolderFinal.operationsAutocomplete.clearComposingText();


                operations.remove(position); 
                notifyDataSetChanged();     
            }
        });

        holder.startTimeBut.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String currentStartTime = sdf.format(new Date());
                viewHolderFinal.timeBeginOperation.setText(currentStartTime);
            }
        });

        holder.finishTimeBut.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String currentEndTime = sdf.format(new Date());
                viewHolderFinal.timeEndOperation.setText(currentEndTime);
            }
        });
        return convertView;
    }

    public void addNewOperationCard() {
        Operation operation = new Operation("", "", "", "");
        operations.add(operation);
    }

    static class ViewHolder {
        public EditText timeBeginOperation;
        public EditText timeEndOperation;
        public EditText etc;
        public AutoCompleteTextView operationsAutocomplete;
        public Button deleteOperationBut;
        public Button saveOperationBut;
        public Button startTimeBut;
        public Button finishTimeBut;
    }
}

and the block of code from Activity-----------------------------

final ListView operationListView = (ListView) findViewById(R.id.operationListView);

final OperationAdapter operationAdapter = new OperationAdapter(this, operations);
operationListView.setAdapter(operationAdapter);

Button addOperationButton = (Button) findViewById(R.id.addOperationButton);
addOperationButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        operationAdapter.addNewOperationCard();
        operationAdapter.notifyDataSetChanged();
        Toast.makeText(OperationAndWorkerActivity.this, operations.size() + " " + operationAdapter.operations.size(), Toast.LENGTH_LONG).show();
    }
});

It looks like you are duplicating your data in your getView implementation. Those lines where you're setting fields on your Operation object from the view: operations.get(position).timeOfStart = holder.timeBeginOperation.getText().toString(); operations.get(position).timeOfFinish = holder.timeEndOperation.getText().toString(); operations.get(position).etc = String.valueOf(position); operations.get(position).nameOfOperation = holder.operationsAutocomplete.getText().toString(); operations.get(position).timeOfStart = holder.timeBeginOperation.getText().toString(); operations.get(position).timeOfFinish = holder.timeEndOperation.getText().toString(); operations.get(position).etc = String.valueOf(position); operations.get(position).nameOfOperation = holder.operationsAutocomplete.getText().toString(); Those lines are probably the culprit. I think you should first reset the contents of your view and be very explicit about when your copy the view's contents back to the model (instead of every time getView is called).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM