How to get a android ListView item selector to use state_checked

前端 未结 3 982
攒了一身酷
攒了一身酷 2020-12-13 10:27

Tearing my hair out trying to get an Android ListView to do what I want.

I want to have a ListView in single choice mode with a custom row layout that has a differe

3条回答
  •  不思量自难忘°
    2020-12-13 10:59

    IMHO, it's easier to use a custom adapter:

    class CustomAdapter extends ArrayAdapter {
        Context context;
    
        public CustomAdapter(Context context, int resourceId, List items) {
            super(context, resourceId, items);
            this.context = context;
        }
    
        private class ViewHolder {
            TextView txt;
            View layout;
        }
    
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder = null;
            CustomRowItem rowItem = getItem(position);
    
            LayoutInflater mInflater = (LayoutInflater) context
                .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
            if (convertView == null) {
                convertView = mInflater.inflate(R.layout.сustom_list, null);
                holder = new ViewHolder();
                holder.txt = (TextView) convertView.findViewById(R.id.сustom_list_txt);
                holder.layout = convertView.findViewById(R.id.сustom_list_layout);
                convertView.setTag(holder);
            } else
                holder = (ViewHolder) convertView.getTag();
    
            holder.txt.setText(rowItem.getText());
            if(rowItem.isChecked())
                holder.layout.setBackgroundColor(-16720999); //color for checked
            else
                holder.layout.setBackgroundColor(0); //color for unchecked
    
            return convertView;
        }
    
    }
    
    class CustomRowItem {
        private boolean value;
        private String text;
    
        public CustomRowItem(String text, boolean value) {
            this.text = text;
            this.value = value;
        }
        public boolean isChecked() {
            return value;
        }
        public void setChecked(boolean checked) {
            value = checked;
        }
        public String getText() {
            return text;
        }
        void setText(String text) {
            this.text = text;
        }
    } 
    

    сustom_list.xml :

    
    
        
    
    

    How use:

    public class ExampleAct extends Activity {
    
        final List list = new ArrayList();
        CustomAdapter adapter;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.example);
    
            ListView listView=(ListView)findViewById(R.id.listView);
    
            adapter = new CustomAdapter(this, R.layout.сustom_list, list);
            listView.setAdapter(adapter);
    
            list.add(new CustomRowItem("unchecked item",false));
            list.add(new CustomRowItem("checked item",true));
    
            adapter.notifyDataSetChanged();
    
            listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { //unchecked on click
                @Override
                public void onItemClick(AdapterView parent, View itemClicked, int index, long id) {
                    if(list.get(index).isChecked()) {
                        list.get(index).setChecked(false); //uncheck
                        adapter.notifyDataSetChanged();
                    } else {
                        // other actions
                    }
    
            });
    
            listView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { //checked on long click
                @Override
                public boolean onItemLongClick(AdapterView parent, View itemClicked, int index, long id) {
                    list.get(index).setChecked(true); //check
                    adapter.notifyDataSetChanged();
                    return true; // or false for calling context menu
                }
            });
    
        }
    

提交回复
热议问题