listview itemclick将文本设置为textview问题

时间:2019-07-13 03:21:22

标签: android listview

在我的列表视图中,当我长按第1行时,它应该更改第1行中的textview的数量。但是,我有一个问题,当我尝试更改特定行(例如:第1行)的数量时,列表视图的第五行也会更改。同样,当列表视图被回收时,文本视图返回其旧值。已经尝试解决这一问题一天,但没有运气。

感谢您的帮助!

public View getView(int i, View convertView, ViewGroup viewGroup) {
        View mView = convertView;
        String betid = mData.get(i).get("id");
        final ViewHolder holder;
        if (mView == null) {
            Context context = viewGroup.getContext();
            LayoutInflater inflater = LayoutInflater.from(context);
            mView = inflater.inflate(R.layout.row_layout, null, false);
            holder = new ViewHolder();
            holder.tx_number = (TextView) mView.findViewById(R.id.tx_number);
            holder.tx_amount = (TextView) mView.findViewById(R.id.tx_amount);
            holder.checkBox = (CheckBox) mView.findViewById(R.id.checkmark);
            holder.tx_status = (TextView) mView.findViewById(R.id.tx_status);

            holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @RequiresApi(api = Build.VERSION_CODES.N)
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    if (buttonView.isChecked()) {
                        checked.add((Integer) holder.checkBox.getTag());
                        holder.tx_amount.setBackgroundColor(getResources().getColor(R.color.bluelim));
                        holder.tx_number.setBackgroundColor(getResources().getColor(R.color.bluelim));
                        holder.tx_status.setBackgroundColor(getResources().getColor(R.color.bluelim));
                    } else {
                        holder.tx_amount.setBackgroundColor(Color.WHITE);
                        holder.tx_number.setBackgroundColor(Color.WHITE);
                        holder.tx_status.setBackgroundColor(Color.WHITE);
                    }
                }
            });

            listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
                @Override
                public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                    TextView txAmt = view.findViewById(R.id.tx_amount);
                    AlertDialog.Builder alert = new AlertDialog.Builder(MainActivity.this);
                    alert.setTitle("Enter New Amount:");
                    final EditText input = new EditText(MainActivity.this);
                    input.setInputType(InputType.TYPE_CLASS_NUMBER);
                    input.setRawInputType(Configuration.KEYBOARD_12KEY);
                    alert.setView(input);
                    alert.setPositiveButton("enter", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                            String zzx = input.getText().toString();
                            txAmt.setText(zzx);
                            holder.tx_status.setText(zzx);
                            holder.tx_amount.setText(zzx);
                        }
                    });
                    alert.setNegativeButton("cancel", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                            //Put actions for CANCEL button here, or leave in blank
                        }
                    });
                    alert.show();

                    return true;
                }

            mView.setTag(holder);
            holder.checkBox.setTag(i);
        } else {
            holder = (ViewHolder) mView.getTag();
            ((ViewHolder) mView.getTag()).checkBox.setTag(i);
        }

        if (betid != null) {
            String betnumber = mData.get(i).get("betnumber");
            String amountTarget = mData.get(i).get("betamount");
            String status = mData.get(i).get("status");
            holder.tx_amount.setText(amountTarget);
            holder.tx_number.setText(betnumber);
            holder.tx_status.setText(status);
        }



        ViewHolder holde2r = (ViewHolder) mView.getTag();
        for (int k = 0; k < checked.size(); k++) {
            if (checked.get(k) == i) {
                holde2r.checkBox.setChecked(true);
            } else if (checked.get(k) != i) {
                holde2r.checkBox.setChecked(false);
            }
        }
        return mView;
    }

    private class ViewHolder {
        TextView tx_number;
        TextView tx_amount;
        TextView tx_status;
        CheckBox checkBox;
    }
}

3 个答案:

答案 0 :(得分:2)

尝试一下。如果未添加,请添加这两种方法

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

@Override
public int getItemViewType(int position) {
   return position;
}

在肯定按钮单击侦听器上添加notifyDataSetChange。

 listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
                @Override
                public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                    TextView txAmt = view.findViewById(R.id.tx_amount);
                    AlertDialog.Builder alert = new AlertDialog.Builder(MainActivity.this);
                    alert.setTitle("Enter New Amount:");
                    final EditText input = new EditText(MainActivity.this);
                    input.setInputType(InputType.TYPE_CLASS_NUMBER);
                    input.setRawInputType(Configuration.KEYBOARD_12KEY);
                    alert.setView(input);
                    alert.setPositiveButton("enter", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                            String zzx = input.getText().toString();
                            txAmt.setText(zzx);
                            holder.tx_status.setText(zzx);
                            holder.tx_amount.setText(zzx);



adapter.notifyDataSetChanged();



                        }
                    });
                    alert.setNegativeButton("cancel", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                            //Put actions for CANCEL button here, or leave in blank
                        }
                    });
                    alert.show();

                    return true;
                }

答案 1 :(得分:0)

您应该学习listview的生命周期。但是,如果要执行此操作,则必须从数据源(在本例中为mData)中更改项目数据。更新项目后,在适配器上调用notifyItemchanged(),以在列表视图中应用该项目。回收之后,您看到旧数据的原因是该列表从mData获取数据,而您刚刚更新了View。因此,而不是获得视图持有者。通过longclick中的position获取项目,更新项目后,只需调用notifyItemChanged(position);

答案 2 :(得分:0)

首先,您在});之前错过了代码中的mView.setTag(holder);,因此您的代码将遇到编译问题,我认为您应该已经看到。

第二,您不应在listView.setOnItemLongClickListener中呼叫getView。因为此操作会重复很多次,具体取决于屏幕上显示的项目数量。

最后,您应该使用最新数据更新数据源,即代码中的mData,然后调用adapter.notifyDatasetChanged()来更新UI。

所以您的代码应如下所示:

listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
                @Override
                public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                    TextView txAmt = view.findViewById(R.id.tx_amount);
                    AlertDialog.Builder alert = new AlertDialog.Builder(MainActivity.this);
                    alert.setTitle("Enter New Amount:");
                    final EditText input = new EditText(MainActivity.this);
                    input.setInputType(InputType.TYPE_CLASS_NUMBER);
                    input.setRawInputType(Configuration.KEYBOARD_12KEY);
                    alert.setView(input);
                    alert.setPositiveButton("enter", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                            String zzx = input.getText().toString();
                            // Remove codes below
                            // txAmt.setText(zzx);
                            // holder.tx_status.setText(zzx);
                            // holder.tx_amount.setText(zzx);

                            mData.get(position).setXXX(zzx); // call the setter of your data model
                            adapter.notifyDatasetChanged(); // call this will update the listview with the latest data
                        }
                    });
                    alert.setNegativeButton("cancel", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int whichButton) {
                            //Put actions for CANCEL button here, or leave in blank
                        }
                    });
                    alert.show();

                    return true;
                }
                });


public View getView(int i, View convertView, ViewGroup viewGroup) {
        View mView = convertView;
        String betid = mData.get(i).get("id");
        final ViewHolder holder;
        if (mView == null) {
            Context context = viewGroup.getContext();
            LayoutInflater inflater = LayoutInflater.from(context);
            mView = inflater.inflate(R.layout.row_layout, null, false);
            holder = new ViewHolder();
            holder.tx_number = (TextView) mView.findViewById(R.id.tx_number);
            holder.tx_amount = (TextView) mView.findViewById(R.id.tx_amount);
            holder.checkBox = (CheckBox) mView.findViewById(R.id.checkmark);
            holder.tx_status = (TextView) mView.findViewById(R.id.tx_status);

            holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @RequiresApi(api = Build.VERSION_CODES.N)
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    if (buttonView.isChecked()) {
                        checked.add((Integer) holder.checkBox.getTag());
                        holder.tx_amount.setBackgroundColor(getResources().getColor(R.color.bluelim));
                        holder.tx_number.setBackgroundColor(getResources().getColor(R.color.bluelim));
                        holder.tx_status.setBackgroundColor(getResources().getColor(R.color.bluelim));
                    } else {
                        holder.tx_amount.setBackgroundColor(Color.WHITE);
                        holder.tx_number.setBackgroundColor(Color.WHITE);
                        holder.tx_status.setBackgroundColor(Color.WHITE);
                    }
                }
            });

            mView.setTag(holder);
            holder.checkBox.setTag(i);
        } else {
            holder = (ViewHolder) mView.getTag();
            ((ViewHolder) mView.getTag()).checkBox.setTag(i);
        }

        if (betid != null) {
            String betnumber = mData.get(i).get("betnumber");
            String amountTarget = mData.get(i).get("betamount");
            String status = mData.get(i).get("status");
            holder.tx_amount.setText(amountTarget);
            holder.tx_number.setText(betnumber);
            holder.tx_status.setText(status);
        }



        ViewHolder holde2r = (ViewHolder) mView.getTag();
        for (int k = 0; k < checked.size(); k++) {
            if (checked.get(k) == i) {
                holde2r.checkBox.setChecked(true);
            } else if (checked.get(k) != i) {
                holde2r.checkBox.setChecked(false);
            }
        }
        return mView;
    }

    private class ViewHolder {
        TextView tx_number;
        TextView tx_amount;
        TextView tx_status;
        CheckBox checkBox;
    }
}