android - 将列表中的临时选定项目保存到 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 中选择一个单词,然后单击保存按钮,然后取消选择该单词并选择一个新单词,我希望同时保存,而不仅仅是后一个。
有人可以帮我吗?提前致谢!
解决方案
推荐阅读
- selenium-webdriver - 获取 HTMLUnit 驱动程序(版本 2.52)异常(java.lang.ClassNotFoundException) - w Selenium - 3.141.59 和 Java
- r - 给定R中的父子关系,如何展平分层数据结构
- fabricjs - 在点之间画线以创建形状 Fabric.js?
- javascript - 当我使用 destroy() 函数时,为什么 jquery-jcrop 会破坏我的 Leaflet 地图?
- php - 未找到列:1054 未知列“字段列表”中的“coin_user.symbol”
- javascript - 拉伸和旋转 div 元素(JS 变换)
- terraform - 是否可以在 terraform 提供程序中要求独占或资源属性?如何?
- javascript - 如何在保持对构造函数变量的访问的同时进行可变间隔循环?
- c++ - 如何在 O(sqrt(N)) 时间复杂度中解决“X^2 - Y 是完美平方,X, Y ≤ N”?
- python - 如何在与 Python 后端相同的端口上有效地提供 React 文件