简体   繁体   中英

CheckBox in custom ListView on Android

I got a custom ListView, and I put three TextView in the List using a custom List Adapter! How I can to add a CheckBox with each List Item and make each CheckBox checked on list item click?

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/name"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:textColor="#7a4b9d"
        android:textSize="15sp"
        android:textStyle="bold" />

    <TextView
        android:id="@+id/calorie"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="sdf"
        android:textColor="#ffffff" />

    <TextView
        android:id="@+id/price"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="sdf"
        android:textColor="#ffffff" />
    <CheckBox
         android:id="@+id/chkBox1"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:text="CheckBox" />

</LinearLayout> 

MainActivity

public class Main_Activity extends Fragment implements OnClickListener {

    private ListView lv;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        ViewGroup root = (ViewGroup) inflater.inflate(R.layout.main_activity, null);


        ArrayList<SearchResults> searchResults = GetSearchResults();

        final ListView lv = (ListView) root.findViewById(R.id.list_two);
        lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
        lv.setTextFilterEnabled(true);
        lv.setAdapter(new MyCustomBaseAdapter(getActivity(), searchResults));

        lv.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> a, View v, int position,
                    long id) {

                                  boolean result = searchResults.get(position).isSolved();
                if (result) {
                    searchResults.get(position).setSolved(false);
                } else {
                     searchResults.get(position).setSolved(true);
                }

                 Toast.makeText(getActivity(),"You have chosen: " + " " +
                 fullObject.getPhone(), Toast.LENGTH_SHORT).show();

            }
        });

        return root;

    }

    private ArrayList<SearchResults> GetSearchResults() {
        ArrayList<SearchResults> results = new ArrayList<SearchResults>();

        SearchResults sr = new SearchResults();
        sr.setName("Apple");
        sr.setCalorie("35");
        sr.setPrice("5");
        results.add(sr);

        return results;
    }


}

Custom Base Adapter

public class MyCustomBaseAdapter extends BaseAdapter {
    private static ArrayList<SearchResults> searchArrayList;

    private LayoutInflater mInflater;

    public MyCustomBaseAdapter(Context context, ArrayList<SearchResults> results) {
        searchArrayList = results;
        mInflater = LayoutInflater.from(context);
    }

    public int getCount() {
        return searchArrayList.size();
    }

    public Object getItem(int position) {
        return searchArrayList.get(position);
    }

    public long getItemId(int position) {
        return position;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.custom_row_view, null);
            holder = new ViewHolder();
            holder.txtName = (TextView) convertView.findViewById(R.id.name);
            holder.txtCalorie = (TextView) convertView
                    .findViewById(R.id.calorie);
            holder.txtPrice = (TextView) convertView.findViewById(R.id.price);
    holder.chkBox1 = (CheckBox)convertView.findViewById(R.id.chkBox1);


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

    holder.txtName.setText(searchArrayList.get(position).getName());
    holder.txtCalorie.setText(searchArrayList.get(position)
            .getCalorie());
    holder.txtPrice.setText(searchArrayList.get(position).getPrice());
    holder.chkBox1.setChecked(searchArrayList.get(position).isSolved());


    return convertView;
}

static class ViewHolder {
    CheckBox chkBox1;
    TextView txtName;
    TextView txtCalorie;
    TextView txtPrice;
}

Search Results

public boolean isSolved() {
    // TODO Auto-generated method stub
    return b;
}

public void setSolved(boolean b) {
    // TODO Auto-generated method stub
    this.b = b;
}

You will have to define your CheckBox view in custom_row_view.xml file first,

<CheckBox android:id="@+id/chkBox1"
 android:layout_width=...
 android:layout_height=... />

Then, you wll have to call this reference in your MyCustomBaseAdapter class or in the holder in your case, like

CheckBox chkBox1;

then,

holder.chkBox1 = = (CheckBox)convertView.findViewById(R.id.chkBox1);

You can define a boolean value in your SearchResults class which can take care of chkBox check and use

 holder.chkBox1.setChecked(searchArrayList.get(position).isSolved());

Something on these lines and you will be good to go :)

EDIT: Remember to change the value of boolean in searchResult instance on itemClick.

boolean result = searchResults.get(position).isSolved();
if (result) {
    searchResults.get(position).setSolved(false);
} else {
     searchResults.get(position).setSolved(true);
}
lv.getAdapter().notifyDataSetChanged();

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM