簡體   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