Android: кнопка «Радио» в пользовательском списке

Я разрабатываю приложение, в котором мне нужно реализовать переключатели в представлении списка. Я хочу реализовать представление списка с одним переключателем и двумя текстовыми представлениями в каждой строке. И одна кнопка «ОК» ниже списка.

Я сделал это, я создал представление списка и пользовательский адаптер. Код listview выглядит так:

  

И я создал собственный макет адаптера:

         

Код fragmentа java выглядит следующим образом:

 ListView listView = (ListView) view.findViewById(R.id.listview); // values is a StringArray holding some string values. CustomAdapter customAdapter = new CustomAdapter (getActivity(), values); listView.setAdapter(customAdapter ); listView.setOnItemClickListener(this); @Override public void onItemClick(AdapterView arg0, View arg1, int position, long arg3) {} 

И код адаптера выглядит следующим образом:

 public class CustomAdapter extends ArrayAdapter { /** Global declaration of variables. As there scope lies in whole class. */ private Context context; private String[] listOfValues; /** Constructor Class */ public CustomAdapter (Context c,String[] values) { super(c,R.layout.adapter_layout,values); this.context = c; this.listOfValues = values; } /** Implement getView method for customizing row of list view. */ public View getView(final int position, View convertView, ViewGroup parent) { LayoutInflater inflater = ((Activity)context).getLayoutInflater(); // Creating a view of row. View rowView = inflater.inflate(R.layout.adapter_layout, parent, false); TextView textView1 = (TextView)rowView.findViewById(R.id.textview1); TextView textView2 = (TextView)rowView.findViewById(R.id.textview2); RadioButton radioButton = (RadioButton) rowView.findViewById(R.id.radiobutton); radioButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(context, CustomAdapter[position], Toast.LENGTH_SHORT).show(); } }); return rowView; } } 

Данные textview1 заполняются из базы данных SQLite, а в textview2 данные «Status Closed». При выборе или щелкнув любую кнопку, текст текстового вида изменится на «Status Open».

Проблема заключается в следующем: потребность приложения заключается в том, что только один переключатель должен выбрать select и данные textview2 получить изменения при выборе. И когда пользователь нажимает на другой переключатель, он получает выбор, а предыдущий должен отменить выделение, а текст textview2 будет изменен на «Status Closed» ранее выбранного переключателя и щелкнул переключатель на «Status Open».

Изменить 1:

И onclick на кнопке «ОК» я хочу получить позицию, текст списка listview1 и textview2, так как я хочу сохранить этот текст в базе данных SQLite в deview.

Пожалуйста, расскажите мне, какие шаги я должен соблюдать. Я нахожусь в середине моего заявления. Требуется ваше ценное руководство.

Вот основные идеи

  • когда проверяется RadioButton мы должны вызвать notifyDataSetChanged() , чтобы все просмотры обновлялись.
  • когда флажок RadioButton проверен, мы должны установить selectedPosition , чтобы отслеживать, какой RadioButton выбран
  • View s возвращаются в ListView s. Поэтому их абсолютная позиция изменяется в ListView . Поэтому внутри ListAdapter#getView() мы должны называть setTag() на каждом RadioButton . Это позволяет нам определить текущую позицию RadioButton в списке при нажатии на RadioButton .
  • RadioButton#setChecked() необходимо обновить внутри getView() для новых или уже существующих View .

Вот пример ArrayAdapter, который я написал и протестировал, чтобы продемонстрировать эти идеи

 public class MainActivity extends ListActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // I do no use these values anywhere inside the ArrayAdapter. I could, but don't. final Integer[] values = new Integer[] {1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,1,2,3,4,5,}; ArrayAdapter adapter = new ArrayAdapter(this, R.layout.row, R.id.textview, values) { int selectedPosition = 0; @Override public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; if (v == null) { LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = vi.inflate(R.layout.row, null); RadioButton r = (RadioButton)v.findViewById(R.id.radiobutton); } TextView tv = (TextView)v.findViewById(R.id.textview); tv.setText("Text view #" + position); RadioButton r = (RadioButton)v.findViewById(R.id.radiobutton); r.setChecked(position == selectedPosition); r.setTag(position); r.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { selectedPosition = (Integer)view.getTag(); notifyDataSetChanged(); } }); return v; } }; setListAdapter(adapter); } } 

Попробуйте адаптер ниже:

 public class ChooseAdapter extends ArrayAdapter> { private ArrayList> listMenu; int position_id; private LayoutInflater inflater; Context context; public ChooseAdapter(Activity activity, ArrayList> listMenu, int type) { super(activity, R.layout.choose_single_item, listMenu); this.listMenu = listMenu; context = activity.getApplicationContext(); inflater = LayoutInflater.from(context); } public int getCount() { return listMenu.size(); } public long getItemId(int position) { return position; } public static class ViewHolder { public CheckBox chk; } public View getView(final int position, View convertView, ViewGroup parent) { final ViewHolder view; if (convertView == null) { view = new ViewHolder(); convertView = inflater.inflate(R.layout.choose_single_item, null); view.chk = (CheckBox) convertView .findViewById(R.id.selection_checkbox); view.chk.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { // TODO Auto-generated method stub if (isChecked) { listMenu.get((Integer) buttonView.getTag()).put( "checked", "true"); for (int i = 0; i < listMenu.size(); i++) { if (i != (Integer) buttonView.getTag()) { if (listMenu.get(i).containsKey("checked")) listMenu.get(i).remove("checked"); } } } else { listMenu.get((Integer) buttonView.getTag()).remove( "checked"); } notifyDataSetChanged(); } }); convertView.setTag(R.id.selection_checkbox, view.chk); convertView.setTag(view); } else { view = (ViewHolder) convertView.getTag(); } view.chk.setTag(position); view.chk.setText(listMenu.get(position).get("name")); if (listMenu.get(position).containsKey("checked")) { view.chk.setChecked(true); } else view.chk.setChecked(false); return convertView; } } 

И макет, который я раздуваю:

     

Здесь я использовал этот флажок, вы также можете использовать радиообъект вместо него, больше ничего не нужно менять.

Надеюсь, поможет!

Давайте будем гением компьютера.