2016-12-30 9 views
2

CheckBoxという2つのリストがあります。ユーザーがCheckBoxlist_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

MainActivityTaskという2つの別のリストをこのように作成します。

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

は今Adapterを初期化する前getAllTasksメソッドを呼び出すことにより、タスクを取得します。

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

は今すぐにgetViewメソッド内で今、この

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 

のようなアダプタを初期化し、あなたの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(); 
    } 
}); 

あなたはMainActivityであなたのgetView方法の外リストのリフレッシュメカニズムを取って検討するかもしれません。

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

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

あなたMainActivityに内部クラスとしてCustomListAdapterを入れて検討するかもしれません。

+0

私のCustomListAdapterクラスは "tasksPendingList"と "tasksDoneList"をどのように見ることができますか? – Dim

+0

それらをパブリック変数として宣言します。 –

+0

ありがとうございましたこれを行いました...あなたのソリューションは論理的だと思われ、うまくいくはずですが、まだリフレッシュしません。 – Dim

1

あなたがあなたのデータベースを更新した後、タスクを再取得する呼び出す必要がありますタスクの新しいリストを取得し、notifydatasetchanを呼び出しますge。
この場合、変更したカーソルカーソルを再クエリーしてchangecursorを呼び出します。
願っています。

関連する問題