Как удалить элемент списка или очистить просмотр списка, используя общие настройки? - PullRequest
0 голосов
/ 09 января 2012

У меня есть следующий базовый адаптер пользовательского класса, создание списка и элементов. но я хочу удалить все элементы из списка, когда я нажимаю кнопку сброса. Мой код:

public class Scores extends Activity implements OnClickListener {

public static final String MY_PREFS_NAME = "PrefName";
SharedPreferences pref;
static String[] tempTime = new String[10];
static String[] tempScore = new String[10];

private static class EfficientAdapter extends BaseAdapter {
    private LayoutInflater mInflater;
    public EfficientAdapter(Context context) {
        mInflater = LayoutInflater.from(context);

    }

    public int getCount() {
        return tempTime.length;
    }

    public Object getItem(int position) {
        return position;
    }

    public long getItemId(int position) {
        return position;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            convertView = mInflater.inflate(
                    R.layout.mathmatch_score_format, null);
            holder = new ViewHolder();
            holder.text1 = (TextView) convertView
                    .findViewById(R.id.time_text);
            holder.text2 = (TextView) convertView
                    .findViewById(R.id.score_text);
            /*final ImageView deleteButton = (ImageView) 
                    convertView.findViewById(R.id.score_reset);
            deleteButton.setOnClickListener(this);*/
            convertView.setTag(holder);
            //deleteButton.setTag(holder);

        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.text1.setText(tempTime[position]);
        holder.text2.setText(tempScore[position]);

        return convertView;
    }

    static class ViewHolder {
        TextView text1;
        TextView text2;
    }

}

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.mathmatch_score);
    setUpViews();
    pref = getSharedPreferences(MY_PREFS_NAME, 0);
    strTime = pref.getString("high_score_times", "");
    intScore = pref.getString("high_score_values", "");
    tempTime = strTime.split(",");
    tempScore = intScore.split(",");

    Comparator<String> comparator = new CustomArrayComparator<String, String>(tempScore, tempTime);
    Arrays.sort(tempTime, comparator);
    Arrays.sort(tempScore, Collections.reverseOrder());
    lv.setAdapter(new EfficientAdapter(this));
}

private void setUpViews() {
    lv = (ListView) findViewById(R.id.list);
    reset = (ImageView) findViewById(R.id.score_reset);
    reset.setOnClickListener(this);
}   

@Override
protected void onPause() {
    super.onPause();
    pref = getSharedPreferences(MY_PREFS_NAME, 0);
    SharedPreferences.Editor edit = pref.edit();
    edit.putString("high_score_times", strTime);
    edit.putString("high_score_values", intScore);
    edit.commit();
}
@Override
protected void onStop() {
    super.onStop();
}
@Override
public void onClick(View v) {
    switch (v.getId()) {
    case R.id.score_reset:
        AlertDialog.Builder alertbox = new AlertDialog.Builder(this);
        alertbox.setTitle("Reset");
        alertbox.setMessage("Are you sure all time ans score are reset?");

        alertbox.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                     public void onClick(DialogInterface arg0, int arg1) {
                         pref = getSharedPreferences(MY_PREFS_NAME, 0);
                        SharedPreferences.Editor edit = pref.edit();
                        /*edit.remove("high_score_times");
                        edit.remove("high_score_values");*/

                        /*edit.remove(intScore);
                        edit.remove(strTime);
                        */
                        //edit.clear();
                        edit.remove(MY_PREFS_NAME);
                        edit.commit();
                             }
        });
                    alertbox.setNegativeButton("No", new DialogInterface.OnClickListener() {
                     public void onClick(DialogInterface arg0, int arg1) {
                Toast.makeText(getApplicationContext(), "'No' button clicked", Toast.LENGTH_SHORT).show();
            }
        });
         alertbox.show();
           break;
      default:
        break;
}}}

Моя кнопка сброса отсутствует в списке. Я пробовал это в событии нажатия кнопки «Да» в приведенном выше коде, но не смог получить обновление. Так что делать? Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 09 января 2012

используя ваш экземпляр списка, получите адаптер списка, например

urlist.setAdapter("pass your updated adapter with empty string array");

ИЛИ

, вы также можете вызвать notifyDataSetChanged ();сообщить представлению списка, что его набор данных изменен

1 голос
/ 09 января 2012

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

В вашем случае вы используете его для доступа к двум переменным (очень плохая форма, чтобы сделать их статичными):

static String[] tempTime = new String[10];
static String[] tempScore = new String[10];

При создании ваших заполнений эти переменные из ваших общих предпочтений.

Затем при вашем «Да» вы обновляете свои предпочтения, но независимо от того, сколько вы нажимаете кнопку «обновить» на вашем адаптере, он по-прежнему смотрит на те переменные, которые не были обновлены.

Если вы хотите, чтобы кнопка «Да» очистила ваш список, вам нужно изменить данные, которые поддерживают адаптер , затем сообщить адаптеру, что он изменился, и перерисовать себя.

   alertbox.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface arg0, int arg1) {
            pref = getSharedPreferences(MY_PREFS_NAME, 0);
            SharedPreferences.Editor edit = pref.edit();
            /**/
            edit.remove(MY_PREFS_NAME);
            edit.commit();

            strTime = pref.getString("high_score_times", "");
            intScore = pref.getString("high_score_values", "");
            tempTime = strTime.split(",");
            tempScore = intScore.split(",");

            EfficientAdapter adapter = (EfficientAdapter)lv.getAdapter();
            adapter.notifyDataSetChanged();               
    });
1 голос
/ 09 января 2012

Очистить список:

установить tempTime и tempScore для пустого массива

tempTime= new String[0]; 
adapter.notifyDataSetChanged();

Чтобы добавить / удалить данные:

Соответственно измените источник данных tempTime и tempScore и вызовитеadapter.notifyDataSetChanged();

...