2016-12-30 2 views
2

У меня есть 2 списка с CheckBox. Когда пользователь проверит CheckBox в list_1, элемент списка будет перенесен на list_2. Он отлично работает, но я не могу обновить списки из адаптера. Пробовал notifyDataSetChanged(), но ничего не происходит.Обновить список просмотров с помощью адаптера

В моих MainActivity:

CustomListAdapter adapter = new CustomListAdapter(this, db.getAllTasks(MySQLiteHelper.TABLE_HOME, false), MySQLiteHelper.TABLE_HOME,false); 
mylistView.setAdapter(adapter); // Set the adapter for list_1 

CustomListAdapter adapterDone = new CustomListAdapter(this, db.getAllTasks(MySQLiteHelper.TABLE_HOME, true), MySQLiteHelper.TABLE_HOME,true); 
listViewDone.setAdapter(adapterDone); // Set the adapter for list_2 

И getAllTasks функция:

public List<Task> getAllTasks(String tableName, boolean done) { 
    List<Task> tasks = new LinkedList<Task>(); 

    String op = done ? "1" : "0"; 
    String query = "SELECT * FROM " + tableName + " WHERE done=" + op; 
    Log.d(TAG, "query: " + query); 
    SQLiteDatabase db = this.getWritableDatabase(); 
    Cursor cursor = db.rawQuery(query, null); 
    Task task = null; 

    if (cursor.moveToFirst()) { 
     do { 
      task = new Task(); 
      task.setTaskText(cursor.getString(0)); 
      task.setDate(cursor.getString(1)); 
      task.setTime(cursor.getString(2)); 
      task.setDone(cursor.getInt(3) == 1); 
      tasks.add(task); 
     } while (cursor.moveToNext()); 
    } 

    return tasks; 
} 

Вот идет мой Adapter:

public class CustomListAdapter extends ArrayAdapter<Task> { 
    private static final String TAG = "DTAG"; 
    private final Activity context; 
    private final List<Task> myTasks; 
    private final MySQLiteHelper db; 
    private final String tableName; 
    private final boolean done; 

    public CustomListAdapter(Activity context, List<Task> myTasks, String tableName, boolean done) { 
     super(context, R.layout.list_row, myTasks); 

     this.context = context; 
     this.myTasks = myTasks; 
     this.tableName = tableName; 
     this.done = done; 
     db = new MySQLiteHelper(context); 
    } 

    public View getView(final int position, View view, ViewGroup parent) { 
     LayoutInflater inflater = context.getLayoutInflater(); 
     View rowView = inflater.inflate(R.layout.list_row, null, true); 

     final TextView txtTitle = (TextView) rowView.findViewById(R.id.listMainTextView); 
     TextView txtSubTitle = (TextView) rowView.findViewById(R.id.listSubTextView); 

     CheckBox ch = (CheckBox) rowView.findViewById(R.id.checkBox); 
     ch.setChecked(done); 

     ch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       if (isChecked) { 
        Log.d(TAG, "position: " + position + " Name: " + myTasks.get(position).getTaskText() + " Checked"); 
        db.updateTask(myTasks.get(position).getTaskText(), tableName, true); 
       } else { 
        Log.d(TAG, "position: " + position + " Name: " + myTasks.get(position).getTaskText() + " UnChecked"); 
        db.updateTask(myTasks.get(position).getTaskText(), tableName, false); 
       } 

       Handler handler = new Handler(); 
       handler.postDelayed(new Runnable() { 
        @Override 
        public void run() { 
         notifyDataSetChanged(); 
        } 
       }, 1000); 
      } 
     }); 

     txtTitle.setText(myTasks.get(position).getTaskText()); 
     txtSubTitle.setText(myTasks.get(position).getTime() + " " + myTasks.get(position).getDate()); 

     return rowView; 
    }; 
} 

ответ

1

Создайте два отдельных списка Task в вашем MainActivity вот так.

List<Task> tasksPendingList = new LinkedList<Task>(); 
List<Task> tasksDoneList = new LinkedList<Task>(); 

Теперь получить задачи с помощью вызова метода getAllTasks перед инициализацией Adapter.

tasksPendingList = db.getAllTasks(MySQLiteHelper.TABLE_HOME, false); 
tasksDoneList = db.getAllTasks(MySQLiteHelper.TABLE_HOME, true); 

Теперь инициализировать адаптер, как этот

CustomListAdapter adapter = new CustomListAdapter(this, tasksPendingList, MySQLiteHelper.TABLE_HOME, false); 
mylistView.setAdapter(adapter); // Set the adapter for list_1 

CustomListAdapter adapterDone = new CustomListAdapter(this, tasksDoneList, MySQLiteHelper.TABLE_HOME, true); 
listViewDone.setAdapter(adapterDone); // Set the adapter for list_2 

Теперь внутри метода getView в вашем Adapter вам нужно снова заселить списки, чтобы получить notifyDatasetChanged работать.

ch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
    @Override 
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
     if (isChecked) { 
      db.updateTask(myTasks.get(position).getTaskText(), tableName, true); 
     } else { 
      db.updateTask(myTasks.get(position).getTaskText(), tableName, false); 
     } 

     // Just call refreshBothList here 
     refreshBothList(); 
    } 
}); 

Вы могли бы рассмотреть вопрос о принятии механизма обновления списка вне вашего метода getView в MainActivity.

public void refreshBothList() { 
    // Repopulate the lists. 
    tasksPendingList = db.getAllTasks(MySQLiteHelper.TABLE_HOME, false); 
    tasksDoneList = db.getAllTasks(MySQLiteHelper.TABLE_HOME, true); 

    adapter.notifyDataSetChanged(); 
    adapterDone.notifyDataSetChanged(); 
} 

Вы могли бы рассмотреть вопрос о создании в CustomListAdapter как внутренний класс в вашем MainActivity.

+0

Как мой класс CustomListAdapter может видеть «tasksPendingList» и «tasksDoneList»? – Dim

+0

Объявите их как общедоступную переменную. –

+0

Спасибо, сделал это ... и ваше решение кажется логичным и должно работать, но до сих пор не обновляется – Dim

1

вы должны вызвать получить задание снова после обновления базы данных для получить новый список задач, а затем позвонить notifydatasetchan GE.
В этом случае я использую курсорный адаптер, и после его изменения запрашиваю курсор и курсор.
Надеюсь, это поможет вам.

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

  • Нет связанных вопросов^_^