2017-08-10 139 views
3

我有一個顯示公司列表的數組列表。這些公司中的每一個都有相應的城鎮名稱。此外,我爲每個城鎮名稱創建按鈕,以便當我點擊任何城鎮名稱時,應該過濾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,然後以類似的方式對其進行過濾。

我已經研究過這個,但是找不到任何相關的東西。我也曾嘗試在鏈接中提到的解決方案:

然而,這並沒有幫助。任何人都可以請幫助我如何實現這一目標?

+0

可以共享方法你實際創建/提取tempList? – kulvinder

+0

我正在使用光標在tempList中添加項目。 – devgeek

+1

還創建一個更多的列表他們完全相同像tempList例如mainList,並把tempList到該mainList.addAll(tempList),然後使用它..(CompanySearchResult鎮:mainList) – kulvinder

回答

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

}

+0

這聽起來不錯。但是,你不介意給我一些代碼示例,我該如何實現這一點?請忍受我..新的android。 – devgeek

+0

@devgeek更新了我的答案 –

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