当前位置: 首页 > 知识库问答 >
问题:

如何通过主活动更新片段之间的列表视图内容

史昱
2023-03-14

我有三个片段,第二个和第三个,在它们各自的布局中有一个listView。

换句话说,最初第二个片段和第三个片段的listView包含以下内容,其中CB:是检查框,IV:是ImageView,t是: text view,SaveButton是一个按钮

t1........CB.......IV
t2........CB.......IV
t3........CB.......IV
t4........CB.......IV
t5........CB.......IV
t6........CB.......IV
    SaveButton

我想做的是,当我在第二个片段中,并“使用复选框”从listView中选择一个项目,然后单击“保存”按钮时,我选择的项目应该从第三个片段的listView中删除。

为了实现这一点,在getview()中,我检查了第二个片段的listView中是否选中了复选框,如果选中了,我将选中的项目添加到列表中。如getView()所示:

第二个片段:

private void setUpListView() {
    // TODO Auto-generated method stub
    this.topicsList = new ArrayList<String>();

    for (int i = 0; i < this.topics.length; i++) {
        this.topicsList.add(topics[i]);
    }

    this.adapter = new ListViewAdapter(getActivity(), this.topicsList, ECO_FRAG_ID);
    this.listView.setAdapter(adapter);
}

第三个片段:

private void setUpListView() {
    // TODO Auto-generated method stub
    this.topicsList = new ArrayList<String>();

    for (int i = 0; i < this.topics.length; i++) {
        this.topicsList.add(topics[i]);
    }

    this.adapter = new ListViewAdapter(getActivity(), this.topicsList, LOGGER_FRAG_ID);
    this.listView.setAdapter(adapter);
}

基本适配器:

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub

    if (convertView == null) {
        LayoutInflater layoutinflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
        convertView = layoutinflater.inflate(R.layout.list_items_layout, null);
    }

    if (this.checkedItemsList1 == null) {
        this.checkedItemsList1 = new ArrayList<String>();
    }

    if (this.checkedItemsList2 == null) {
        this.checkedItemsList2 = new ArrayList<String>();
    }

    final TextView tv = (TextView) convertView.findViewById(R.id.tvlist_topic);
    final CheckBox cb = (CheckBox) convertView.findViewById(R.id.cbList_hook);
    final ImageView iv = (ImageView) convertView.findViewById(R.id.ivList_delete);

    tv.setText(this.topicsList.get(position));

    if (cb.isChecked() && (this.id == 1) ) {
        this.checkedItemsList1.add(this.topicsList.get(position));
        this.setCheckedItemsList1(this.checkedItemsList1);
    }
    if (cb.isChecked() && (this.id == 2) ) {
        this.checkedItemsList2.add(this.topicsList.get(position));
        this.setCheckedItemsList2(this.checkedItemsList2);
    }

    iv.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            if (cb.isChecked())
                cb.setChecked(false);

            topicsList.remove(position);
            notifyDataSetChanged();
        }
    });

    return convertView;
}

我创建了一个接口,它在onAttach()中初始化,并在我单击第二个片段中的savebuton时调用,如下所示:

private OnClickListener btnSaveListener = new OnClickListener() {

    @Override
    public void onClick(View v) {
        // TODO Auto-generated method stub
        Toast.makeText(getActivity(), "Save to SQLite", Toast.LENGTH_SHORT).show();
        Log.d(TAG, "size: " + adapter.getCheckedItemsList1().size());
        iCSC.onCheckedStateChanged(adapter.checkedItemsList1, ECO_FRAG_ID);
    }
};

这个接口,main Active实现了它,在接口的实现中,我通过第三个片段中的公共方法将检查过的项目从第二个片段传递到第三个片段,更新列表,然后将列表分配给适配器,如下所示:

@Override
public void onCheckedStateChanged(ArrayList<String> list, int id) {
    // TODO Auto-generated method stub

    switch (id) {
    case 1:
        ((Logger_Settings_Frag) this.fragList.get(2)).updateTopicList(list);
        break;
    case 2:

        break;
    }
}

**updateTopicList in the third fragment**

public void updateTopicList(ArrayList<String> list) {
    for (String str : list) {
        this.topicsList.remove(str);
    }

    this.adapter = new ListViewAdapter(getActivity(), this.topicsList, LOGGER_FRAG_ID);
    this.listView.setAdapter(adapter);
}

第三个片段中的updateTopicList

public void updateTopicList(ArrayList<String> list) {
    for (String str : list) {
        this.topicsList.remove(str);
    }

    this.adapter = new ListViewAdapter(getActivity(), this.topicsList, LOGGER_FRAG_ID);
    this.listView.setAdapter(adapter);
}

当我运行该代码时,在第二个片段的saveButton侦听器中,日志。d消息显示应包含选中项目的列表大小为零?!

请看一下代码,让我知道我遗漏了什么?

共有1个答案

宗烨赫
2023-03-14

试试这个:这是一个带有两个片段的示例项目OneActivity:public ArrayList myBeansList\u frgnt1;public ArrayList myBeansList\u frgnt2;通过单击“保存”按钮,迭代myBeansList\u frgnt1并检查是否选择了任何项目。如果选择了项目,我会将该项目添加到myBeansList\u frgnt2。显示在片段2中。

主要活动:

public class MainActivity extends FragmentActivity {
private FragmentManager mFragmentManager;
private MyFragment1 myFragment1;
public ArrayList<MyBean> myBeansList_frgnt1;
public ArrayList<MyBean> myBeansList_frgnt2;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mFragmentManager = getSupportFragmentManager();
    myBeansList_frgnt1 = new ArrayList<MyBean>();
    myBeansList_frgnt2 = new ArrayList<MyBean>();

}

@Override
protected void onResume() {
    super.onResume();
    myFragment1 = new MyFragment1();
    FragmentTransaction mTransaction = mFragmentManager.beginTransaction();
    mTransaction.replace(R.id.framid, myFragment1, "applock").commit();
}

}

维护MyBean对象中的状态

@Override
public View getView(int position, View view, ViewGroup parent) {
    final ViewHolder holder;
    if (view == null) {
        holder = new ViewHolder();
        view = LayoutInflater.from(mContext).inflate(R.layout.list_item, null);
        holder.mTextView = (TextView) view.findViewById(R.id.textView1);
        holder.mBox = (CheckBox) view.findViewById(R.id.checkBox1);
        holder.mImageView = (ImageView) view.findViewById(R.id.imageView1);
        view.setTag(holder);

    } else {
        holder = (ViewHolder) view.getTag();
    }
    final MyBean mBean = mBeansList.get(position);

    holder.mBox.setOnCheckedChangeListener(null);
    holder.mBox.setChecked(mBean.isChecked());
    holder.mBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if (isChecked) {
                mBean.setChecked(true);
            } else {
                mBean.setChecked(false);
            }
        }
    });
    // setting text and image
    holder.mTextView.setText(mBean.getmName());
    holder.mImageView.setImageResource(mBean.getmImgId());
    return view;
}
private class ViewHolder {
    TextView mTextView;
    CheckBox mBox;
    ImageView mImageView;
}

碎片1:

public class MyFragment1 extends Fragment {
private ListView mListView;
private MyBaseAdpter myBaseAdpter;
private Button mButton;

@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_layout, null);
    mListView = (ListView) view.findViewById(R.id.listviewid);
    mButton = (Button) view.findViewById(R.id.bttnid);
    return view;
}

@Override
public void onResume() {
    super.onResume();
    final MainActivity mActivity = (MainActivity) getActivity();
    myBaseAdpter = new MyBaseAdpter(mActivity.myBeansList_frgnt1, getActivity());
    mListView.setAdapter(myBaseAdpter);
    mButton.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            int size = mActivity.myBeansList_frgnt1.size();
            for (int i = 0; i < size; i++) {
                MyBean mMyBean = mActivity.myBeansList_frgnt1.get(i);
                if (mMyBean.isChecked()) {
                    mActivity.myBeansList_frgnt2.add(mMyBean);
                }
            }
        }
    });
}

}

片段2:

public class MyFragment2 extends Fragment {
private ListView mListView;
private MyBaseAdpter myBaseAdpter;

@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_layout, null);
    mListView = (ListView) view.findViewById(R.id.listviewid);
    return view;
}

@Override
public void onResume() {
    super.onResume();
    MainActivity mActivity = (MainActivity) getActivity();
    myBaseAdpter = new MyBaseAdpter(mActivity.myBeansList_frgnt2, getActivity());
    mListView.setAdapter(myBaseAdpter);
}

}

MyBean:

public class MyBean {
private String mName;
private int mImgId;
private boolean isChecked;

public String getmName() {
    return mName;
}

public void setmName(String mName) {
    this.mName = mName;
}

public int getmImgId() {
    return mImgId;
}

public void setmImgId(int mImgId) {
    this.mImgId = mImgId;
}

public boolean isChecked() {
    return isChecked;
}

public void setChecked(boolean isChecked) {
    this.isChecked = isChecked;
}

public MyBean() {
    super();
    // TODO Auto-generated constructor stub
}

}

 类似资料:
  • 问题内容: 我搜索了许多看起来像这样的问题,但没有找到我的答案。 我有一个活动,该活动具有3个可通过操作栏访问的选项卡。我通过添加3个片段来实现这一点,这些片段使我自定义视图扩展了视图类。 在数据库更改的那一刻,我尝试通过调用invalidate()/ postinvalidate()刷新选项卡中的视图,但这不起作用。正如我考虑的其他许多选项一样,调用片段的onCreateView也是如此。 但是

  • 问题内容: 我要在我的下一个Android项目中使用Retrofit 2.1.0。我想使用设计模式,因此为每个REST调用创建单独的类,即 IBalanceService.java BalanceRestClient.java BalanceActivity.java 如何通过onResponse()更新活动/片段中的UI? 附加信息: 最小SDK:19个 目标SDK:23个 使用OkHttp和g

  • 我有一个包含例如一个按钮的片段,我想允许包含该片段的活动更改此按钮视图,例如颜色和标题或src图像。最好的方法是什么? 更新:如果我不够清楚,很抱歉,但我希望活动可以随心所欲地更改整个视图,比如设置填充、颜色或任何东西。它将以编程方式创建视图,片段应该用新视图替换旧视图,并更改视图的ID,以便片段代码不受影响。如果我在片段中创建了获取这些视图的方法,那么主活动应该在什么时候调用它们?因为活动必须等

  • 这个问题多半是征求意见,对我的APP最好的处理方式。我有三个碎片被一个活动处理。片段A有一个可点击的元素照片,片段B有4个可点击的元素按钮。另一个片段只是在照片被点击时显示细节。我在用ActionBarsherlock。 前进和后退按钮需要将照片分别改为下一个或上一个姿势。我可以把照片和按钮放在同一个片段中,但我想把它们分开,以防我想在平板电脑中重新排列它们。 我需要一些建议--我应该把片段A和B

  • 我有一个活动,将使用下面的方法动态添加片段。 FragmentA有一个文本视图。我的活动中有一个导航抽屉,我想根据在导航抽屉中单击的项目在片段(例如FragmentA、FragmentB和FragmentC)之间切换。当更改为另一个片段时,如何保存片段的状态。我已经实现了onSavedInstance(Bundle outState)和onActivityCreated(Bundle savedI

  • 问题内容: 我想将自己更改为我尝试过的内容,但无法将我的活动更改为片段。有人可以告诉我该怎么做吗?在哪里编辑我是Android上的新手。请告诉我和在此先感谢 这是我的活动: 问题答案: 只要了解一些步骤,您就可以现在和将来轻松地将Activity转换为Fragment ..: 首先,不要扩展,只要扩展.. 例如: 然后覆盖.. 然后通过LayoutInflater扩展布局,并分配给进一步用于子视图