사용자 지정 (개체) 어댑터로 ListView 필터링
사용자 지정 개체 어댑터를 사용하는 ListView의 필터링을 구현하려고하는데 유용한 샘플을 찾을 수 없습니다. 포함 된 코드는 매우 단순하므로 일반 ArrayAdapter를 사용할 수 없다는 점에 유의하십시오. ListView 위에 EditText가 있고 사용자가 EditText 위젯에 텍스트를 입력하면 EditText에 작성된 텍스트로 ListView를 필터링하고 싶습니다. 어떤 제안이라도 대단히 감사하겠습니다!
다음은 활동 클래스의 스 니펫입니다.
public class management_objects extends Activity {
private static List<User> UserList;
private EfficientAdapter adapter = null;
private ListView objectListView = null;
private EditText SearchText = null;
private static class EfficientAdapter extends BaseAdapter implements Filterable{
private LayoutInflater mInflater;
public EfficientAdapter(Context context) {
mInflater = LayoutInflater.from(context);
}
public int getCount() {
return UserList.size();
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.imagelayout_2lines, null);
holder = new ViewHolder();
holder.text = (TextView) convertView.findViewById(R.id.managementObjectText);
holder.subtext = (TextView) convertView.findViewById(R.id.managementObjectSubText);
holder.icon = (ImageView) convertView.findViewById(R.id.managementObjectIcon);
convertView.setTag(holder);
}
else {
holder = (ViewHolder) convertView.getTag();
}
holder.text.setText(UserList.get(position).getFirstName());
holder.subtext.setText(UserList.get(position).getLastName());
holder.icon.setImageResource(R.drawable.user);
return convertView;
}
static class ViewHolder {
TextView text;
TextView subtext;
ImageView icon;
}
@Override
public Filter getFilter() {
return null;
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.adobjectlist);
Bundle extras = getIntent().getExtras();
SearchText = (EditText) findViewById(R.id.SearchBox);
SearchText.addTextChangedListener(filterTextWatcher);
objectListView = (ListView) findViewById(R.id.ObjectList);
objectListView.setOnItemClickListener(Item_Click);
adapter = new EfficientAdapter(this);
ComputerName = extras.getString("COMPUTER_NAME");
//Get User list from webservice
ShowUsers();
}
다음은 사용자 클래스입니다.
public class User {
private int UserId;
private String FirstName;
private String LastName;
public int getUserId() {
return UserId;
}
public void setUserId(int UserId) {
this.UserId = UserId;
}
public String getFirstName() {
return FirstName;
}
public void setFirstName(String FirstName) {
this.FirstName = FirstName;
}
public String getLastName() {
return LastName;
}
public void setLastName(String LastName) {
this.LastName = LastName;
}
}
몇 가지를 수행해야합니다.
1) 활동에서 사용자가 입력 한 값을 포함하는 EditText의 텍스트 변경 리스너를 등록하십시오.
mSearchValue.addTextChangedListener (searchTextWatcher);
2) searchTextWatcher를 만들고 무언가를하게하십시오 :
private TextWatcher searchTextWatcher = new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
// ignore
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
// ignore
}
@Override
public void afterTextChanged(Editable s) {
Log.d(Constants.TAG, "*** Search value changed: " + s.toString());
adapter.getFilter().filter(s.toString());
}
};
3) 사용자 정의 어댑터에서 getFilter ()를 재정의하고 결과를 필터링하고 데이터 세트가 변경되었음을 listview에 알립니다.
@Override
public Filter getFilter() {
return new Filter() {
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
Log.d(Constants.TAG, "**** PUBLISHING RESULTS for: " + constraint);
myData = (List<MyDataType>) results.values;
MyCustomAdapter.this.notifyDataSetChanged();
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
Log.d(Constants.TAG, "**** PERFORM FILTERING for: " + constraint);
List<MyDataType> filteredResults = getFilteredResults(constraint);
FilterResults results = new FilterResults();
results.values = filteredResults;
return results;
}
};
}
여기 흥미로운 예
public Filter getFilter() {
return new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
final FilterResults oReturn = new FilterResults();
final ArrayList<station> results = new ArrayList<station>();
if (orig == null)
orig = items;
if (constraint != null) {
if (orig != null && orig.size() > 0) {
for (final station g : orig) {
if (g.getName().toLowerCase()
.contains(constraint.toString()))
results.add(g);
}
}
oReturn.values = results;
}
return oReturn;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
items = (ArrayList<station>) results.values;
notifyDataSetChanged();
}
};
}
public void notifyDataSetChanged() {
super.notifyDataSetChanged();
notifyChanged = true;
}
Filterable
인터페이스 가 필요하지 않은 사람들을 위해 훨씬 더 간단한 솔루션이 있습니다. 이것은 또한 notifyDataSetChanged()
다른 솔루션이 실패하는 경우 올바르게 처리 합니다. 생성자에 전달 된 배열 객체를 반환 하는 getArray()
함수를 에 추가해야합니다 BaseAdapter
.
public abstract class BaseFilterAdapter<T> extends BaseAdapter<T> {
private List<T> original;
private String lastFilter;
public BaseFilterAdapter(Context context, List<T> array) {
super(context, new LinkedList<T>());
original = array;
filter("");
}
protected abstract Boolean predicate(T element, String filter);
public void filter(String filter) {
lastFilter = filter;
super.getArray().clear();
for (T element : original)
if (predicate(element, filter))
super.getArray().add(element);
super.notifyDataSetChanged();
}
@Override
public List<T> getArray() {
return original;
}
@Override
public void notifyDataSetChanged() {
filter(lastFilter);
}
}
기본 클래스에 toString 재정의를 추가하십시오. 예를 들면
@Override
public String toString() {
return this.name;
}
위는 목록을 문자열 목록으로 만듭니다. 따라서 다음을 사용할 수 있습니다.
your_edit_text.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
YourActivity.this.YourAdapter.getFilter().filter(arg0);
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
}
@Override
public void afterTextChanged(Editable arg0) {
}
});
참고 URL : https://stackoverflow.com/questions/5780289/filtering-listview-with-custom-object-adapter
'developer tip' 카테고리의 다른 글
ASP.NET MVC WebAPI 404 오류 (0) | 2020.11.29 |
---|---|
컬 오류 18-미해결 읽기 데이터가 남아있는 상태로 전송이 종료 됨 (0) | 2020.11.28 |
iOS 용 Unity3d 플러그인 빌드 방법 (0) | 2020.11.28 |
node.js에서 비밀번호를 변경하고 로그 아웃하는 동안 JWT를 무효화하는 모범 사례? (0) | 2020.11.28 |
명령 줄에 Maven 리포지토리를 추가 할 수 있습니까? (0) | 2020.11.28 |