繁体   English   中英

listview itemclick将文本设置为textview问题

[英]listview itemclick set text to textview issue

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

任何帮助表示赞赏!

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;
    }
}

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

@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;
                }

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

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

其次,您不应在getView调用listView.setOnItemLongClickListener 因为此操作会重复很多次,取决于您屏幕上可见的项目数量。

最后,您应该使用最新数据更新数据源,即代码中的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;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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