#android #android-layout #android-widget
#Android #android-макет #android-виджет
Вопрос:
Я пытаюсь создать список SingleSelect, расширив ListView с помощью customrow, например
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:descendantFocusability="blocksDescendants"
>
<CheckBox
android:id="@ id/chk"
android:button="@drawable/q_list_check_box"
android:layout_alignParentLeft="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:layout_gravity="center_vertical"
android:gravity="center_vertical"
/>
<TextView
android:id="@ id/txtChoice"
android:textColor="@color/white"
android:layout_gravity="center_vertical|left"
android:gravity="center_vertical|left"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
и с кодом для SingleSelectList, например
public class SingleList extends ListView {
int selected;
List<String> data;
public SingleList(Context context) {
super(context);
this.selected = -1;
this.data = new ArrayList<String>();
}
public SingleList(Context context, AttributeSet attributes) {
super(context, attributes);
this.selected = -1;
this.data = new ArrayList<String>();
}
public int getSelectedIndex() {
return this.selected;
}
public void setSelectedIndex(int selected) {
this.selected = selected;
}
public List<String> getData() {
return this.data;
}
public void setData(List<String> data) {
this.data = data;
this.selected = -1;
}
public String getSelectedValue() {
if (this.selected > -1)
return this.data.get(selected);
return "";
}
public void addDataItem(String item) {
this.data.add(item);
}
public void initialize_list(List<String> data) {
setData(data);
this.setAdapter(new SingleListAdapter());
}
private class SingleListAdapter extends BaseAdapter {
public SingleListAdapter() {
}
@Override
public int getCount() {
return data.size();
}
@Override
public Object getItem(int position) {
return data.get(position);
}
@Override
public long getItemId(int position) {
return data.get(position).hashCode();
}
@Override
public View getView(final int position, final View convertView,
final ViewGroup parent) {
View view = convertView;
if (view == null) {
LayoutInflater inflater = (LayoutInflater) getContext()
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.q_list_row_text, null);
}
final CheckBox chkChoice = (CheckBox) view.findViewById(R.id.chk);
view.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if (selected != -1) {
View tempView = SingleListAdapter.this.getView(
selected, convertView, parent);
CheckBox tempChk = (CheckBox) tempView
.findViewById(R.id.chk);
tempChk.performClick();
}
chkChoice.performClick();
selected = position;
}
});
chkChoice.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
if (isChecked) {
((View) chkChoice.getParent())
.setBackgroundResource(R.drawable.backgroun_checked);
} else {
((View) chkChoice.getParent())
.setBackgroundResource(R.drawable.background_unchecked);
}
}
});
TextView txtChoice = (TextView) view.findViewById(R.id.txtChoice);
txtChoice.setText(data.get(position));
return view;
}
}
}
// int selected содержит текущий проверяемый элемент, и я хочу, чтобы при щелчке по строке снять флажок с этой строки и установить флажок newone.
Может кто-нибудь подсказать мне, что я делаю не так?
Комментарии:
1. что вы хотите сделать? просто установите или снимите флажок в строке списка?
2. @user370305 Да, и изменить фон строки, в которой установлен флажок, на другой цвет ( R.drawable_background_checked — желтый, а R.drawable_background_unchecked — прозрачный). На данный момент он меняет цвет, но есть флажки с несколькими флажками, но мне нужно разрешить только один.
3.
ListView.CHOICE_MODE_SINGLE
не решает вашу проблему ..?4. в getView() в view.onCLick..() поместите if(chkChoice. Проверено){ ((Просмотр) chkChoice.getParent()) .setBackgroundResource(R.drawable.backgroun_checked); } else { ((Просмотр) chkChoice.getParent()) .setBackgroundResource(R.drawable.background_unchecked); } и посмотрите, что происходит. а также дайте мне знать.
Ответ №1:
Вы можете использовать логический ArrayList для поддержания состояния ваших флажков. Размер этого ArrayList должен быть равен элементам представления списка. Вы можете поддерживать (выбирать / отменять выбор) состояние этого списка массивов в onListItemClick() и, что наиболее важно, вы должны использовать этот список массивов в getView() адаптера, чтобы установить состояние флажка. Где вы можете использовать «position» в качестве индекса ArrayList. например
ArrayList<Boolean> lst_arrCheck = new ArrayList<Boolean>();
@Override
public void onCreate(Bundle savedInstanceState)
{
for (int i = 0; i < listItems.size(); i ) // Do this before setting the adapter e.g. in OnCreate()
{
lst_arrCheck.add(false);
}
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id)
{
super.onListItemClick(l, v, position, id);
// Get the item that was clicked
lst_arrCheck.set(position, !(lst_arrCheck.get(position)));
}
...
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
...
CheckBox cb_test = (CheckBox)findViewById(R.id.cb_test);
cb_test.setChecked(lst_arrCheck.get(position));
...
}