簡體   English   中英

滾動時項目在列表視圖中重復

[英]Items are repeating in listview when scrolling

謝謝大家的幫助! 滾動ListView時遇到問題:當我添加更多項操作(從Activity中添加)並滾動到底部時,輸入AutoCompleteTextView或EditText字段的值會重復。 因此,看起來項目以一定順序重復。 我嘗試搜索此問題,並使用viewHolder和viewInflate進行很多嘗試,更改了初始化的位置,但是問題沒有解決

以下是我的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;
    }
}

和來自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();
    }
});

似乎您正在getView實現中復制數據。 您從視圖中在Operation對象上設置字段的那些行: 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(); 這些台詞可能是罪魁禍首。 我認為您應該首先重置視圖的內容,並非常明確地說明何時將視圖的內容復制回模型(而不是每次調用getView )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM