CheckBox снимает флажок и проверяет при прокрутке вниз по списку - PullRequest
0 голосов
/ 03 декабря 2018

В моем приложении я использую это для подсчета отмеченного флажка в реальном времени, означающего, что когда флажок установлен, счет выше увеличится или уменьшится.но при прокрутке вниз по списку установленный флажок будет снят.какие-либо предложения или проблемы в моих кодах?

MainActivity

public class Main2Activity extends AppCompatActivity {
    ListView lstdept;
    CheckBox list_view_item_checkbox;
    SimpleAdapter ADAhere;
    Connection con;
    String un, pass, db, ip, z,country;
    int test = 0;
    ArrayList<String> selectedItems = new ArrayList<>();


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);

        country = getIntent().getStringExtra("country");
        SelectRes(country);
          lstdept.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

        lstdept.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                if (view != null) {
                    CheckBox checkBox = (CheckBox) view.findViewById(R.id.list_view_item_checkbox);
                    checkBox.setChecked(!checkBox.isChecked());
                    if (!checkBox.isChecked()) {
                        test = test - 1 ;
                    } else {
                        test = test + 1 ;
                    }
                }
               getSupportActionBar().setTitle(country + "              Total Count: " + lstdept.getCount()+"       " + test);
            }

        });

    }

Используется для заполнения списка

void SelectRes(String dept) {
        ip = "172.18.130.19";
        db = "DTRSPH";
        un = "moreface";
        pass = "moreface1234";
        try {
            con = connectionclass(un, pass, db, ip);        // Connect to database
            if (con == null) {
                toast.makeText(this,"Check Your Internet Access!",Toast.LENGTH_LONG).show();
            } else {
                String query = "SELECT FULLNAME FROM tblEPR where DEPT ='"+ dept +"'";
                Statement stmt = con.createStatement();
                ResultSet rs = stmt.executeQuery(query);
                List<Map<String, String>> data = null;
                data = new ArrayList<Map<String, String>>();

                while (rs.next()) {
                    Map<String, String> datanum = new HashMap<String, String>();
                    datanum.put("A", rs.getString("FULLNAME"));
                    data.add(datanum);
                }

                String[] fromwhere = {"A"};
                int[] viewswhere = {R.id.lblDept};
                ADAhere = new SimpleAdapter(Main2Activity.this, data,
                        R.layout.list_emp, fromwhere, viewswhere);
                lstdept = (ListView) findViewById(R.id.lstemployee);
                lstdept.setAdapter(ADAhere);
                con.close();
                getSupportActionBar().setTitle(dept + "              Total Count: " + lstdept.getCount());
            }
        } catch (Exception ex) {
            z = ex.getMessage();
        }
    }

Подключение к базе данных

@SuppressLint("NewApi")
    public Connection connectionclass(String user, String password, String database, String server) {
        StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
        StrictMode.setThreadPolicy(policy);
        Connection connection = null;
        String ConnectionURL = null;
        try {
            Class.forName("net.sourceforge.jtds.jdbc.Driver");
            ConnectionURL = "jdbc:jtds:sqlserver://" + server + ";databaseName=" + database + ";user=" + user + ";password=" + password + ";";
            connection = DriverManager.getConnection(ConnectionURL);
        } catch (SQLException se) {
            Log.e("error here 1 : ", se.getMessage());
        } catch (ClassNotFoundException e) {
            Log.e("error here 2 : ", e.getMessage());
        } catch (Exception e) {
            Log.e("error here 3 : ", e.getMessage());
        }
        return connection;
    }
}

Ответы [ 4 ]

0 голосов
/ 03 декабря 2018

Я полагаю, что проблема не в том, чтобы holder
сделать bean и adapter, как @Athira говорит
, затем внутри адаптера в getView попробуйте это

@Override
        public View getView(int i, View view, ViewGroup viewGroup) {
   ViewHolder holder = null;

 if (view == null) {
            LayoutInflater inflater=LayoutInflater.from(context);
            view=inflater.inflate(R.layout.phone_list_item,viewGroup,false);
            holder.phone1= (TextView) view.findViewById(R.id.phone1);
            holder.name1= (TextView) view.findViewById(R.id.name1);
            holder.tick= (CheckBox) view.findViewById(R.id.tick);
 view.setTag(holder);
}else{
            holder = (ViewHolder) view.getTag();
        }
           holder.phone1.setText(contactModels.get(i).getPhone());
           holder.name1.setText(contactModels.get(i).getName());
            if(contactModels.get(i).isSel())
            {
                holder.tick.setSelected(true);
            }
            else
            {
                holder.tick.setSelected(true);
            }
     holder.tick.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                    contactModels.get(i).setSel(isChecked);
                    notifyDataSetChanged();
                }
            });
            return view;
        }
 public class ViewHolder {
        TextView phone1,name1;
CheckBox tick;

    }
    }
0 голосов
/ 03 декабря 2018

В вашем объекте адаптера добавьте логический параметр для проверки и отмены проверки.По умолчанию установите значение false для каждого элемента в списке, если в адаптере установлено значение true и вызовите notifyDataSetChanged ().

Используйте класс модели

     public class ContactModel {
        String phone,name;
        boolean sel;


        public ContactModel(String phone, String name, boolean sel) {
            this.phone = phone;
            this.name = name;
            this.sel = sel;

        }

        public String getPhone() {
            return phone;
        }

        public void setPhone(String phone) {
            this.phone = phone;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public boolean isSel() {
            return sel;
        }

        public void setSel(boolean sel) {
            this.sel = sel;
        }

Myнастраиваемый адаптер

public class ContactADAPTER extends BaseAdapter {
    String phone,name;
    boolean sel;
 Activity act;
    List<ContactModel> contactModels;

    public ContactADAPTER(Activity act, List<ContactModel> contactModels) {
        this.act = act;
        this.contactModels = contactModels;
    }



    @Override
    public int getCount() {
        return contactModels.size();
    }

    @Override
    public Object getItem(int i) {
        return contactModels.get(i);
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        LayoutInflater inflater=LayoutInflater.from(context);
        view=inflater.inflate(R.layout.phone_list_item,viewGroup,false);
        TextView phone1= (TextView) view.findViewById(R.id.phone1);
        TextView name1= (TextView) view.findViewById(R.id.name1);
        CheckBox tick= (CheckBox) view.findViewById(R.id.tick);
        phone1.setText(contactModels.get(i).getPhone());
        name1.setText(contactModels.get(i).getName());
        if(contactModels.get(i).isSel())
        {
            tick.setSelected(true);
        }
        else
        {
            tick.setSelected(true);
        }
 tick.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                contactModels.get(i).setSel(isChecked);
                notifyDataSetChanged();
//for getting ticked count

int count=0;
for(ContactModel c:contactModels)
{
if(c.isSel())
{
count++;
}
}
// show count
act.getActionBar().setTitle(String.valueOf(count));
                }
            });
            return view;
        }
    }

In Activity

 List<ContactModel> cmodelList= new ArrayList<>();
      cmodelList.add(new ContactModel(phonenumber, name, false));
      cmodelList.add(new ContactModel(phonenumber2, name2, false));
      cmodelList.add(new ContactModel(phonenumber3, name3, false));

           ContactADAPTER contactAdapter=new ContactADAPTER(Phone_Contact_List.this,cmodelList);
            listView.setAdapter(contactList);
0 голосов
/ 03 декабря 2018

Ваш адаптер будет иметь метод «getView ()», с помощью которого вы будете выполнять всю работу по заполнению данных ячеек, использовать getItem (position), чтобы получить элемент, а затем обновлять все ваши представления в ячейке во время этого getView ().метод

0 голосов
/ 03 декабря 2018

Вы должны сохранить список выбранных флажков, а затем set или unset флажок, основанный на этом списке.

Итак, допустим, у вас есть список selectedcheckBox, в котором есть список выбранныхcheckbox.

ArrayList<> selectedcheckBox = new ArrayList<>();

Итак, что вы можете сделать:

lstdept.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                if (view != null) {
                    selectedcheckBox.add(//Add item to the list)
                    CheckBox checkBox = (CheckBox) view.findViewById(R.id.list_view_item_checkbox);
                    checkBox.setChecked(!checkBox.isChecked());
                    if (!checkBox.isChecked()) {
                        test = test - 1 ;
                    } else {
                        test = test + 1 ;
                    }
                }
               getSupportActionBar().setTitle(country + "              Total Count: " + lstdept.getCount()+"       " + test);
            }

        });

И когда вы заполняете listView в своем адаптере, сделайте проверку с помощью списка selectedcheckBox.Если значение установлено в списке, тогда set флажок еще unset.

Причина, по которой это происходит, потому что listView самопроизвольно перезагружается, когда выходит из представления и снова становится видимым.Таким образом, все значения устанавливаются снова, поскольку они снова становятся видимыми.Поэтому необходимо поддерживать надлежащие проверки, чтобы раздуть представление.

...