2016-12-06 2 views
-2

Я создал пользовательское listview с флажком и двумя строками текста. Я хочу изменить состояние флажка, когда я нажимаю на элемент списка (это означает, что если я нажмю любую часть элемента списка или текст, флажок изменит состояние). Для достижения этой цели я добавил это в файле custom_list_row XML:Элемент списка Listview не выбран, когда прокрутка вниз

<RelativeLayout 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:descendantFocusability="blocksDescendants" > 

<CheckBox 
    android:id="@+id/checkbox" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:focusable="false" 
    android:clickable="false" /> 

и в классе Java я сделал это:

listview.setAdapter(adapter); 

    listview.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      final CheckBox checkBox; 
      checkBox = (CheckBox)view.findViewById(R.id.checkbox); 


      if(checkBox.isChecked()){ 
       checkBox.setChecked(false); 
      } 
      else { 
       checkBox.setChecked(true); 
      } 
     } 
    }); 

Это прекрасно работает. Но единственная проблема заключается в том, что когда я выбираю некоторые элементы и прокручиваю вниз -> вернуться к выбранным элементам -> выбранные элементы становятся не выбраны.

Я ничего не делал с setOnCheckedChangeListener

Что пошло не так? Любое предложение решить эту проблему будет полезно.

Благодаря

+0

вам нужно поддерживать булевский массив для этого –

+0

, вы имели в виду, что мне нужно создать массив, который сохранит состояние всех флажков? – supertramp

+0

да, но попытайтесь использовать recyclerview –

ответ

0

Я полагаю, что вам нужно использовать recyclerview

public class CardViewActivity extends AppCompatActivity { 

private Toolbar toolbar; 

private RecyclerView mRecyclerView; 
private RecyclerView.Adapter mAdapter; 
private RecyclerView.LayoutManager mLayoutManager; 

private List<Student> studentList; 

private Button btnSelection; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    toolbar = (Toolbar) findViewById(R.id.toolbar); 
    btnSelection = (Button) findViewById(R.id.btnShow); 

    studentList = new ArrayList<Student>(); 

    for (int i = 1; i <= 15; i++) { 
    Student st = new Student("Student " + i, "androidstudent" + i 
    + "@gmail.com", false); 

    studentList.add(st); 
    } 

    if (toolbar != null) { 
    setSupportActionBar(toolbar); 
    getSupportActionBar().setTitle("Android Students"); 

    } 

    mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view); 

    // use this setting to improve performance if you know that changes 
    // in content do not change the layout size of the RecyclerView 
    mRecyclerView.setHasFixedSize(true); 

    // use a linear layout manager 
    mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); 

    // create an Object for Adapter 
    mAdapter = new CardViewDataAdapter(studentList); 

    // set the adapter object to the Recyclerview 
    mRecyclerView.setAdapter(mAdapter); 

    btnSelection.setOnClickListener(new OnClickListener() { 

    @Override 
    public void onClick(View v) { 
    String data = ""; 
    List<Student> stList = ((CardViewDataAdapter) mAdapter) 
     .getStudentist(); 

    for (int i = 0; i < stList.size(); i++) { 
    Student singleStudent = stList.get(i); 
    if (singleStudent.isSelected() == true) { 

     data = data + "\n" + singleStudent.getName().toString(); 
     /* 
     * Toast.makeText(CardViewActivity.this, " " + 
     * singleStudent.getName() + " " + 
     * singleStudent.getEmailId() + " " + 
     * singleStudent.isSelected(), 
     * Toast.LENGTH_SHORT).show(); 
     */ 
    } 

    } 

    Toast.makeText(CardViewActivity.this, 
     "Selected Students: \n" + data, Toast.LENGTH_LONG) 
     .show(); 
    } 
    }); 

} 

} 

Для более см http://android-pratap.blogspot.in/2015/01/recyclerview-with-checkbox-example.html

ИЛИ

Если вы хотите использовать ListView попробовать этот способ

public class CustomAdapter extends BaseAdapter { 
    private final LayoutInflater inflater; 
    private final Context context; 
    private List<Modelclass> listData; 

    public CustomAdapter(Context mainActivity, List<Modelclass> listData) { 
     context = mainActivity; 
     this.listData = listData; 
     inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    @Override 
    public int getCount() { 
     return listData.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return listData.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return 0; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     final ViewHolder holder; 

     if (convertView == null) { 
      holder = new ViewHolder(); 
      convertView = inflater.inflate(R.layout.list_item_poojaselection, null); 
      holder.tv = (TextView) convertView.findViewById(R.id.list_item_poojaname); 
      holder.checks = (CheckBox) convertView.findViewById(R.id.list_item_poojacheck); 
      convertView.setTag(holder); 
     }else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 
     holder.checks.setOnCheckedChangeListener(null); 
     holder.checks.setFocusable(false); 

     if (listData.get(position).isselected) { 
      holder.checks.setChecked(true); 
     } else { 
      holder.checks.setChecked(false); 
     } 

     holder.checks.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton cb, boolean b) { 

       if (checkMaxLimit()) { 

        if (listData.get(position).isselected && b) { 
         holder.checks.setChecked(false); 
         listData.get(position).isselected = false; 

        } else { 
         holder.checks.setChecked(false); 
         listData.get(position).isselected = false; 
         Toast.makeText(context, "Max limit reached", Toast.LENGTH_SHORT).show(); 
        } 
       } else { 
        if (b) { 
         listData.get(position).isselected = true; 
        } else { 
         listData.get(position).isselected = false; 
        } 
       } 
      } 
     }); 

     holder.tv.setText(listData.get(position).getLISTING_NAME()); 
     return convertView; 
    } 

    public boolean checkMaxLimit() { 
     int countermax = 0; 
     for(Modelclass item : listData){ 
      if(item.isselected){ 
       countermax++; 
      } 
     } 
     return countermax >= 5; 
    } 

    public class ViewHolder { 
     TextView tv; 
     public CheckBox checks; 
    } 
} 
+0

Я решил это, поддержав arraylist – supertramp

+0

принять ответ, если он вам помог –

0

Пожалуйста, внести изменения в то время как флажок выберите/отмените

listview.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      final CheckBox checkBox; 
      checkBox = (CheckBox)view.findViewById(R.id.checkbox); 


      if(checkBox.isChecked()){ 
       checkBox.setChecked(false); 

        // Reset the checkbox in array list/Bean like 

        list.set(); // set new value of list 

        adapter.notifyChange(); 

      } 
      else { 
       checkBox.setChecked(true); 

       // Reset the checkbox in array list/Bean like 

        list.set(); // set new value of list 

        adapter.notifyChange(); 
      } 
     } 
    }); 

Это изменение решения этой проблемы у меня.

Смежные вопросы