Android listview项目单击将文本设置为文本视图问题

Android listview项目单击将文本设置为文本视图问题,android,listview,Android,Listview,在我的listview中,当我长按第1行时,它应该会更改第1行中文本视图的数量。但是我有一个问题,当我试图更改特定行的数量(例如:行1)时,listview的第5行也会更改。此外,当listview被回收时,textview将返回其旧值。我已经试着解决这个问题一天了,但是没有成功 感谢您的帮助 public View getView(int i, View convertView, ViewGroup viewGroup) { View mView = convertView;

在我的listview中,当我长按第1行时,它应该会更改第1行中文本视图的数量。但是我有一个问题,当我试图更改特定行的数量(例如:行1)时,listview的第5行也会更改。此外,当listview被回收时,textview将返回其旧值。我已经试着解决这个问题一天了,但是没有成功

感谢您的帮助

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;
    }
}
public View getView(inti、视图转换视图、视图组视图组){
视图mView=转换视图;
字符串betid=mData.get(i.get(“id”);
最终持票人;
if(mView==null){
Context=viewGroup.getContext();
LayoutFlater充气机=LayoutFlater.from(上下文);
mView=充气机充气(R.layout.row\u布局,null,false);
holder=新的ViewHolder();
holder.tx_编号=(TextView)mView.findViewById(R.id.tx_编号);
holder.tx_amount=(TextView)mView.findViewById(R.id.tx_amount);
holder.checkBox=(checkBox)mView.findviewbyd(R.id.checkmark);
holder.tx_status=(TextView)mView.findViewById(R.id.tx_status);
setOnCheckedChangeListener(newcompoundButton.OnCheckedChangeListener()){
@RequiresApi(api=Build.VERSION\u code.N)
@凌驾
检查更改后的公共无效(复合按钮视图,布尔值已检查){
if(buttonView.isChecked()){
选中。添加((整数)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));
}否则{
支架.tx_数量.立根基色(颜色.白色);
支架.tx_编号.立根基色(颜色.白色);
支架.tx_状态.立根基色(颜色.白色);
}
}
});
setOnItemLongClickListener(新的AdapterView.OnItemLongClickListener(){
@凌驾
公共布尔值长单击(AdapterView父项、视图、整型位置、长id){
TextView txAmt=view.findviewbyd(R.id.tx\u金额);
AlertDialog.Builder alert=新建AlertDialog.Builder(MainActivity.this);
alert.setTitle(“输入新金额:”);
最终编辑文本输入=新编辑文本(MainActivity.this);
input.setInputType(InputType.TYPE\类别\编号);
input.setRawInputType(配置键盘_12键);
alert.setView(输入);
alert.setPositiveButton(“回车”,新建DialogInterface.OnClickListener()){
public void onClick(对话框接口对话框,int whichButton){
字符串zzx=input.getText().toString();
txAmt.setText(zzx);
holder.tx_status.setText(zzx);
持有人.tx\U金额.SETEXT(zzx);
}
});
alert.setNegativeButton(“取消”,新建DialogInterface.OnClickListener()){
public void onClick(对话框接口对话框,int whichButton){
//将取消按钮的操作放在此处,或留空
}
});
alert.show();
返回true;
}
mView.setTag(支架);
holder.checkBox.setTag(i);
}否则{
holder=(ViewHolder)mView.getTag();
((ViewHolder)mView.getTag()).checkBox.setTag(i);
}
if(betid!=null){
字符串betnumber=mData.get(i.get)(“betnumber”);
字符串amountTarget=mData.get(i.get)(“betamount”);
字符串状态=mData.get(i.get)(“状态”);
持有人.tx\U金额.SETEXT(金额目标);
支架.tx_编号.setText(betnumber);
holder.tx_status.setText(状态);
}
ViewHolder holde2r=(ViewHolder)mView.getTag();
对于(int k=0;k
您应该学习
listview
生命周期。但是,如果您想这样做,您必须更改数据源中的项目数据,在这种情况下,它的
mData
。在更新项目调用
notifyItemchanged()之后
在适配器上应用listview中的项目。循环使用后,您会看到旧数据的原因是列表从
mData
获取数据,而您刚刚更新了
视图
。因此,不要获取viewholder。通过长单击中的
位置
获取项目,更新项目后只需调用
notifyItemChanged即可(position);

您应该学习
listview
生命周期。但是,如果您想这样做,您必须更改数据源中的项目数据,在这种情况下,它的
mData
。在更新项目调用
notifyItemchanged()之后
在适配器上应用listview中的项目。循环使用后,您会看到旧数据的原因是列表从
mData
获取数据,而您刚刚更新了
视图
。因此,不必获取viewholder。通过
pos获取项目
@Override
public long getItemId(int position) {
    return position;
}

@Override
public int getItemViewType(int position) {
   return position;
}
 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;
                }