代码之家  ›  专栏  ›  技术社区  ›  Pam

从活动片段的arraylist中删除项

  •  0
  • Pam  · 技术社区  · 7 年前

    我现在正试图通过创建一个简单的购物清单来学习如何在活动片段之间来回传递数据,在这个清单中可以删除项目。杂货店ArrayList将与delete按钮一起位于活动中,片段将显示ArrayList。当应用程序启动并加载所有内容时,用户将能够从列表中选择片段中的项目。当用户点击Delete时,ArrayList中的选定项将被删除,片段将重新加载更新的列表。

    我可以启动应用程序并正确加载所有内容,直到我删除一个项目。该项删除(我有一个日志要检查),但我需要找到一种方法来更新片段中的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)]
    

    以下是我的主要活动:

    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;
    }
    }
    

    我的片段:

    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();
    }
    }
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   eozd    7 年前

    在Android中,每个 ListView 对象具有相应的 Adapter 对象,该对象实际保存数据并传递 View 列表视图 来展示它。需要注意的是 每次适配器保存的数据发生更改时,都必须显式调用 notifyDatasetChanged 适配器的方法 列表视图

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

        2
  •  0
  •   PPartisan    7 年前

    Fragment / Activity 关系,以便:

    • 当你打电话的时候 passData ,您通过 position 而不是 id 值:。

      public void onItemClick(AdapterView<?> adapter, View view, int position, long id) {
          passData(position);
      }
      /* Activity */
      @Override
      public void onDataPass(int index) {
          this.indexToDelete = index;   
      }
      
    • onClickDelete ,删除元素并调用 notifyDataSetChanged() 在适配器上 ListView . 为此,您需要引用您的 碎片 (如果使用ViewPager,这比通常要复杂一些),或者您需要使用一些替代机制,如EventBus。在这里,您可以只存储对的引用 Tab1 :

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

    然后。。。

    public void onClickDelete (View v) {
          if(indexToDelete < 0 || indexToDelete >= valuesArray.size()) {
              return; //invalid index
          }
          valuesArray.remove(indexToDelete);
          tab1.listView.getAdapter().notifyDataSetChanged();
    }