2017-08-10 3 views
3

私は会社のリストを表示する配列リストを持っています。これらの企業のそれぞれは、対応する町名を持っています。さらに、街の名前のいずれかをクリックすると、ArrayListをフィルタリングし、その町の名前を持つ会社だけを表示するように、町の名前ごとにボタンを作成しています。一度クリアされると、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<CompanySearchResult> filtered = new ArrayList<CompanySearchResult>(); 
      for (CompanySearchResult town : tempList) { 

       if (town.getTownName().equals(name)) { 
        filtered.add(town); 
       } 
      } 

      tempList.clear(); 
      tempList.addAll(filtered); 
      listAdapter.notifyDataSetChanged(); 
、としてフィルタリングされたデータを格納するための新しいのArrayListを作成しています3210

データは適切にフィルタリングされていますが、私の問題は初めてデータをフィルタリングするときです。tempList(データを含むメインArrayList)がフィルタリングされたArrayListの内容によって更新されます。 次に、別の町の名前の2番目のボタンをクリックしてフィルターをかけようとすると、既にフィルタリングされたデータで更新されたtempListをフィルタリングしようとし、表示される結果は空白になります。

したがって、町の名前のボタンがクリックされるたびにtempListに元のデータを再設定し、同様の方法でそれをフィルタリングするにはどうすればよいですか。

私はこれについて調査しましたが、関連するものは見つかりませんでした。

はしかし、それは助けにはならなかった:私はまた、リンクに記載された解決策を試してみました。どのように私はこれを達成することができますに助けてください誰もできますか?

+0

のように、このメソッドを更新実際にtempListを作成/取得したメソッド? – kulvinder

+0

私はtempListの項目を追加するためにカーソルを使用しています。 – devgeek

+1

また、tempListのような正確なものをもう一つ作成してください。たとえば、mainListとtempListをそのmainList.addAll(tempList)に入れて、それを使ってください。(CompanySearchResult town:mainList) – kulvinder

答えて

1

あなたが共有することができますあなたがtempListを作成した1つの以上のリスト(eg.mainList)を作成し、この

mainList.addAll(tempList) 

のようなことに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

それは私に良い音。しかし、どうすればこれを正確に達成することができるか、いくつかのコード例を挙げてください。私と一緒に持ちこたえてください。アンドロイドに新しい。 – devgeek

+0

@devgeekが私の答えを更新しました –

2

@Traxdata答えが正しいです。ここに私が

は、あなたがフィルタすると、リスト

filterList = new ArrayList<>(tempList); 
listAdapter.notifyDataSetChanged(); 

を表示する最初の時点では、あなたのActivity

YourAdapter listAdapter = new YourAdapter(filterList);

public class YourAdapter extends RecyclerView.Adapter { 

    YourAdapter(List<CompanySearchResult> filterList){ 

    } 
} 

のようなあなたのアダプターを変更したコードで説明しています

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(); 
関連する問題