【问题标题】:checkbox uncheck and row values of listview are not updated复选框取消选中并且列表视图的行值未更新
【发布时间】:2019-06-07 11:58:53
【问题描述】:

看起来很困惑,我也对正在发生的事情感到困惑。我有一个应用程序,其中有一个显示值的列表视图,当按下一行时,该行的第三个值将显示一个值。

例如:第三个值是 30,当它被按下时,它应该除以 6,所以答案应该是 5。

但是当我在列表视图中滚动时,复选框变为未选中状态,third value of the row 恢复为旧值(30).

有什么方法可以防止复选框被选中并在单击时保留行的值?

这是我的代码的 sn-p。

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @RequiresApi(api = Build.VERSION_CODES.N)
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            CheckBox checkBox = (CheckBox)view.findViewById(R.id.checkmark);
            TextView tv3 = (TextView)view.findViewById(R.id.tx_counter);
            EditText editText = (EditText)findViewById(R.id.editText3);
            String yy = editText.getText().toString().trim();
            String shitts = listView.getItemAtPosition(position).toString();
            try {
                String[] a = shitts.split(", ");
                String[] b = a[1].split("=");
                String[] sep = a[0].split("=");
                String betnumber = sep[1];
                String betamount= b[1];
                if (view != null) {
                    checkBox.setChecked(!checkBox.isChecked());
                    if(checkBox.isChecked()){
                        //sort number
                        final String sorted = betnumber.chars().sorted().mapToObj(c -> Character.valueOf((char)c).toString()).collect(Collectors.joining());
                        System.out.println(sorted);
                        //check if double digit
                        Boolean checker = doubleChecker(sorted);
                        if (checker == true){
                            Toast.makeText(getApplicationContext(),"DOUBLE DIGIT", LENGTH_SHORT).show();
                            int answer = Integer.parseInt(betamount) / 3;
                            tv3.setText(String.valueOf(answer));
                        }else{
                            Toast.makeText(getApplicationContext(),"NOT DOUBLE DIGIT", LENGTH_SHORT).show();
                            int answer;
                            if(yy.equals("")){
                                 answer = Integer.parseInt(betamount) / 6;
                                 tv3.setText(String.valueOf(answer));
                            }else{
                                answer = (Integer.parseInt(betamount) - Integer.parseInt(yy)) / 6;
                                tv3.setText(String.valueOf(answer));
                            }
                        }
                        //TODO save to array to send

                    }else{
                        //TODO mistake RETURN tv3 to old value
                    }
                }
            }catch (Exception e){
            }
        }
    });

这是我的适配器。

    class MyAdapter extends BaseAdapter {
    private ArrayList<HashMap<String, String>> mData;
    public MyAdapter(ArrayList<HashMap<String, String>> mData2) {
        this.mData = mData2;
    }
    @Override
    public int getCount() {
        return mData.size();
    }
    @Override
    public Object getItem(int i) {
        return this.mData.get(i);
    }
    @Override
    public long getItemId(int i) {
        return i;
    }
    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        view = getLayoutInflater().inflate(R.layout.row_layout, null);
        TextView tx_number = (TextView) view.findViewById(R.id.tx_number);
        TextView tx_amount = (TextView) view.findViewById(R.id.tx_amount);
        TextView tx_counter = (TextView) view.findViewById(R.id.tx_counter);
        String betid = mData.get(i).get("betid");
        if(betid!=null){
            String betnumber = mData.get(i).get("betnumber");
            String amountTarget = mData.get(i).get("amountTarget");
            String amountRamble = mData.get(i).get("amountRamble");
            tx_number.setText(betnumber);
            tx_amount.setText(amountTarget);
            tx_counter.setText(amountRamble);
        }
        return view;
    }
}

【问题讨论】:

    标签: java android listview checkbox


    【解决方案1】:

    将您的适配器代码替换为:

    public class MyAdapter extends BaseAdapter {
        private ArrayList<HashMap<String, String>> mData;
    
        public MyAdapter(ArrayList<HashMap<String, String>> mData2) {
            this.mData = mData2;
        }
    
        @Override
        public int getCount() {
            return mData.size();
        }
    
        @Override
        public Object getItem(int i) {
            return this.mData.get(i);
        }
    
        @Override
        public long getItemId(int i) {
            return i;
        }
    
        @Override
        public View getView(int i, View convertView, ViewGroup viewGroup) {
            View mView = convertView;
    
            String betid = mData.get(i).get("betid");
    
            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.tx_counter = (TextView) mView.findViewById(R.id.tx_counter);
                mView.setTag(holder);
            } else {
                holder = (ViewHolder) mView.getTag();
            }
    
    
            if (betid != null) {
                String betnumber = mData.get(i).get("betnumber");
                String amountTarget = mData.get(i).get("amountTarget");
                String amountRamble = mData.get(i).get("amountRamble");
                holder.tx_number.setText(betnumber);
                holder.tx_amount.setText(amountTarget);
                holder.tx_counter.setText(amountRamble);
            }
            return mView;
        }
    
        private static class ViewHolder {
            TextView tx_number;
            TextView tx_amount;
            TextView tx_counter;
        }
    }
    

    我用ViewHolder 添加了新代码。

    【讨论】:

    • 我明天测试一下
    • 我实现了它。它已经保存了复选框,但还有一件事,它复制了它的选中项。检查row1 会自动检查row10. 取消检查也是如此。
    • 另外,第三行在滚动时仍会恢复到原来的值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-13
    • 2015-11-30
    • 1970-01-01
    • 1970-01-01
    • 2017-04-18
    • 1970-01-01
    相关资源
    最近更新 更多