Ответ 1
Мне понравилось ниже, и я получил требуемый результат,
В прикрепленном изображении SelectAll checkbox
присутствует в действии и все checkboxes
внутри адаптера.
Если я checked SelectAll
, тогда все флажки отмечены в адаптере, и если я не отмечен, то все будут сняты. Это происходит красиво.
Но я хочу, если я checked SelectAll
и после этого, если я uncheked
один или несколько флажков в адаптере, то SelectAll checkbox should unchecked
.
и если без проверки SelectAll Если я вручную проверит все флажки в адаптере, тогда SelectAll checkbox should checked
автоматически.
Как я могу это сделать.
Ниже приведен мой код., http://pastebin.com/5pUJJC42
Мне понравилось ниже, и я получил требуемый результат,
Я попробовал что-то вроде этого,
Передал флажок checkAll в конструктор класса адаптера, и параметр сам там прослушивается, поэтому нам не нужно объявлять публичный статический флаг из основного класса.
Также я взял пару флагов, которые поддерживают состояние флажка, то есть я пытался поддерживать такое, что при проверке флажка checkAll это не влияет на флажок "Элементы списка" и наоборот для элементов списка.
Итак, попробуйте это
public class myAdapter extends ArrayAdapter<Model> {
private final List<Model> list;
private final Activity context;
private CheckBox checkAll;
boolean checkAll_flag = false;
boolean checkItem_flag = false;
public myAdapter(Activity context, List<Model> list, CheckBox checkAll) {
super(context, R.layout.row, list);
this.context = context;
this.list = list;
this.checkAll = checkAll;
checkAll.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton checkbox, boolean arg1) {
if(!checkItem_flag){
checkAll_flag = true;
notifyDataSetChanged();
}
}
});
}
static class ViewHolder {
protected TextView text;
protected CheckBox checkbox;
}
private boolean areAllSelected() {
boolean areAllSelected = false;
for (int i = 0; i < list.size(); i++) {
if(list.get(i).isSelected()){
areAllSelected = true;
}
else{
areAllSelected = false;
return areAllSelected;
}
}
return areAllSelected;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View view = null;
if (convertView == null) {
LayoutInflater inflator = context.getLayoutInflater();
view = inflator.inflate(R.layout.row, null);
final ViewHolder viewHolder = new ViewHolder();
viewHolder.text = (TextView) view.findViewById(R.id.label);
viewHolder.checkbox = (CheckBox) view.findViewById(R.id.check);
viewHolder.checkbox
.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
Model element = (Model) viewHolder.checkbox.getTag();
element.setSelected(buttonView.isChecked());
if(!checkAll_flag){
checkItem_flag = true;
if(buttonView.isChecked()){
checkAll.setChecked(areAllSelected());
}
if(!buttonView.isChecked()){
checkAll.setChecked(areAllSelected());
}
checkItem_flag = false;
}
}
});
view.setTag(viewHolder);
viewHolder.checkbox.setTag(list.get(position));
} else {
view = convertView;
((ViewHolder) view.getTag()).checkbox.setTag(list.get(position));
}
ViewHolder holder = (ViewHolder) view.getTag();
holder.text.setText(list.get(position).getName());
holder.checkbox.setChecked(list.get(position).isSelected());
if(checkAll_flag){
if(checkAll.isChecked()){
holder.checkbox.setChecked(true);
}
else if(!checkAll.isChecked()){
holder.checkbox.setChecked(false);
}
if(position == (list.size() -1)){
checkAll_flag = false;
}
}
return view;
}
}
У меня была аналогичная проблема в прошлом. Для реализации Checkable
вам нужен вид строки. Проверьте этот вопрос.
Вы можете создать массив логических элементов, соответствующих списку элементов, и в адаптере вы должны соответствующим образом переключить логические значения, отмеченные флажком /unchecked, а в адаптере на каждой проверке, которая является всеми элементами логического массива, является true? затем setchecked (true), selectall_checkbox еще сохраняет его установленным (непроверенным).
ИЗМЕНИТЬ
Ваш адаптер должен выглядеть следующим образом:
public class InteractiveArrayAdapter extends ArrayAdapter<Model> {
private final List<Model> list;
private final Activity context;
private CheckBox selectAll;
public InteractiveArrayAdapter( Activity context, List<Model> list, CheckBox selectAll ) {
super( context, R.layout.list_items_attendance_payment, list );
this.context = context;
this.list = list;
this.selectAll = selectAll;
}
static class ViewHolder {
protected TextView text;
protected CheckBox checkbox;
}
@Override
public View getView( final int position, View convertView, ViewGroup parent ) {
View view = null;
if( convertView == null ) {
LayoutInflater inflator = context.getLayoutInflater();
view = inflator.inflate( R.layout.list_items_attendance_payment, null );
final ViewHolder viewHolder = new ViewHolder();
viewHolder.text = (TextView) view.findViewById( R.id.name );
viewHolder.checkbox = (CheckBox) view.findViewById( R.id.check );
view.setTag( viewHolder );
}
else {
view = convertView;
}
ViewHolder holder = (ViewHolder) view.getTag();
holder.text.setText( list.get( position ).getName() );
viewHolder.checkbox.setOnCheckedChangeListener( new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged( CompoundButton buttonView, boolean isChecked ) {
AttendanceActivity.listMember.get( position ).setSelected( isChecked );
list.get( position ).setSelected( buttonView.isChecked() );
selectAll.setChecked( areAllSelected() ); // We just use the method as parameter as it returns a boolean.
}
} );
if( selectAll.isChecked() )
holder.checkbox.setChecked( true );
else
holder.checkbox.setChecked( list.get( position ).isSelected() );
return view;
}
public void deselectAll() {
for( Model element : list )
element.setSelected( false );
notifyDataSetChanged();
}
public void selectAll() {
for( Model element : list )
element.setSelected( true );
notifyDataSetChanged();
}
private boolean areAllSelected() {
for( Model element : list )
if( !element.getSelected() )
return false; // We conclude that not all are selected.
return true; // All of the items were selected
}
}
И метод в Activity
, который устанавливает OnCheckedChangedListener
, должен быть изменен на это:
private void onClickSetAllAttendance() {
selectAll.setOnClickListener( new OnClickListener() {
@Override
public void onClick( View v ) {
CheckBox box = (CheckBox) v;
box.toggle();
if( box.isChecked() )
listAdapter.selectAll();
else
listAdapter.deselectAll();
}
});
}
Вот вам простое решение.
@Override
public View getView(int position, View v, ViewGroup arg2) {
final PillTime pillTime = arrPillTimes.get(position);
if(v == null) {
v = inflater.inflate(R.layout.select_time_row, null);
}
TextView tvTitle = (TextView)v.findViewById(R.id.tvTitle);
TextView tvTime = (TextView)v.findViewById(R.id.tvTime);
tvTime.setText(pillTime.getTime());
final CheckBox cbtime = (CheckBox)v.findViewById(R.id.cbtime);
cbtime.setChecked(false);
for (PillTime pillTime2 : arrSelectedTimes) {
if(pillTime2.getId().equals(pillTime.getId())) {
cbtime.setChecked(true);
break;
}
}
tvTitle.setText(pillTime.getTitle());
cbtime.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(cbtime.isChecked()) {
boolean contains = false;
for (PillTime pillTime2 : arrSelectedTimes) {
if(pillTime2.getId().equals(pillTime.getId())) {
contains = true;
break;
}
}
if(!contains) {
arrSelectedTimes.add(pillTime);
if(arrPillTimes.size() == arrSelectedTimes.size()) {
cbSelectAll.setChecked(true);
}
}
}else {
for (PillTime pillTime2 : arrSelectedTimes) {
if(pillTime2.getId().equals(pillTime.getId())) {
arrSelectedTimes.remove(pillTime2);
cbSelectAll.setChecked(false);
break;
}
}
}
}
});
return v;
}
У меня есть один основной массивList arrPillTimes
, который имеет все данные, и у меня есть второй массивList
arrSelectedTimes
, который сохранит дорожку отмеченных элементов. Мы проверим, находится ли выбранный элемент в arrSelectedTimes
, это означает, что вы проверили этот элемент, чтобы установить флажок checked для true для этого флажка.
попробуйте использовать CheckedTextView для этой проблемы
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" android:background="#ffffff">
<ListView
android:id="@+id/listView"
android:scrollbars="vertical" android:divider="#C0C0C0" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1" android:cacheColorHint="#00000000" android:dividerHeight="1dip">
</ListView>
<LinearLayout android:id="@+id/linearLayout1" android:layout_height="wrap_content" android:layout_width="match_parent">
<Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="All"></Button>
<Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="None"></Button>
<Button android:id="@+id/button3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Done"></Button>
</LinearLayout>
</LinearLayout>
listrow.xml
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/text"
android:textAppearance="?android:attr/textAppearanceLarge"
android:gravity="center_vertical"
android:checkMark="?android:attr/listChoiceIndicatorMultiple"
android:background="#ffffff" android:layout_width="fill_parent" android:layout_height="fill_parent" android:textColor="#000000" android:padding="15dip"/>
CheckedTextVwActivity.java
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckedTextView;
import android.widget.ListView;
import android.widget.Toast;
public class CheckedTextVwActivity extends Activity {
/** Called when the activity is first created. */
ListView listView;
ListAdapter adapter;
ArrayList<String> strings = new ArrayList<String>();
Button button1,button2,button3;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
listView = (ListView) findViewById(R.id.listView);
button1 = (Button) findViewById(R.id.button1);
button2 = (Button) findViewById(R.id.button2);
button3 = (Button) findViewById(R.id.button3);
strings.add(new String("B"));
strings.add(new String("A"));
strings.add(new String("B"));
strings.add(new String("A"));
strings.add(new String("B"));
strings.add(new String("A"));
strings.add(new String("B"));
strings.add(new String("A"));
strings.add(new String("B"));
strings.add(new String("A"));
strings.add(new String("B"));
strings.add(new String("A"));
strings.add(new String("B"));
strings.add(new String("A"));
strings.add(new String("B"));
strings.add(new String("A"));
strings.add(new String("B"));
strings.add(new String("A"));
strings.add(new String("B"));
strings.add(new String("A"));
strings.add(new String("B"));
strings.add(new String("A"));
strings.add(new String("B"));
strings.add(new String("A"));
strings.add(new String("B"));
strings.add(new String("A"));
TopicSelectionListAdapter topicSelectionListAdapter = new TopicSelectionListAdapter(
CheckedTextVwActivity.this, R.layout.listrow, strings);
listView.setAdapter(topicSelectionListAdapter);
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
for(int i=0;i<strings.size();i++){
listView.setItemChecked(i, true);
}
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View view, int position,
long arg3) {
CheckedTextView selectedItem = (CheckedTextView) view;
boolean isChecked = selectedItem.isChecked();
Log.e("TAG","item clicked position = " + position + " isChecked = " + isChecked);
}
});
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
for(int i=0;i<strings.size();i++){
listView.setItemChecked(i, true);
}
}
});
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
for(int i=0;i<strings.size();i++){
listView.setItemChecked(i, false);
}
}
});
button3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int count = listView.getAdapter().getCount();
String savedItems = null;
for (int i = 0; i < count; i++) {
if (listView.isItemChecked(i)) {
savedItems = savedItems + listView.getItemAtPosition(i).toString() + ",";
}
}
Toast.makeText(CheckedTextVwActivity.this, ""+savedItems, Toast.LENGTH_LONG).show();
}
});
}
public class TopicSelectionListAdapter extends ArrayAdapter {
@SuppressWarnings("unchecked")
public TopicSelectionListAdapter(Context context,
int textViewResourceId, List objects) {
super(context, textViewResourceId, objects);
}
@Override
public long getItemId(int currentPosition) {
return super.getItemId(currentPosition);
}
@Override
public View getView(int currentPosition, View convertView,
ViewGroup parent) {
View v = convertView;
final LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(R.layout.listrow, null);
final CheckedTextView textView = (CheckedTextView) v
.findViewById(R.id.text);
textView.setText(strings.get(currentPosition));
return v;
}
}
}