Reputation: 729
I am using json parsing, on button's click I have one alert dialog with listview and Radio Button . List is dynamically generated. by default first radio button of list is selected, Now issue is if I select second item and close the dialog , and again when I open it shows first radio button selected instead of second . Following is my code can any one help?
Adapter
public class CustomListAdapterSize extends BaseAdapter {
private Context context;
private LayoutInflater inflater;
private List<ProdSizes> movieItems;
private List<ProductPackModel> packItems;
private RadioButton selected =null;
private int mSelectedPosition = 0;
private RadioButton mSelectedRB;
public CustomListAdapterSize(Context context,List<ProdSizes> movieItems) {
this.context = context;
this.movieItems=movieItems;
}
@Override
public int getCount() {
return movieItems.size();
}
@Override
public Object getItem(int position) {
return movieItems.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
convertView = LayoutInflater.from(context).inflate(com.vetsupply.au.project.R.layout.listitem_productsizes, null);
holder.txtproname = (TextView) convertView.findViewById(com.vetsupply.au.project.R.id.txtproductsizenames);
holder.txtproprice = (TextView) convertView.findViewById(com.vetsupply.au.project.R.id.txtproductsizeprice);
holder.radioBtn = (RadioButton)convertView.findViewById(com.vetsupply.au.project.R.id.productsize_radio);
convertView.setTag(holder);
}else{
holder = (ViewHolder) convertView.getTag();
}
// getting movie data for the row
final ProdSizes m = movieItems.get(position);
// title
holder.txtproname.setText(m.getProViews_Size());
holder.txtproprice.setText("$"+m.getProViews_MinPrice());
if (position == getCount() - 1) {
if (selected == null) {
holder.radioBtn.setChecked(true);
selected = holder.radioBtn;
/*for(int i=0;i<movieItems.size();i++)
{
sizenms = movieItems.get(i).getProViews_Size();
}
*/
}
}
holder.radioBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (selected != null) {
selected.setChecked(false);
}
holder.radioBtn.setChecked(true);
selected = holder.radioBtn;
ids = m.getProViews_ID();
sizenms = m.getProViews_Size();
System.out.println(">>>>>>>>>>>>>" + ids);
System.out.println("<<<<<<<<<<<" + sizenms);
dialogf.dismiss();
}
});
return convertView;
}
class ViewHolder{
TextView txtproname,txtproprice;
public RadioButton radioBtn;
}
}
Upvotes: 0
Views: 873
Reputation: 590
Try in this way....
int mSelectedPosition = -1;
public class CustomListAdapterSize extends BaseAdapter{
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// Your Code
holder.checks.setChecked(position==mSelectedPosition );
holder.checks.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(isChecked)
{
mSelectedPosition = position;
}
else{
mSelectedPosition = -1;
}
notifyDataSetChanged();
}
});
return convertView;
}
}
Upvotes: 1
Reputation: 173
Please use Choice Mode and store the position either locally[Shared Preferences] or use to API to store
public class MainActivity extends AppCompatActivity {
ListView mListView;
ArrayList<String> mArrayList;
ArrayAdapter mArrayAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mListView = (ListView) findViewById(R.id.listView_id);
mArrayList = new ArrayList();
mArrayList.add("ONE");
mArrayList.add("TWO");
mArrayList.add("THREE");
mArrayAdapter = new ArrayAdapter(getApplicationContext(),
android.R.layout.simple_list_item_single_choice,
mArrayList);
mListView.setAdapter(mArrayAdapter);
/***Save your position **/
int position = 1;//Save your position in Shared preferences or get it from API
mListView.setItemChecked(position, true);
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
CheckedTextView textView = (CheckedTextView) view;
for (int i = 0; i < mListView.getCount(); i++) {
if (textView != null) {
textView.setTextColor(Color.GREEN);
}
}
mListView.invalidate();
textView = (CheckedTextView) view;
if (textView != null) {
textView.setTextColor(Color.BLUE);
}
}
});
}
}
Please let me know if it helps.
Upvotes: 0
Reputation: 590
Please try this. I think you are not storing position into mSelectedPosition
private int mSelectedPosition = 0;//declare it publically not locally into your adapter
if (position == mSelectedPosition ) {
if (selected == null) {
holder.radioBtn.setChecked(true);
selected = holder.radioBtn;
/*for(int i=0;i<movieItems.size();i++)
{
sizenms = movieItems.get(i).getProViews_Size();
}
*/
}
}
holder.radioBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (selected != null) {
selected.setChecked(false);
}
mSelectedPosition =position;
holder.radioBtn.setChecked(true);
selected = holder.radioBtn;
ids = m.getProViews_ID();
sizenms = m.getProViews_Size();
System.out.println(">>>>>>>>>>>>>" + ids);
System.out.println("<<<<<<<<<<<" + sizenms);
dialogf.dismiss();
}
});
Upvotes: 0