Android - ListView中的多个选择

时间:2013-11-21 15:55:30

标签: android android-listview

好吧,我整天都试图在列表视图中添加Checkbox。我有两部分

  1. 如果我点击列表框中的任何项目,它将加载某些内容(此部分已经实现)。
  2. 每个项目都有一个复选框。我希望能够检查任何10个或任意数量的项目,这样即使我滚动列表,选择也不会丢失。
  3. 有人可以帮我解决这个问题吗?我检查的解决方案之一是this solution,但除非有必要,否则我不想重构整个代码。

    MAINACTIVITY:

    public class ShowList  extends Activity{
    
        static final String LIST_KEY_ID = "bookid";
        static final String LIST_KEY_NAME = "bookname";
        static final String LIST_KEY_WRITER = "writer";
    
        ListView list;
        MylibmanList adapter;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_show_list);
            setupActionBar();
    
            mylibmandbhandler db = new mylibmandbhandler(this);
            List<mylibman> allfld = db.getAllRecord();
            db.close();
            ArrayList<HashMap<String, String>> allbookList = new ArrayList<HashMap<String, String>>();
            for (mylibman cn : allfld) {
                HashMap<String, String> map = new HashMap<String, String>();
                    map.put(LIST_KEY_ID, Integer.toString(cn.getBookid()));
                map.put(LIST_KEY_NAME, cn.getBookname());
                    map.put(LIST_KEY_WRITER, cn.getWriter());
    
                    allbookList.add(map);
            }
            list=(ListView)findViewById(R.id.list);
            adapter=new MylibmanList(this, allbookList);
            list.setAdapter(adapter);
    
            list.setOnItemClickListener(new OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    batchid.clear();
                    HashMap<String, String> list_hashMap = (HashMap<String, String>) parent.getItemAtPosition(position);
                    String currlist = list_hashMap.get(LIST_KEY_ID);
                    Intent returnIntent  = new Intent();
                    returnIntent.putExtra("bookid",currlist);
                    setResult(RESULT_OK,returnIntent );
                    finish();
                }
            });
    

    ADAPTER CLASS:

    public class MylibmanList extends BaseAdapter {
            private Activity activity;
            private ArrayList<HashMap<String, String>> data;
            private static LayoutInflater inflater=null;
    
            public MylibmanList(Activity a, ArrayList<HashMap<String, String>> d) {
                activity = a;
                data=d;
                inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            }
    
            static class ViewHolder {
                TextView title;
                TextView artist;
                TextView duration;
                CheckBox check;
            }
    
            public View getView(int position, View convertView, ViewGroup parent) {
                View vi=convertView;
                if(convertView==null)
                    vi = inflater.inflate(R.layout.listrow_row, null);
    
                ViewHolder holder = new ViewHolder();
                holder.title = (TextView)vi.findViewById(R.id.title);
                holder.artist = (TextView)vi.findViewById(R.id.artist);
                holder.duration = (TextView)vi.findViewById(R.id.duration);
                holder.check = (CheckBox)vi.findViewById(R.id.check);
    
                holder.check.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                    @Override
                    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                        Log.d("test","t3"); // Don't know what to do 
                    }
                });
                vi.setTag(holder);
                holder.check.setTag(data.get(position));
    
                HashMap<String, String> book = new HashMap<String, String>();
                book = data.get(position);
    
                ViewHolder holderfin = (ViewHolder) vi.getTag();
                holderfin.title.setText(book.get(ShowList.LIST_KEY_NAME));
                holderfin.artist.setText(book.get(ShowList.LIST_KEY_WRITER));
                holderfin.duration.setText(book.get(ShowList.LIST_KEY_ID));
                holderfin.check.setChecked(false);
                return vi;
            }
        }
    

    XML:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:padding="5dip" >
    
        <LinearLayout android:id="@+id/thumbnail"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="3dip"
            android:layout_alignParentLeft="true"
            android:background="@drawable/image_bg"
            android:layout_marginRight="5dip">
     <!--
            <ImageView
                android:id="@+id/list_image"
                android:contentDescription="@string/bookimage"
                android:layout_width="50dip"
                android:layout_height="50dip"/>
     -->
        </LinearLayout>
    
    
        <TextView
            android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignTop="@+id/thumbnail"
            android:layout_toRightOf="@+id/thumbnail"
            android:focusableInTouchMode="false"
            android:clickable="false"
            android:focusable="false"
            android:textColor="#040404"
            android:typeface="sans"
            android:textSize="18sp"
            android:textStyle="bold"/>
    
    
        <TextView
            android:id="@+id/artist"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/title"
            android:focusableInTouchMode="false"
            android:clickable="false"
            android:focusable="false"
            android:textColor="#343434"
            android:textSize="13sp"
            android:layout_marginTop="1dip"
            android:layout_toRightOf="@+id/thumbnail" />
    
    
        <TextView
            android:id="@+id/duration"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_alignTop="@id/title"
            android:gravity="right"
            android:focusableInTouchMode="false"
            android:clickable="false"
            android:focusable="false"
            android:layout_marginRight="5dip"
            android:textSize="12sp"
            android:textColor="#10bcc9"
            android:textStyle="bold"/>
    
         <CheckBox
            android:id="@+id/check"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:focusable="false"
            android:layout_marginRight="10dp" />
    </RelativeLayout>
    

1 个答案:

答案 0 :(得分:1)

基本上,您可以拥有仅包含所选项的哈希集。代码看起来像这样

public class MylibmanList extends BaseAdapter {
    private Activity activity;
    private ArrayList<HashMap<String, String>> data;
    private static LayoutInflater inflater=null;

    HashSet<String> selectedBooks = new HashSet<String>();

    //This listener will be used on all your checkboxes, there's no need to 
    //create a listener for every checkbox.
    CompoundButton.OnCheckedChangeListener checkChangedListener = new CompoundButton.OnCheckedChangeListener{
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                String bookDuration = (String) buttonView.getTag();
                if(isChecked){
                    selectedBooks.add(bookDuration);
                }else{
                    selectedBooks.remove(bookDuration);
                }
            }
    }


    public MylibmanList(Activity a, ArrayList<HashMap<String, String>> d) {
        activity = a;
        data=d;
        inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    static class ViewHolder {
        TextView title;
        TextView artist;
        TextView duration;
        CheckBox check;
    }


    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if(convertView==null){
            convertView = inflater.inflate(R.layout.listrow_row, null);

            holder = new ViewHolder();
            holder.title = (TextView) convertView.findViewById(R.id.title);
            holder.artist = (TextView) convertView.findViewById(R.id.artist);
            holder.duration = (TextView) convertView.findViewById(R.id.duration);
            holder.check = (CheckBox) convertView.findViewById(R.id.check);


            holder.check.setOnCheckedChangeListener(checkChangedListener);

            convertView.setTag(holder);
        }else{
            holder = (ViewHolder) convertView.getTag();
        }


        HashMap<String, String> book = new HashMap<String, String>();
        book = (HashMap<String, String>) getItem(position);

        holder.check.setTag(book.get(ShowList.LIST_KEY_ID));

        holder.title.setText(book.get(ShowList.LIST_KEY_NAME));
        holder.artist.setText(book.get(ShowList.LIST_KEY_WRITER));
        holder.duration.setText(book.get(ShowList.LIST_KEY_ID));

        boolean bookSelected = false;
        if(selectedBooks.contains(book.get(ShowList.LIST_KEY_ID))){
            bookSelected = true;
        }

        holder.check.setChecked(bookSelected);

        return convertView;
    }

我已经改变了你的getView abit。现在,viewHolder将仅为每个视图创建一次(应该如此)。此外,如果它不是太多的喧嚣,你应该为你的书创建一个类。像

这样的东西
Class Book{
    String title;
    String artist;
    Long duration;
}