Android listview项目单击将文本设置为文本视图问题
在我的listview中,当我长按第1行时,它应该会更改第1行中文本视图的数量。但是我有一个问题,当我试图更改特定行的数量(例如:行1)时,listview的第5行也会更改。此外,当listview被回收时,textview将返回其旧值。我已经试着解决这个问题一天了,但是没有成功 感谢您的帮助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;
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;
}