如何清除项目中的项目:Android

时间:2017-08-10 06:46:50

标签: android arraylist filter

我有一个显示公司列表的数组列表。这些公司中的每一家都有相应的城镇名称。此外,我正在为每个城镇名称创建按钮,这样当我点击任何城镇名称时,应该过滤ArrayList,并且只显示具有该城镇名称的公司。

按钮就像,

    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,然后以类似的方式将其过滤掉。

我已对此进行过研究,但无法找到相关内容。我也尝试过链接中提到的解决方案:

然而,它并没有帮助。任何人都可以请求帮助我如何实现这一目标?

3 个答案:

答案 0 :(得分:2)

您需要将适配器中的原始项目集存储为备份列表。 适配器应始终只显示已过滤列表的内容。

如果您向适配器添加数据,请将它们添加到备份和筛选列表中。

点击按钮后,清除已过滤列表,然后仅将备份列表中的匹配项添加到已过滤列表

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

}

答案 1 :(得分:2)

@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();

答案 2 :(得分:1)

再创建一个列表(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();