1

У меня возникли некоторые проблемы, поэтому я, может быть, кто-то может помочь мне, поскольку я нахожусь в тупике, и понятия не имею, как это исправить. Поэтому я создаю приложение, которое использует фрагмент списка с несколькими (ровно 5) checkbox'es и 1 текстовым видом в одной строке. Итак, первая проблема: я хочу проверить только один из 5 checkbox'es (это означает, что если я сначала проверю, то другой (второй, третий, четвертый, пятый бокс) не должен быть проверен и так далее ...) , И вторая и самая важная проблема заключается в том, что будет 10-20 строк, так как я прокручиваю вниз/вверх, некоторые строки будут переработаны, а флажки отмечены флажками или не проверены случайным образом, так как я должен хранить данные, так что checkbox'es, которые были проверены, не будут отмечены или проверены случайным образом после прокрутки вверх или вниз. Также onListItemClick не работают слишком :(Android ListFragment multiple флажок в одной строке

ListFragment:

package com.android4dev.navigationview; 

import android.app.Activity; 
import android.content.Context; 
import android.graphics.Color; 
import android.graphics.drawable.ColorDrawable; 
import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.support.design.widget.CoordinatorLayout; 
import android.support.design.widget.FloatingActionButton; 
import android.support.design.widget.Snackbar; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.ListFragment; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.CheckBox; 
import android.widget.ListView; 
import android.widget.Toast; 

import java.util.ArrayList; 
import java.util.List; 

import static android.support.design.widget.Snackbar.*; 


public class SymptomsSelectionFragment extends ListFragment { 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View root = inflater.inflate(R.layout.fragment_symptoms_selection, container, false); 
     return root; 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     String[] values = new String[] { "Android", "iPhone", "WindowsMobile", 
       "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X", 
       "Linux", "OS/2","shitPhone","testPhone", "boomPhone", "meskaPhone" }; 
     ArrayAdapter<Question> adapter = new InteractiveArrayAdapter(getActivity(), 
       getQuestion()); 
     FloatingActionButton fab = (FloatingActionButton) getActivity().findViewById(R.id.fab); 
     fab.hide(); 
     setListAdapter(adapter); 
    } 

    @Override 
    public void onListItemClick(ListView l, View v, int position, long id) { 
     // TODO implement some logic 
     super.onListItemClick(l, v, position, id); 
     String item = (String) getListAdapter().getItem(position); 
     Snackbar.make(getListView(), item+" selected", Snackbar.LENGTH_LONG).show(); 
     Toast.makeText(getActivity(),position+" <--- Nr.",Toast.LENGTH_SHORT).show(); 
    } 
    private List<Question> getQuestion() { 
     List<Question> list = new ArrayList<Question>(); 
     list.add(get("Linux")); 
     list.add(get("Windows7")); 
     list.add(get("Suse")); 
     list.add(get("Eclipse")); 
     list.add(get("Ubuntu")); 
     list.add(get("Solaris")); 
     list.add(get("Android")); 
     list.add(get("iPhone")); 
     // Initially select one of the items 
     //list.get(1).setSelected(true); 
     return list; 
    } 

    private Question get(String s) { 
     return new Question(s); 
    } 







} 

ArrayAdapter:

import java.util.List; 
package com.android4dev.navigationview; 
import android.app.Activity; 
import android.media.Image; 
import android.provider.ContactsContract; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.CheckBox; 
import android.widget.CompoundButton; 
import android.widget.ImageButton; 
import android.widget.TextView; 

public class InteractiveArrayAdapter extends ArrayAdapter<Question> { 

    private final List<Question> list; 
    private final Activity context; 

    public InteractiveArrayAdapter(Activity context, List<Question> list) { 
     super(context, R.layout.row_layout_symptoms_selection, list); 
     this.context = context; 
     this.list = list; 
    } 

    static class ViewHolder { 
     protected TextView text; 
     protected CheckBox checkbox1; 
     protected CheckBox checkbox2; 
     protected CheckBox checkbox3; 
     protected CheckBox checkbox4; 
     protected CheckBox checkbox5; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View view = null; 

     if (convertView == null) { 
      LayoutInflater inflator = context.getLayoutInflater(); 
      view = inflator.inflate(R.layout.row_layout_symptoms_selection, null); 
      final ViewHolder viewHolder = new ViewHolder(); 
      viewHolder.text = (TextView) view.findViewById(R.id.label_symptom); 
      viewHolder.checkbox1 = (CheckBox) view.findViewById(R.id.button1); 
      viewHolder.checkbox2 = (CheckBox) view.findViewById(R.id.button2); 
      viewHolder.checkbox3 = (CheckBox) view.findViewById(R.id.button3); 
      viewHolder.checkbox4 = (CheckBox) view.findViewById(R.id.button4); 
      viewHolder.checkbox5 = (CheckBox) view.findViewById(R.id.button5); 
      viewHolder.checkbox1 
        .setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

         @Override 
         public void onCheckedChanged(CompoundButton buttonView, 
                boolean isChecked) { 
          Question element = (Question) viewHolder.checkbox1 
            .getTag(); 
          element.setSelected(buttonView.isChecked()); 

         } 
        }); 
      viewHolder.checkbox2 
        .setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

         @Override 
         public void onCheckedChanged(CompoundButton buttonView, 
                boolean isChecked) { 
          Question element2 = (Question) viewHolder.checkbox2 
            .getTag(); 
          element2.setSelected(buttonView.isChecked()); 

         } 
        }); 
      viewHolder.checkbox3 
        .setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

         @Override 
         public void onCheckedChanged(CompoundButton buttonView, 
                boolean isChecked) { 
          Question element3 = (Question) viewHolder.checkbox3 
            .getTag(); 
          element3.setSelected(buttonView.isChecked()); 

         } 
        }); 
      viewHolder.checkbox4 
        .setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

         @Override 
         public void onCheckedChanged(CompoundButton buttonView, 
                boolean isChecked) { 
          Question element4 = (Question) viewHolder.checkbox4 
            .getTag(); 
          element4.setSelected(buttonView.isChecked()); 

         } 
        }); 
      viewHolder.checkbox5 
        .setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

         @Override 
         public void onCheckedChanged(CompoundButton buttonView, 
                boolean isChecked) { 
          Question element5 = (Question) viewHolder.checkbox5 
            .getTag(); 
          element5.setSelected(buttonView.isChecked()); 

         } 
        }); 
      view.setTag(viewHolder); 
      viewHolder.checkbox1.setTag(list.get(position)); 
      viewHolder.checkbox2.setTag(list.get(position)); 
      viewHolder.checkbox3.setTag(list.get(position)); 
      viewHolder.checkbox4.setTag(list.get(position)); 
      viewHolder.checkbox5.setTag(list.get(position)); 
     } else { 
      view = convertView; 
      ((ViewHolder) view.getTag()).checkbox1.setTag(list.get(position)); 
      ((ViewHolder) view.getTag()).checkbox2.setTag(list.get(position)); 
      ((ViewHolder) view.getTag()).checkbox3.setTag(list.get(position)); 
      ((ViewHolder) view.getTag()).checkbox4.setTag(list.get(position)); 
      ((ViewHolder) view.getTag()).checkbox5.setTag(list.get(position)); 
     } 
     ViewHolder holder = (ViewHolder) view.getTag(); 
     holder.text.setText(list.get(position).getName()); 
     holder.checkbox1.setChecked(list.get(position).isSelected()); 
     holder.checkbox2.setChecked(list.get(position).isSelected()); 
     holder.checkbox3.setChecked(list.get(position).isSelected()); 
     holder.checkbox4.setChecked(list.get(position).isSelected()); 
     holder.checkbox5.setChecked(list.get(position).isSelected()); 
     return view; 
    } 
} 

QuestionClass:

package com.android4dev.navigationview; 

/** 
* Created by Home-PC on 10/19/2016. 
*/ 

public class Question { 
    private String name; 
    private boolean selected; 

    public Question(String name) { 
     this.name = name; 
     selected = false; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public boolean isSelected() { 
     return selected; 
    } 

    public void setSelected(boolean selected) { 
     this.selected = selected; 
    } 
} 

fragment_symptoms_selection.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_marginBottom="58dp" 
    > 


    <ListView 
     android:id="@android:id/list" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="#FFFFFF" 
     android:layout_weight="1" 
     android:drawSelectorOnTop="false" /> 

    <TextView 
     android:id="@android:id/empty" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="#FFFFFF" 
     android:text="No data" /> 
</LinearLayout> 

row_layout_symptoms_selection.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    xmlns:custom="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:showDividers="middle" 
    android:divider="?android:attr/listDivider" 
    tools:context=".SymptomsActivity" 
    > 

    <TextView 
     android:id="@+id/label_symptom" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="@+id/text" 
     android:textSize="19dp" 
     android:layout_gravity="center_horizontal" 
     android:layout_marginBottom="4dp" 
     android:layout_marginTop="4dp" /> 
    <LinearLayout 
     android:orientation="horizontal" 
     android:layout_width="wrap_content" 
     android:layout_height="60dp" 
     > 

     <CheckBox 
      android:layout_width="wrap_content" 
      android:layout_height="60dp" 
      android:button="@drawable/checkbox_drawable" 
      android:id="@+id/button1" 
      android:layout_weight="1" 
      android:background="@color/CheckBox1" 
      /> 
     <CheckBox 
      android:button="@drawable/checkbox_drawable" 
      android:layout_width="wrap_content" 
      android:layout_height="60dp" 
      android:id="@+id/button2" 
      android:layout_weight="1" 
      android:background="@color/CheckBox2"/> 
     <CheckBox 
      android:button="@drawable/checkbox_drawable" 
      android:layout_width="wrap_content" 
      android:layout_height="60dp" 
      android:id="@+id/button3" 
      android:layout_weight="1" 
      android:background="@color/CheckBox3"/> 
     <CheckBox 
      android:button="@drawable/checkbox_drawable" 
      android:layout_width="wrap_content" 
      android:layout_height="60dp" 
      android:id="@+id/button4" 
      android:layout_weight="1" 
      android:background="@color/CheckBox4"/> 
     <CheckBox 
      android:button="@drawable/checkbox_drawable" 
      android:layout_width="wrap_content" 
      android:layout_height="60dp" 
      android:id="@+id/button5" 
      android:layout_weight="1" 
      android:background="@color/CheckBox5"/> 
    </LinearLayout> 
</LinearLayout> 
+0

Не могли бы вы привести пример того, как мне это сделать?Поскольку я новичок и просто изучаю андроид. Я был бы очень благодарен :) – wFc

+0

Вы также можете сохранить свои состояния внутри общих настроек. если вы хотите обрабатывать так, чтобы пользователь мог выбрать только один вариант, вы можете сделать это с помощью операторов if. – Nenco

+0

Итак, во-первых, onCheckChangeListener имеет переменную «isChecked». Почему вы вызываете isChecked() в представлении? IsChecked, как известно, является неправильным во многих ситуациях. Я не думаю, что вы получили правильную информацию из представления кнопки. Вместо этого используйте isChecked boolean. – Shadesblade

ответ

0

Во-первых, если вам нужен только один вариант, выбранный во время, рассмотреть вопрос об использовании RadioButton реализации. Во-вторых, сохраняете ли вы данные в базе данных sql? Если вы уже используете базу данных SQL, это способ сохранить состояние чекбоксов:

a- В Question Class, добавьте это:

int status 
public int getStatus() { 
     return status; 
    } 
public void setStatus(int status) { 
     this.status = status; 
    } 

b- В адаптере базы данных, добавьте STATUS в таблицу Предметы.

c- В вашем методе GetView ручки отмеченные элементы, как это:

holder.check.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         CheckBox cb = (CheckBox) v; 
         Item changeItem = (Item) cb.getTag(); 
         changeItem.setStatus(cb.isChecked() ? 1 : 0); 
         mDbHelper.updateItem(changeItem); 
          } 
        }); 

См this, чтобы узнать, как хранить данные в базе данных SQL. Если вы не используете базу данных, возможно, вам нужно использовать SharedPreferences.

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

0

Это один из способов, как ча n вы разрешаете пользователю выбирать только один вариант. лучшим способом было бы реализовать onCheckChangeListener и сделать то же самое, чтобы вам не приходилось повторять один и тот же метод :) для сохранения значений, которые пользователь выбирает, вы должны использовать подход «extends Application».

final CheckBox cbOne = (CheckBox) findViewById(R.id.cbOne); 
    final CheckBox cbTwo = (CheckBox) findViewById(R.id.cbTwo); 
    final CheckBox cbThree = (CheckBox) findViewById(R.id.cbThree); 

    cbOne.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 

      if (isChecked) { 

       cbTwo.setClickable(false); 
       cbThree.setClickable(false); 

       cbTwo.setChecked(false); 
       cbThree.setChecked(false); 


      } else { 

       cbTwo.setClickable(true); 
       cbThree.setClickable(true); 

      } 

     } 
    }); 

    cbTwo.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 


      if (isChecked) { 

       cbOne.setClickable(false); 
       cbThree.setClickable(false); 

       cbOne.setChecked(false); 
       cbThree.setChecked(false); 


      } else { 

       cbOne.setClickable(true); 
       cbThree.setClickable(true); 


      } 


     } 
    }); 


    cbThree.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 


      if (isChecked) { 

       cbTwo.setClickable(false); 
       cbOne.setClickable(false); 

       cbTwo.setChecked(false); 
       cbOne.setChecked(false); 


      } else { 

       cbTwo.setClickable(true); 
       cbOne.setClickable(true); 


      } 


     } 
    });