如何清除列表清单中列出的项目:Android
我有一个显示公司列表的数组列表。这些公司中的每一个都有相应的城镇名称。此外,我为每个城镇名称创建按钮,以便当我点击任何城镇名称时,应该过滤ArrayList,并且只应显示具有该城镇名称的公司。如何清除列表清单中列出的项目:Android
的按钮都喜欢,
stringList.add(tempList.get(n).getTownName());
btnTag.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, 60));
btnTag.setText(stringList.get(k));
btnTag.setBackgroundResource(R.drawable.alpha_button_selector);
btnTag.setClickable(true);
townLayout.addView(btnTag);
单击按钮时,我取的按钮上的文本,因为它显示了小镇的名字,然后我打电话来过滤数据的方法,
btnTag.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
CharSequence name = btnTag.getText();
locationFilter(name);
}
});
用于过滤的数据,我创建一个新的ArrayList来存储经滤波的数据,例如,
ArrayList<CompanySearchResult> filtered = new ArrayList<CompanySearchResult>();
for (CompanySearchResult town : tempList) {
if (town.getTownName().equals(name)) {
filtered.add(town);
}
}
tempList.clear();
tempList.addAll(filtered);
listAdapter.notifyDataSetChanged();
数据正在过滤正确,但我的问题是当我第一次过滤数据时,我的tempList(这是包含数据的主ArrayList)被过滤的ArrayList的内容更新。 然后,当我点击另一个城镇名称的第二个按钮并尝试过滤它时,它会尝试过滤已经使用过滤数据更新的tempList,并且显示的结果为空。
因此,每次点击一个带有城镇名称的按钮时,如何再次使用原始数据填充我的tempList,然后以类似的方式对其进行过滤。
我已经研究过这个,但是找不到任何相关的东西。我也曾尝试在链接中提到的解决方案:
android filter custom array adapter and bring back old items again
How can i take a backup of an ArrayList in Java after i call .clear()?
然而,这并没有帮助。任何人都可以请帮助我如何实现这一目标?
再创建一个列表(eg.mainList),您创建tempList并把tempList成这样
mainList.addAll(tempList)
,然后更新这个方法是这样
ArrayList<CompanySearchResult> filtered = new ArrayList<CompanySearchResult>();
for (CompanySearchResult town : mainList) {
if (town.getTownName().equals(name)) {
filtered.add(town);
}
}
tempList.clear();
tempList.addAll(filtered);
listAdapter.notifyDataSetChanged();
您需要将原始的一组项目存储在适配器中作为备份列表。 适配器应始终只显示过滤列表的内容。
如果您将数据添加到适配器,请将它们添加到备份和过滤列表中。
当你点击一个按钮,清除过滤列表,然后只从备份列表中添加匹配项目到过滤列表。
public class SomeAdapter extends RecyclerView.Adapter<SomeAdapter.SomeViewHodler> {
static class SomeViewHodler extends RecyclerView.ViewHolder {
public SomeViewHodler(final View itemView) {
super(itemView);
}
void bind(String data) {
// FIll views here
}
}
private final List<String> displayedList = new ArrayList<>();
private final List<String> originalList = new ArrayList<>();
private String filterString = "";
@Override
public int getItemCount() {
return displayedList.size();
}
@Override
public void onBindViewHolder(final SomeViewHodler holder, final int position) {
holder.bind(displayedList.get(position));
}
@Override
public SomeViewHodler onCreateViewHolder(final ViewGroup parent, final int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.view, parent, false);
return new SomeViewHodler(view);
}
/**
* Call from outside to send data into this adapter
*/
public void replaceData(@NonNull final List<String> data) {
// Store new data in original list
originalList.clear();
originalList.addAll(data);
filter();
notifyDataSetChanged();
}
private void filter() {
// Clear display first
displayedList.clear();
// If filter is empty, show all items
if (filterString == null || filterString.isEmpty()) {
displayedList.addAll(originalList);
} else {
// if filter is not empty, check if item matches query
for (String obj : originalList) {
if (obj.contains(filterString)) {
displayedList.add(obj);
}
}
}
}
}
这听起来不错。但是,你不介意给我一些代码示例,我该如何实现这一点?请忍受我..新的android。 – devgeek
@devgeek更新了我的答案 –
@Traxdata答案是正确的。这里是我的代码解释
修改您的适配器像
public class YourAdapter extends RecyclerView.Adapter {
YourAdapter(List<CompanySearchResult> filterList){
}
}
在你Activity
YourAdapter listAdapter = new YourAdapter(filterList);
在第一次当您筛选显示列表
filterList = new ArrayList<>(tempList);
listAdapter.notifyDataSetChanged();
ArrayList <CompanySearchResult> filtered = new ArrayList <CompanySearchResult>();
for (CompanySearchResult town: tempList) {
if (town.getTownName().equals(name)) {
filtered.add(town);
}
}
filterList.clear();
filterList.addAll(filtered);
listAdapter.notifyDataSetChanged();
可以共享方法你实际创建/提取tempList? – kulvinder
我正在使用光标在tempList中添加项目。 – devgeek
还创建一个更多的列表他们完全相同像tempList例如mainList,并把tempList到该mainList.addAll(tempList),然后使用它..(CompanySearchResult镇:mainList) – kulvinder