Android fragments 在android中,如何在一个片段上创建一个项目,然后在另一个片段上显示?

Android fragments 在android中,如何在一个片段上创建一个项目,然后在另一个片段上显示?,android-fragments,Android Fragments,我有两个片段,我希望能够一起交流。在我的FragmentPlannerAddItem中,我希望能够创建一个事件或任务(在代码中,我实际上称这些为“活动”或“活动项”),就像在Google Calenadar中一样。有关事件的信息(时间、日期、名称等)输入FragmentPlanneAddItem片段,然后发送到FragmentPlanner片段,用户可以在该片段中获得计划事件的概述(我在FragmentPlanner中有一个列表视图) 问题是,当我在FragmentPlannerAddItem中

我有两个片段,我希望能够一起交流。在我的FragmentPlannerAddItem中,我希望能够创建一个事件或任务(在代码中,我实际上称这些为“活动”或“活动项”),就像在Google Calenadar中一样。有关事件的信息(时间、日期、名称等)输入FragmentPlanneAddItem片段,然后发送到FragmentPlanner片段,用户可以在该片段中获得计划事件的概述(我在FragmentPlanner中有一个列表视图)

问题是,当我在FragmentPlannerAddItem中创建项目时,该项目不会显示在FragmentPlanner上。这很奇怪,因为我完全能够在Fragment Planner上创建列表中的两个项目(它们是测试项目),但当我稍后从FragmentPlannerAddItem添加项目时,新项目不可见

我通过让FragmentPlanner和FragmentPlanneAddItem使用方法定义它们自己的接口,实现了片段之间的通信。然后,这些接口由HostMainActivity实现,这两个片段绑定到HostMainActivity。因此,当FragmentPlannerAddItem向FragmentPlanner发送信息时,它首先将信息发送给HostMainActivity,然后HostMainActivity将信息发送给FragmentPlanner

我已经对此进行了调试,并发现包含我的行项目的列表确实包含此新项目。但是,它不会与启动时创建的测试项一起显示。我从我的教授那里得到了一个提示,这可能与我的自定义适配器有关(因为我的其余代码看起来不错,他说)。他没有时间检查整个适配器。我的自定义适配器中发生了一些事情,似乎把事情搞砸了。我尝试过使用不同的适配器,但我很难理解如何正确设置它。我不知道,什么代码是适配器工作所必需的,什么代码是非必需的,可能会做一些奇怪的事情

总之,我希望用户能够在FragmentPlannerAddItem片段上创建一个事件/任务,然后将事件显示在一个列表上,并带有相应的时间和选中/未选中的框。现在我只想在FragmentPlannerAddItem上创建时,在FragmentPlanner上显示一些行项目。 假设问题出在我的自定义适配器中的某个地方,有人能帮助识别此适配器中可能出现的错误吗

提前谢谢。请询问我是否对所描述的内容太不清楚

问候 安德烈亚斯

在CustomAdapter中

public class CustomAdapter extends ArrayAdapter<ActivityItem> implements View.OnClickListener{

private ArrayList<ActivityItem> dataSet;
Context mContext;

// View lookup cache
private static class ViewHolder {
    TextView actName;
    TextView actTime;
    CheckBox actCheckbox;
}

public CustomAdapter(ArrayList<ActivityItem> data, Context context) {
    super(context, R.layout.row_item, data);
    this.dataSet = data;
    this.mContext=context;

}

public void addItem(String name, String time, String date){
    dataSet.add(new ActivityItem(name, new Date(0)));
    notifyDataSetChanged();
}

private int lastPosition = -1;

@Override
public int getCount() {
    return dataSet.size();
}

@Override
public ActivityItem getItem(int i) {
    return dataSet.get(i);
}

@Override
public long getItemId(int i) {
    return i;
}

// @SuppressLint("WrongViewCast")
@Override
public View getView(int position, View convertView, ViewGroup parent) {

    // Get the data item for this position
    ActivityItem activityItem = getItem(position);
    // Check if an existing view is being reused, otherwise inflate the view
    ViewHolder viewHolder; // view lookup cache stored in tag

    final View result;

    if (convertView == null) {

        viewHolder = new ViewHolder();
        LayoutInflater inflater = LayoutInflater.from(mContext);
        convertView = inflater.inflate(R.layout.row_item, parent, false);
        viewHolder.actName = (TextView) convertView.findViewById(R.id.description);
        viewHolder.actTime = (TextView) convertView.findViewById(R.id.timeField);
        viewHolder.actCheckbox = (CheckBox) convertView.findViewById(R.id.checkBox);

        result=convertView;

        convertView.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) convertView.getTag();
        result=convertView;
    }

    /*Animation animation = AnimationUtils.loadAnimation(mContext, (position > lastPosition) ? R.anim.up_from_bottom : R.anim.down_from_top);
    result.startAnimation(animation);
    lastPosition = position;*/

    viewHolder.actName.setText(activityItem.getName());
    viewHolder.actTime.setText(activityItem.getTime().toString());
    viewHolder.actCheckbox.setChecked(activityItem.getChecked());
   /* viewHolder.txtType.setText(activityItem.getType());
    viewHolder.txtVersion.setText(activityItem.getVersion_number());
    viewHolder.info.setOnClickListener(this);
    viewHolder.info.setTag(position);*/
    // Return the completed view to render on screen
    return convertView;
}
公共类CustomAdapter扩展ArrayAdapter实现View.OnClickListener{
私有ArrayList数据集;
语境;
//视图查找缓存
私有静态类视图持有者{
TextView actName;
文本视图时间;
复选框actCheckbox;
}
公共CustomAdapter(ArrayList数据、上下文){
super(上下文、R.layout.row_项、数据);
this.dataSet=数据;
this.mContext=上下文;
}
public void addItem(字符串名称、字符串时间、字符串日期){
添加(新活动项(名称,新日期(0));
notifyDataSetChanged();
}
private int lastPosition=-1;
@凌驾
public int getCount(){
返回dataSet.size();
}
@凌驾
公共活动项目getItem(int i){
返回dataSet.get(i);
}
@凌驾
公共长getItemId(int i){
返回i;
}
//@SuppressLint(“错误视图广播”)
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
//获取此职位的数据项
ActivityItem ActivityItem=getItem(位置);
//检查是否正在重用现有视图,否则会膨胀视图
ViewHolder ViewHolder;//存储在标记中的视图查找缓存
最终查看结果;
if(convertView==null){
viewHolder=新的viewHolder();
LayoutFlater充气机=LayoutFlater.from(mContext);
convertView=充气机。充气(R.layout.row_项目,父项,false);
viewHolder.actName=(TextView)convertView.findViewById(R.id.description);
viewHolder.actTime=(TextView)convertView.findViewById(R.id.timeField);
viewHolder.actCheckbox=(复选框)convertView.findViewById(R.id.CheckBox);
结果=转换视图;
convertView.setTag(viewHolder);
}否则{
viewHolder=(viewHolder)convertView.getTag();
结果=转换视图;
}
/*Animation Animation=AnimationUtils.loadAnimation(mContext,(位置>最后位置)?R.anim.up\u from\u bottom:R.anim.down\u from\u top);
结果:开始动画(动画);
最后位置=位置*/
viewHolder.actName.setText(activityItem.getName());
viewHolder.actTime.setText(activityItem.getTime().toString());
viewHolder.actCheckbox.setChecked(activityItem.getChecked());
/*viewHolder.txtType.setText(activityItem.getType());
viewHolder.txtVersion.setText(activityItem.getVersion_number());
viewHolder.info.setOnClickListener(这个);
viewHolder.info.setTag(位置)*/
//返回要在屏幕上渲染的已完成视图
返回视图;
}

}

适配器中不应该有可变的ArrayList,也不应该修改它,适配器应该只知道如何将项目列表映射到根据项目状态设置的视图列表。像
updateItems(List)
这样的方法可以获取
集合。不可修改的列表(List)
可以防止这种错误。我的问题现在解决了!我从大学的一名助教那里得到了帮助。很明显,我的自定义适配器很好。TA通过使用bundle提供了一个解决方案。通过阅读本文,我们可以解决一个与我类似的问题:适配器中不应该有可变的ArrayList,也不应该修改它,适配器应该只知道如何将项目列表映射到根据项目设置的视图列表