2016-12-30 266 views
2

我有2个列表CheckBox。当用户在list_1中检查CheckBox时,列表项目将被转移到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

在你的MainActivity这样的情况下创建两个单独的列表Task

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

现在,通过调用初始化AdaptergetAllTasks方法得到的任务。

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。
我个人在这种情况下使用cursoradapter,并在更改后,查询我的光标并调用changecursor。
希望这对你有所帮助。