Android: przycisk radiowy w widoku listy niestandardowej
Rozwijam aplikację, w której muszę zaimplementować przyciski radiowe w widoku listy. Chcę zaimplementować widok listy mający jeden przycisk radiowy i dwa widoki tekstowe w każdym wierszu. I jeden przycisk " Ok " poniżej listview.
To, co zrobiłem, to stworzyłem widok listy i Niestandardowy adapter. Kod listview jest następujący:
<ListView
android:id="@+id/listview"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:cacheColorHint="#00000000"
android:overScrollMode="never"
tools:ignore="NestedScrolling"
android:choiceMode="singleChoice" >
</ListView>
I stworzyłem niestandardowy układ adaptera jako:
<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<TableRow
android:layout_width="fill_parent"
android:layout_height="wrap_content"
tools:ignore="UselessParent" >
<RadioButton
android:id="@+id/radiobutton"
android:layout_width="0sp"
android:layout_height="wrap_content"
android:layout_weight=".1" />
<TextView
android:id="@+id/textview1"
android:layout_width="0sp"
android:layout_height="wrap_content"
android:layout_weight=".3" />
<TextView
android:id="@+id/textview2"
android:layout_width="0sp"
android:layout_height="wrap_content"
android:layout_weight=".3" />
</TableRow>
</TableLayout>
Kod Javy fragmentu jest następujący:
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) {}
A kod adaptera jest jak follows:
public class CustomAdapter extends ArrayAdapter<String> {
/** 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;
}
}
Dane z textview1 są wypełniane z bazy danych SQLite, a na textview2 dane są "Status zamknięty". Po wybraniu lub kliknięciu dowolnego przycisku opcji Tekst widoku tekstowego zostanie zmieniony na"stan otwarty".
Problem w tym, że: potrzeba aplikacji jest to, że tylko jeden przycisk radiowy powinien uzyskać select i dane textview2 uzyskać zmianę przy wyborze. A po kliknięciu drugiego przycisku radiowego dostaje select, a poprzedni powinien się odznaczyć i tekst textview2 zostanie zmieniony na "Status zamknięty" wcześniej wybranego przycisku radiowego i kliknij przycisk radiowy na "Status otwarty".
Edytuj 1:
And onclick on" OK " button I want to get the position, text of list view textview1 and textview2, as i want to save that text in SQLite database in deview.
Proszę, poprowadź mnie, jakie kroki powinienem wykonać. Jestem w trakcie aplikacji. Twoje cenne wskazówki są wymagane.
2 answers
Oto najważniejsze pomysły]}
- Gdy zaznaczone jest
RadioButton
, musimy wywołaćnotifyDataSetChanged()
, aby wszystkie widoki zostały zaktualizowane. - Gdy zaznaczone jest
RadioButton
musimy ustawićselectedPosition
, aby śledzić, któreRadioButton
jest zaznaczone -
View
S są poddawane recyklingowi wewnątrzListView
s. dlatego ich pozycja bezwzględna zmienia się wListView
. Dlatego wewnątrzListAdapter#getView()
musimy wywołać {[10] } na każdymRadioButton
. Pozwala nam to określić aktualną pozycjęRadioButton
na liście, gdyRadioButton
jest / align = "left" / -
RadioButton#setChecked()
muszą być aktualizowane wewnątrzgetView()
dla nowych lub wcześniej istniejącychView
s.
Oto przykład ArrayAdapter, który napisałem i przetestowałem, aby zademonstrować te pomysły
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<Integer> adapter = new ArrayAdapter<Integer>(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);
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-27 20:04:14
Spróbuj poniżej adaptera:
public class ChooseAdapter extends ArrayAdapter<LinkedHashMap<String, String>> {
private ArrayList<LinkedHashMap<String, String>> listMenu;
int position_id;
private LayoutInflater inflater;
Context context;
public ChooseAdapter(Activity activity,
ArrayList<LinkedHashMap<String, String>> 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;
}
}
A układ który nadmuchuję to:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<CheckBox
android:id="@+id/selection_checkbox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:text="abc"
android:textColor="#8C8C8C"
android:textSize="16sp" />
</LinearLayout>
Tutaj, użyłem checkbox, można również użyć radiobutton zamiast niego, nic więcej nie jest potrzebne do zmiany.
Mam nadzieję, że to pomoże!Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-05 11:42:32