首页 > 解决方案 > 将列表中的临时选定项目保存到 Fragment 中的 ExpandableList

问题描述

好的,所以我是编程新手,我构建了这个应用程序,它可以找到与输入单词押韵的单词。

首先输入单词,然后单击“搜索押韵”,然后您会在新的 ResultActivity 中将结果显示为带有可检查单词的列表。

如果您选中一个单词(或更多),则会出现一个按钮,让您保存选定的单词。

然后您可以返回 MainActivity 并在选项卡 (FragmentFavourite) 中查看保存的单词。

FragmentFavourite是一个 ExpandableList,以原始单词为头,保存的单词为其子

我的可检查项目有一些问题。如果我检查一个结果单击按钮将其保存在 FragmentFavourite 中,然后取消选中它并转到 Favourite,只出现头部,即原始单词,但没有保存的单词。

如果我检查一个结果,单击按钮,然后转到收藏选项卡,一切正常。

选择和取消选择我要保存然后保存的单词有一些错误,但我似乎无法修复它......

结果Activity.java

public class ResultActivity extends AppCompatActivity {
    //create an ArrayList object to store selected item
    ArrayList<String> selectedItems = new ArrayList<>();
    private String originalWord;

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

        getSupportActionBar().setTitle("Results");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        final Button btnSave = (Button) findViewById(R.id.btnSave);
        btnSave.setEnabled(false);
        Intent intent = getIntent();
        originalWord = intent.getStringExtra("OriginalWord");
        ArrayList<String> myArray = intent.getStringArrayListExtra("WordList");


        ListView checkableListView = (ListView) findViewById(R.id.checkableListView);
        checkableListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

        ArrayAdapter<String> arrayAdapter;
        arrayAdapter = new ArrayAdapter<String>(this, R.layout.rowlayout, R.id.txt_title , myArray);
        checkableListView.setAdapter(arrayAdapter);
        checkableListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                String selectedWord = ((TextView)view).getText().toString();
                if(selectedItems.contains(selectedWord)){
                    selectedItems.remove(selectedWord); //uncheck Word
                    if(selectedItems.size() == 0){
                        btnSave.setEnabled(false);
                    }

                }
                else{
                    selectedItems.add(selectedWord); //check Word
                    //savedItems.add(selectedWord);
                    if(selectedItems.size() > 0){
                        btnSave.setEnabled(true);
                    }
                }

            }
        });
    }
    public void saveSelectedItems(View view){
        String items = "";
        HashMap<String, List<String>> savedWords = new HashMap<String, List<String>>();
        savedWords.put(originalWord, selectedItems);
        for(String word : selectedItems){
            items += "-" + word + "\n";
        }
        Toast.makeText(this,"Words saved: \n" + items, Toast.LENGTH_LONG).show();

        ViewPagerAdapter adapter = MainActivity.getAdapter();
        FragmentFavourite fragmentFavourite = (FragmentFavourite) adapter.getItem(1);
        fragmentFavourite.putArguments(originalWord, savedWords);
    }
}

我将我选择的单词保存在 Array selectedItems中,然后,如果我单击按钮保存所选项目,我将调用saveSelectedItems方法并将selectedItems传递给FragmentFavourite

FragmentFavourite.java

public class FragmentFavourite extends Fragment {
    View view;
    ExpandableListAdapter listAdapter;
    ExpandableListView expListView;
    List<String> listDataHeader = new ArrayList<String>();;
    HashMap<String, List<String>> listDataChild = new HashMap<String, List<String>>();
    public FragmentFavourite() {
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.favourite_fragment, container, false);
        // get the listview
        expListView = (ExpandableListView) view.findViewById(R.id.lvExp);

        // preparing list data
        listAdapter = new ExpandableListAdapter(getContext(), listDataHeader, listDataChild);
        // setting list adapter
        expListView.setAdapter(listAdapter);
        return view;
    }
    public void putArguments(String originalWord, HashMap<String, List<String>> savedWords){
        listAdapter.addData(originalWord, savedWords);
        expListView.setAdapter(listAdapter);
        listAdapter.notifyDataSetChanged();
    }


}

然后我将数据传递给适配器以插入数据

ExpandableListAdapter.java

public class ExpandableListAdapter extends BaseExpandableListAdapter {

    private Context _context;
    private List<String> _listDataHeader; // header titles
    // child data in format of header title, child title
    private HashMap<String, List<String>> _listDataChild;

    public ExpandableListAdapter(Context context, List<String> listDataHeader,
                                 HashMap<String, List<String>> listChildData) {
        this._context = context;
        this._listDataHeader = listDataHeader;
        this._listDataChild = listChildData;
    }

    @Override
    public Object getChild(int groupPosition, int childPosititon) {
        return this._listDataChild.get(this._listDataHeader.get(groupPosition))
                .get(childPosititon);
    }

    @Override
    public long getChildId(int groupPosition, int childPosition) {
        return childPosition;
    }

    @Override
    public View getChildView(int groupPosition, final int childPosition,
                             boolean isLastChild, View convertView, ViewGroup parent) {

        final String childText = (String) getChild(groupPosition, childPosition);

        if (convertView == null) {
            LayoutInflater infalInflater = (LayoutInflater) this._context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.list_item, null);
        }

        TextView txtListChild = (TextView) convertView
                .findViewById(R.id.lblListItem);

        txtListChild.setText(childText);
        return convertView;
    }

    @Override
    public int getChildrenCount(int groupPosition) {
        return this._listDataChild.get(this._listDataHeader.get(groupPosition))
                .size();
    }

    @Override
    public Object getGroup(int groupPosition) {
        return this._listDataHeader.get(groupPosition);
    }

    @Override
    public int getGroupCount() {
        return this._listDataHeader.size();
    }

    @Override
    public long getGroupId(int groupPosition) {
        return groupPosition;
    }

    @Override
    public View getGroupView(int groupPosition, boolean isExpanded,
                             View convertView, ViewGroup parent) {
        String headerTitle = (String) getGroup(groupPosition);
        if (convertView == null) {
            LayoutInflater infalInflater = (LayoutInflater) this._context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.list_group, null);
        }

        TextView lblListHeader = (TextView) convertView
                .findViewById(R.id.lblListHeader);
        lblListHeader.setTypeface(null, Typeface.BOLD);
        lblListHeader.setText(headerTitle);

        return convertView;
    }

    @Override
    public boolean hasStableIds() {
        return false;
    }

    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
    }

    //Add method to save results from ResultActivity
    public void addData(String originalWord, HashMap<String, List<String>> savedWords){

        List<String> temp = savedWords.get(originalWord);
        if(_listDataChild.containsKey(originalWord)){
            for(String word :temp){
                if(_listDataChild.get(originalWord).contains(word)){
                    continue;

                } else{
                    _listDataChild.get(originalWord).add(word);
                }
            }

        } else{
            this._listDataHeader.add(originalWord);
            _listDataChild.put(originalWord,temp);
        }

    }
}

问题是,如果我选择一个单词并保存它并转到 FavouriteFragment I,listDataChild 首先是空的,然后被填充。如果我选择了一些东西,然后取消选择它并选择另一个单词,listDataChild 突然被所选单词填充,而没有单击保存按钮

所以我想要的是:如果我在 ResultActivity 中选择一个单词,然后单击保存按钮,然后取消选择该单词并选择一个新单词,我希望同时保存,而不仅仅是后一个。

有人可以帮我吗?提前致谢!

标签: android

解决方案


推荐阅读