gpt4 book ai didi

java - 从 Activity 的 Fragment 上的数组列表中删除项目

转载 作者:行者123 更新时间:2023-12-02 12:04:34 24 4
gpt4 key购买 nike

我现在正在尝试通过创建一个可以删除项目的简单杂货 list 来了解如何在 fragment 和 Activity 之间来回传递数据。杂货 ArrayList 将与删除按钮一起存在于 Activity 中,而 Fragment 将显示 ArrayList。当应用程序启动并加载所有内容时,用户将能够从 Fragment 的列表中选择一个项目。当用户点击“删除”时,ArrayList 中的所选项目将被删除,并且 Fragment 将重新加载更新的列表。

我可以启动应用程序,所有内容都会正确加载,直到我删除项目。该项目被删除(我有一个日志要检查),但我需要找到一种方法来更新 fragment 中的 ArrayList。当我再次尝试删除另一个项目时,应用程序崩溃了。

这是我的日志:

java.lang.IllegalStateException: The content of the adapter has 
changed but ListView did not receive a notification. Make sure
the content of your adapter is not modified from a background
thread, but only from the UI thread. Make sure your adapter calls
notifyDataSetChanged() when its content changes. [in ListView(2131427424,
class android.widget.ListView) with Adapter(class android.widget.ArrayAdapter)]

这是我的主要 Activity :

public class MainActivity extends AppCompatActivity implements Tab1.OnDataPass {

public SectionsPageAdapater mSectionsPageAdapter;
ViewPager mViewPager;

ArrayList<String> valuesArray = new ArrayList<String>();

int index = -1;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

mSectionsPageAdapter = new SectionsPageAdapater(getSupportFragmentManager());
mViewPager = (ViewPager) findViewById(R.id.viewContainer);

valuesArray.add("apple");
valuesArray.add("banana");
valuesArray.add("cherry");
valuesArray.add("dragon fruit");
valuesArray.add("eggplant");

mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}

@Override
public void onPageSelected(int position) {

}

@Override
public void onPageScrollStateChanged(int state) {

}
});

setupViewPager(mViewPager);
}

@Override
public void onDataPass(Integer indexNum) {
index = indexNum;
}

public void onClickDelete (View v) {

if (index >= 0) {
valuesArray.remove(index);
}

index = -1;
}

private void setupViewPager(ViewPager viewPager) {
SectionsPageAdapater adapter = new SectionsPageAdapater(getSupportFragmentManager());
adapter.addFragment(new Tab1(), "TAB1");
viewPager.setAdapter(adapter);
}

public ArrayList<String> getDataLog() {
return valuesArray;
}
}

我的 fragment :

public class Tab1 extends Fragment {
Button btnPass, btnPass2;
ListView listview;
ArrayList<String> valuesArray = new ArrayList<String>();

int index = -1;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.activity_tab1,container,false);

btnPass = view.findViewById(R.id.btnPass);
btnPass2 = view.findViewById(R.id.btnPass2);

listview = view.findViewById (R.id.listview);

MainActivity activity = (MainActivity) getActivity();
valuesArray = activity.getDataLog();


ArrayAdapter<String> adapter = new ArrayAdapter<String>(getContext(),
android.R.layout.simple_list_item_1, valuesArray);
listview.setAdapter(adapter);

listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapter, View view, int position, long id) {
index = (int) id;
passData((index));
}
});

return view;
}



OnDataPass dataPasser;

public interface OnDataPass {
void onDataPass(Integer index);
}

@Override
public void onAttach(Context a) {
super.onAttach(a);
dataPasser = (OnDataPass) a;
}

public void passData(Integer index) {
dataPasser.onDataPass(index);
}
}

还有我的适配器:

public class SectionsPageAdapater extends FragmentPagerAdapter {

private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();

public void addFragment(Fragment fragment, String title) {
mFragmentList.add(fragment);
mFragmentTitleList.add(title);
}

public SectionsPageAdapater(FragmentManager fm) {
super(fm);
}

@Override
public CharSequence getPageTitle(int position) {
return mFragmentTitleList.get(position);
}

@Override
public Fragment getItem(int position) {
return mFragmentList.get(position);
}

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

最佳答案

在Android中,每个ListView对象都有一个对应的Adapter对象,它实际上保存数据并将View传递给ListView 来显示它。需要注意的是,每次适配器保存数据时,您都必须显式调用适配器的 notifyDatasetChanged 方法,以确保您的 ListView 对象收到有关更改的通知并处理相应的 UI 更新。

因此,在您的情况下,您应该将 ArrayAdapter 对象存储在 Activity 类中,并将其传递给 Fragment,而不是保存数据的实际 ArrayList。每当用户按下删除按钮时,onClickDelete 方法就会被调用。在该方法中,在改变实际的 ArrayList 后,您应该调用适配器的 notifyDatasetChanged 方法。

关于java - 从 Activity 的 Fragment 上的数组列表中删除项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46993251/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com