I want to make a custom List View having Two TextViews and a radio Button in a single row. And on listitem click the radio button state should be toggle. I cannot use Simple Adapter here.
I have already asked that question Single choice ListView custom Row Layout but don't find any satisfactory solution.
What I am currently doing is I am using simple_list_item_single_choice and putting data of both TextViews in a single one separated by some white spaces. But here it is getting worse (shown in the image below).
What I want is to fix the location of size and price and make list view as single choice.
XML Layout for the list can be something like:
**<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/layout"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:orientation="horizontal" >
<TextView
android:id="@+id/tv_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView"
android:textSize="15sp"
android:width="200dp" />
<TextView
android:id="@+id/tv_price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView"
android:textSize="15sp"
android:width="70dp" />
<RadioButton
android:id="@+id/radioButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>**
How to make custom adapter for that?
I had a similar situation but fixed that easily. Try this:
Extend ListActivity and set your custom list adapter
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE); //if you need title to be hidden
setContentView(R.layout.activity_add_to_cart_select_service_plan);
setListAdapter(adapter);
}
Create a field to store selected index position in adapter
int selectedIndex = -1;
Provide an interface to it
public void setSelectedIndex(int index){
selectedIndex = index;
}
Set the checked state to true or false based on the selected index inside getView()
@Override
public View getView(int position, View convertView, ViewGroup parent) {
RadioButton rbSelect = (RadioButton) convertView
.findViewById(R.id.radio1);
if(selectedIndex == position){
rbSelect.setChecked(true);
}
else{
rbSelect.setChecked(false);
}
}
Set radio button focusable and clickable attribs to 'false'
<RadioButton
android:id="@+id/radio1"
android:checked="false"
android:focusable="false"
android:clickable="false"
/>
Set listview descendantFocusability attrib to 'beforeDescendants'
<ListView
android:id="@android:id/list"
android:choiceMode="singleChoice"
android:descendantFocusability="beforeDescendants"
/>
Override onListItemClick
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
adapter.setSelectedIndex(position);
adapter.notifyDataSetChanged();
}
That's it..run and check
I've been searching for an answer to this problem all morning, and the most useful thing I've found so far is this article.
While I haven't implemented the solution it suggests yet, it sounds like it's on the right track.
Basically, the single-choice ListView
expects the widgets you provide it with to implement the Checkable
interface. LinearLayout
et al don't. So you need to create a custom layout that inherits LinearLayout
(or whatever layout you want to use for your items) and implements the necessary interface.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With