Android 将数据存储在不断变化的listfragment中
我有一个列表片段,其中每个项目都包含一个复选框,用户可以选中和取消选中它。列表片段中的每个项对应于类任务中的一个对象,该对象存储有关是否选中复选框的信息 我的问题是,如何修改任务对象以响应复选框的选中和取消选中?我知道您通常会创建一个任务对象,然后通知适配器,以便用户界面在响应中发生变化,但是如何逆转这个过程呢 列表片段:Android 将数据存储在不断变化的listfragment中,android,listview,checkbox,arraylist,android-listfragment,Android,Listview,Checkbox,Arraylist,Android Listfragment,我有一个列表片段,其中每个项目都包含一个复选框,用户可以选中和取消选中它。列表片段中的每个项对应于类任务中的一个对象,该对象存储有关是否选中复选框的信息 我的问题是,如何修改任务对象以响应复选框的选中和取消选中?我知道您通常会创建一个任务对象,然后通知适配器,以便用户界面在响应中发生变化,但是如何逆转这个过程呢 列表片段: public class ListViewDemoFragment extends ListFragment { private static List<Task>
public class ListViewDemoFragment extends ListFragment {
private static List<Task> mItems; // ListView items list
private ListViewDemoAdapter mAdapter;
private IntentFilter intfil;
private DataBaseWrapper db;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mItems = new ArrayList<Task>();
intfil = new IntentFilter("CUSTOM");
db = new DataBaseWrapper(getActivity());
mItems = db.getAllTasks();
mAdapter = new ListViewDemoAdapter(getActivity(), mItems);
setListAdapter(mAdapter);
getListView().setOnItemLongClickListener(new OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
mItems.remove(arg2);
mAdapter.notifyDataSetChanged();
return true;
}
});
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
// remove the dividers from the ListView of the ListFragment
getListView().setDivider(null);
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
// retrieve theListView item
Task item = mItems.get(position);
Toast.makeText(getActivity(), item.title, Toast.LENGTH_SHORT).show();
}
private BroadcastReceiver b = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String name = intent.getStringExtra("name");
String dline = intent.getStringExtra("dline");
int pri = intent.getIntExtra("pri", 2);
//String des = intent.getStringExtra("des");
Task t = new Task(pri, name, dline, false);
mItems.add(t);
mAdapter.notifyDataSetChanged();
db.addTask(t);
}
};
public void onResume() {
super.onResume();
getActivity().registerReceiver(b, intfil);
}
public void onDestroy() {
super.onDestroy();
getActivity().unregisterReceiver(b);
}
public void onPause() {
super.onPause();
db.close();
}
public List<Task> getlist() {
return mItems;
}
}
主要活动
public class MainActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void add(View view) {
startActivityForResult(new Intent(MainActivity.this, TaskInput.class), 1);
}
public void save(View view)
{
DataBaseWrapper db = new DataBaseWrapper(this);
db.deleteAll();
ListViewDemoFragment f = (ListViewDemoFragment)getFragmentManager().findFragmentById(R.id.frag);
for (Task item: f.getlist())
{
db.addTask(item);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==1)
{
sendBroadcast(data);
}
}
尝试按如下方式修改适配器:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder viewHolder;
final Task item = getItem(position);
if (convertView == null) {
// inflate the GridView item layout
LayoutInflater inflater = LayoutInflater.from(getContext());
convertView = inflater.inflate(R.layout.listview_item, parent, false);
// initialize the view holder
viewHolder = new ViewHolder();
viewHolder.ivIcon = (ImageView) convertView.findViewById(R.id.ivIcon);
viewHolder.tvTitle = (TextView) convertView.findViewById(R.id.tvTitle);
viewHolder.tvDescription = (TextView) convertView.findViewById(R.id.tvDescription);
viewHolder.checkbox = (CheckBox) convertView.findViewById(R.id.checkbox);
viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
item.setCheck(isChecked);
}
});
convertView.setTag(viewHolder);
} else {
// recycle the already inflated view
viewHolder = (ViewHolder) convertView.getTag();
}
Drawable d = null;
switch (item.icon) {
case 0:
d = ContextCompat.getDrawable(getContext(), R.drawable.red);
break;
case 1:
d = ContextCompat.getDrawable(getContext(), R.drawable.yellow);
break;
case 2:
d = ContextCompat.getDrawable(getContext(), R.drawable.green);
break;
}
viewHolder.ivIcon.setImageDrawable(d);
viewHolder.tvTitle.setText(item.title);
viewHolder.tvDescription.setText(item.deadline);
viewHolder.checkbox.setChecked(item.check);
return convertView;
}
如果您也发布一些相关代码,这将有所帮助。
public class MainActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void add(View view) {
startActivityForResult(new Intent(MainActivity.this, TaskInput.class), 1);
}
public void save(View view)
{
DataBaseWrapper db = new DataBaseWrapper(this);
db.deleteAll();
ListViewDemoFragment f = (ListViewDemoFragment)getFragmentManager().findFragmentById(R.id.frag);
for (Task item: f.getlist())
{
db.addTask(item);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
{
super.onActivityResult(requestCode, resultCode, data);
if(requestCode==1)
{
sendBroadcast(data);
}
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder viewHolder;
final Task item = getItem(position);
if (convertView == null) {
// inflate the GridView item layout
LayoutInflater inflater = LayoutInflater.from(getContext());
convertView = inflater.inflate(R.layout.listview_item, parent, false);
// initialize the view holder
viewHolder = new ViewHolder();
viewHolder.ivIcon = (ImageView) convertView.findViewById(R.id.ivIcon);
viewHolder.tvTitle = (TextView) convertView.findViewById(R.id.tvTitle);
viewHolder.tvDescription = (TextView) convertView.findViewById(R.id.tvDescription);
viewHolder.checkbox = (CheckBox) convertView.findViewById(R.id.checkbox);
viewHolder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
item.setCheck(isChecked);
}
});
convertView.setTag(viewHolder);
} else {
// recycle the already inflated view
viewHolder = (ViewHolder) convertView.getTag();
}
Drawable d = null;
switch (item.icon) {
case 0:
d = ContextCompat.getDrawable(getContext(), R.drawable.red);
break;
case 1:
d = ContextCompat.getDrawable(getContext(), R.drawable.yellow);
break;
case 2:
d = ContextCompat.getDrawable(getContext(), R.drawable.green);
break;
}
viewHolder.ivIcon.setImageDrawable(d);
viewHolder.tvTitle.setText(item.title);
viewHolder.tvDescription.setText(item.deadline);
viewHolder.checkbox.setChecked(item.check);
return convertView;
}