【问题标题】:ListView click show/hide all check boxListView 单击显示/隐藏所有复选框
【发布时间】:2016-06-18 19:37:31
【问题描述】:

我有一个列表视图,它有一个复选框和两个文本字段,我想在单击功能时从列表视图更改复选框可见性属性,我可以从 getView 功能内部更改属性,但我希望它来自列表视图点击。帮我找到解决办法

public class HelpList extends Fragment {

amfFunctions amf;
MyCustomAdapter dataAdapter = null;
Database_Contact contact = new Database_Contact();
DBHelper mydb = new DBHelper(getActivity());
public static final int PICK_CONTACT = 1;
public String user_phone_number;
public String buddyName;
public String buddyNum;
LayoutInflater vi;
View v ;
Fragment fragment = null;
Button myAddButton,myDelButton;
int selected = 0;
Boolean isInternetPresent = false;
ConnectionDetector cd;
ArrayList<Database_Contact> selectedList = new ArrayList<>();
Database_Contact addcontacts = new Database_Contact();

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    v = inflater.inflate(R.layout.activity_helplist, container, false);
    // Inflate the layout for this fragment
    displayListView();
    cd = new ConnectionDetector(getActivity());
    myDelButton = (Button)v. findViewById(R.id.deleteContact);
    myDelButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            isInternetPresent = cd.isConnectingToInternet();
            if (isInternetPresent) {
                DeleteContact();
            }
            else{
                Toast.makeText(getActivity(),     
 getString(R.string.nointernet), Toast.LENGTH_SHORT).show();
            }
        }
    });
    Constants.i = 0;
    myAddButton = (Button)v. findViewById(R.id.Addanother);
    myAddButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            isInternetPresent = cd.isConnectingToInternet();
            Log.e("Myaddbutton text ", (String) myAddButton.getText());
            if (isInternetPresent) {
                if (myAddButton.getText().equals("Close")){
                    Toast.makeText(getActivity(), 
 getString(R.string.click_to_close), Toast.LENGTH_SHORT).show();
                }
                else{
                    AddContact();
                }

            }
            else{
                Toast.makeText(getActivity(), 
 getString(R.string.nointernet), Toast.LENGTH_LONG).show();
            }
        }
    });
    return v;
}

private void displayListView() {
    mydb = new DBHelper(getActivity());
    ArrayList<Database_Contact> contactlist = (ArrayList<Database_Contact>) 
mydb.getAllDatabase_Contacts();

    Collections.sort(contactlist, new Comparator<Database_Contact>() {
        @Override
        public int compare(Database_Contact lhs, Database_Contact rhs) {
            return lhs.getName().compareTo(rhs.getName());
        }
    });

    //create an ArrayAdaptar from the String Array
    dataAdapter = new MyCustomAdapter(getActivity(), 
 R.layout.activity_allcontactlist, contactlist);
    ListView listView = (ListView)v.findViewById(R.id.helplistview);
    // Assign adapter to ListView
    listView.setTextFilterEnabled(true);
    listView.setAdapter(dataAdapter);
    dataAdapter.notifyDataSetChanged();

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view,
                                int position, long id) {
            // When clicked, show a toast with the TextView text
            Database_Contact contact = (Database_Contact) 
 parent.getItemAtPosition(position);
            contact.isSelected();
        }
    });
}

private class MyCustomAdapter extends ArrayAdapter<Database_Contact> {

    private ArrayList<Database_Contact> contactlist;
    public MyCustomAdapter(Context context, int textViewResourceId,
                           ArrayList<Database_Contact> contactlist) {
        super(context, textViewResourceId, contactlist);
        this.contactlist = new ArrayList<Database_Contact>();
        this.contactlist.addAll(contactlist);
    }

    private class ViewHolder {
        TextView code;
        TextView Number;
        CheckBox name;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        if (convertView == null) {
            vi = (LayoutInflater) getActivity().getSystemService(
                    Context.LAYOUT_INFLATER_SERVICE);
            convertView = vi.inflate(R.layout.activity_allcontactlist, 
null);

            holder = new ViewHolder();

            holder.code = (TextView) 
 convertView.findViewById(R.id.helplist_name);
            holder.Number = (TextView) 
 convertView.findViewById(R.id.helplist_num);
            holder.name = (CheckBox) 
 convertView.findViewById(R.id.checkbox_all);
            convertView.setTag(holder);
            final ViewHolder finalHolder = holder;
            final ViewHolder finalHolder1 = holder;

            holder.code.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (finalHolder1.name.isShown() == false){
                        Constants.i = Constants.i+1;
                        myDelButton.setEnabled(true);
                        finalHolder.name.setVisibility(View.VISIBLE);
                    }
                    else if(finalHolder1.name.isShown() == true) {
                        finalHolder.name.setVisibility(View.GONE);
                        Constants.i = Constants.i-1;
                        if (Constants.i == 0){
                            myDelButton.setEnabled(false);
                        }
                    }
                }
            });
            holder.Number.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (finalHolder1.name.isShown() == false){
                        Constants.i = Constants.i+1;
                        myDelButton.setEnabled(true);
                        finalHolder.name.setVisibility(View.VISIBLE);
                    }
                    else if(finalHolder1.name.isShown() == true) {
                        finalHolder.name.setVisibility(View.GONE);
                        Constants.i = Constants.i-1;
                        if (Constants.i == 0){
                            myDelButton.setEnabled(false);
                        }
                    }
                }
            });

            holder.name.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    CheckBox cb = (CheckBox) v;
                    Database_Contact contact = (Database_Contact) 
 cb.getTag();
                    contact.setSelected(cb.isChecked());
                }
            });
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        Database_Contact contact = contactlist.get(position);
        holder.code.setText(contact.getName());
        holder.Number.setText(contact.getPhoneNumber());
        holder.name.setText("");
        holder.name.setChecked(contact.isSelected());
        holder.name.setTag(contact);
        return convertView;
    }
}
}

【问题讨论】:

    标签: android listview


    【解决方案1】:

    由于我找不到任何完美的解决方案,我以不同的方式尝试了它,尽管它与我想要的有点不同,即点击时我使用了我的 displayListView() 功能并完成了工作

             ischeckboxVisible = true;
             Runnable run = new Runnable() {
             @Override
             public void run() {
                 displayListView();
             }
             };
             getActivity().runOnUiThread(run);
    

    来到我用过的getView:

                if (!ischeckboxVisible)
                {
                    holder.name.setVisibility(View.GONE);
                }
                if (ischeckboxVisible)
                {
                    holder.name.setVisibility(View.VISIBLE);
                }
    

    所以每次我点击它都会将 ischeckboxVisible 更改为 true 或 false 并初始化 displatListview() 并且它可以工作。

    我从这里得到了帮助 Android hide and show checkboxes in custome listview on button click

    希望这对外面的人有用。

    【讨论】:

      【解决方案2】:

      如果对你有帮助,请检查下面的代码,

            listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                    public void onItemClick(AdapterView<?> parent, View view,
                                  int position, long id) {
                      // When clicked, show a toast with the TextView text
                      Database_Contact contact = (Database_Contact) contactlist.get(position);
                     contact.setSelected(!contact.isSelected());
      
                    if(contact.isSelected())
                    {
                        ((CheckBox) view.findViewById(R.id.checkbox_all)).setVisibility(View.VISIBLE);
                    }
                    else
                     {
                       ((CheckBox) view.findViewById(R.id.checkbox_all)).setVisibility(View.GONE);
                     }
          }
      });
      

      【讨论】:

      • 如果我尝试单击其他行它不起作用,它只适用于第一行......我希望我的所有复选框都可以在单击和上面看到想法不那样工作........谢谢你的想法
      • 再次检查您提到的要求,您提到如果您单击列表视图项,那么它应该设置该复选框的可见性而不是全部
      • 是的,我知道您的答案确实适用于第一行,但如果我点击其他一些它仍然不起作用,它仍然只编辑第一行
      • 为此您需要更改以下行:Database_Contact contact = (Database_Contact) parent.getItemAtPosition(position); by Database_Contact contact = (Database_Contact) contactlist.get(position);
      • 我试过了,它仍然一样我无法获得复选框的位置来更改其唯一接受位置“0”但从上面回答联系人数组中的值正确更改.如果我点击第二行,它仍然只改变第一行
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-18
      • 2018-03-30
      • 1970-01-01
      • 1970-01-01
      • 2019-02-02
      • 2019-02-15
      • 2021-12-30
      相关资源
      最近更新 更多