Как сохранить состояние CheckBox при прокрутке в ListView? - PullRequest
2 голосов
/ 21 февраля 2012

Я использовал ListView с пользовательским адаптером, поэтому мой ListView включает CheckBox, но проблема в том, что когда я прокручиваю вниз, флажок CheckBoxes снимается, как я могу сделать это с этим кодом?

UPDATE

Мой пользовательский адаптер:

    public class AppsArrayAdapter extends ArrayAdapter<String> {
    private final Context context;

    private List<Integer> checkedItems;

    private final String DefaultApps = "def_apps";

    public AppsArrayAdapter(Context context, String[] values, List<Integer> checkedItems) {//XXX
        super(context, R.layout.apps, values);
        this.context = context;
        this.checkedItems = checkedItems;//XXX
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        SharedPreferences myPrefsApps =context.getSharedPreferences("myPrefsApps", Context.MODE_PRIVATE);
        String prefNameDefaultApps = myPrefsApps.getString(DefaultApps, "");
        String prefNameDefaultAppsVer = myPrefsApps.getString(DefaultAppsVer, "");


        LayoutInflater inflater = (LayoutInflater)context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        View rowView = inflater.inflate(R.layout.apps, parent, false);
        TextView text_apps = (TextView)rowView.findViewById(R.id.text_apps);
        CheckBox check = (CheckBox)rowView.findViewById(R.id.check_apps);
        text_apps.setText(prefNameDefaultApps.split("\n")[position]);

        check.setChecked(checkedItems.contains((Integer) position));
        return rowView;
    }   
}

И моя активность:

    public class AppsActivity extends ListActivity {
    private final String DefaultApps = "def_apps";

    private List<Integer> checkedItems = new ArrayList<Integer>();


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        AppsArrayAdapter adapter = new AppsArrayAdapter(this, prefNameDefaultApps.split("\n"), checkedItems);
        setListAdapter(adapter);
}
}
@Override
    public void onListItemClick(ListView l, View v, int position, long id) {
       if(checkedItems.contains((Integer) position)) checkedItems.remove((Integer) position);
       else checkedItems.add((Integer) position);
    }

Ответы [ 4 ]

0 голосов
/ 09 мая 2014

вы должны использовать MyAdapter newad = (MyAdapter) adapter.getAdapter (); newad.notifyDataSetChanged (); этот код в методе onitem click и MyAdapter является классом адаптера и создает новый объект, как этот а в классе адаптера вы должны написать строку

LayoutInflater in; в = (LayoutInflater) c.getSystemService (Context.LAYOUT_INFLATER_SERVICE); в конструкторе адаптера просто

0 голосов
/ 21 февраля 2012

Я не совсем уверен, есть ли стандартное решение в Android, но это должно сработать:

public class AppsArrayAdapter extends ArrayAdapter<String> {
private final Context context;
private List<Integer> checkedItems;//Here we save the position of the selected items.

private final String DefaultApps = "def_apps";
//This will be invoked when one of the CheckBoxes gets clicked. It will update the checkedItems list.
private View.OnClickListener onClickListener = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Integer position = (Integer) v.getTag();
        if(checkedItems.contains(position)) checkedItems.remove(position);
        else checkedItems.add(position);
    }
};

public AppsArrayAdapter(Context context, String[] values, List<Integer> checkedItems) {//XXX
    super(context, R.layout.apps, values);
    this.context = context;
    this.checkedItems = checkedItems;//XXX
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    SharedPreferences myPrefsApps =context.getSharedPreferences("myPrefsApps", Context.MODE_PRIVATE);
    String prefNameDefaultApps = myPrefsApps.getString(DefaultApps, "");

    //You shouldn't inflate the View everytime getView() is called,
    /*LayoutInflater inflater = (LayoutInflater)context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    View rowView = inflater.inflate(R.layout.apps, parent, false);*/
    //rather let the superclass handle it as it's more efficient.
    View rowView = super.getView(position, convertView, parent);

    TextView text_apps = (TextView)rowView.findViewById(R.id.text_apps);
    CheckBox check = (CheckBox)rowView.findViewById(R.id.check_apps);
    text_apps.setText(prefNameDefaultApps.split("\n")[position]);

    check.setChecked(checkedItems.contains((Integer) position));//XXX
    check.setTag((Integer) position);//XXX
    check.setOnClickListener(onClickListener);//XXX
    return rowView;
}   

}

В поле ListActivity добавьте полеprivate List<Integer> checkedItems = new ArrayList<Integer>;.Вы должны передать этот список в конструкторе адаптера!Если вы хотите проверить, был ли выбран n-й элемент в вашем ListView, просто посмотрите, сохранен ли n в параметре checkItems, т.е.

if(checkedItems.contains(requestedItemPosition)) {
    //Item was selected.
} else {
    //Item was not selected.
}

. Я действительно рекомендую вам не раздувать представления самостоятельно.

0 голосов
/ 22 февраля 2012

Попробуйте это: (ваш пользовательский адаптер)

 public class AppsArrayAdapter extends ArrayAdapter<String> {
private final Context context;

private List<Integer> checkedItems;

private final String DefaultApps = "def_apps";
LayoutInflater inflater;

public AppsArrayAdapter(Context context, String[] values, List<Integer> checkedItems) {//XXX
    super(context, R.layout.apps, values);
    this.context = context;
    this.checkedItems = checkedItems;//XXX
inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    SharedPreferences myPrefsApps =context.getSharedPreferences("myPrefsApps", Context.MODE_PRIVATE);
    String prefNameDefaultApps = myPrefsApps.getString(DefaultApps, "");
    String prefNameDefaultAppsVer = myPrefsApps.getString(DefaultAppsVer, "");


View rowView = convertView;
ViewHolder viewH = new ViewHolder();

if ( rowView == null){
        rowView = inflater.inflate(R.layout.apps, parent, false);
        viewH.text_apps = (TextView)rowView.findViewById(R.id.text_apps);
        viewH.check = (CheckBox)rowView.findViewById(R.id.check_apps);
    rowView.setTag(viewH);
}else{
    viewH = (ViewHolder) rowView.getTag();
}

    viewH.text_apps.setText(prefNameDefaultApps.split("\n")[position]);
    viewH.check.setChecked(checkedItems.contains((Integer) position));

    return rowView;
}   

static class ViewHolder {
    public TextView text_apps;
    public CheckBox check;  

}

}

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

0 голосов
/ 21 февраля 2012
// initialise the list
private List<Integer> selection = new ArrayList<Integer>();

for (String str: prefNameDefaultApps.split("\n")) {
        selection.add(0);
}


// setting the list 
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
        if(CheckBox is checked) {//(check if the checkbox is checked )
               selection.set(position, 1);
        }
        else{
               selection.set(position, 0);
        }
}

// show in the listView
@Override
public View getView(int position, View convertView, ViewGroup parent) {

        ....
        ....
        check.setChecked(selection.get(position) == 0 ? false : true);

}

Это должно помочь вам:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...