我有一个适配器类,它使用getFilter
中的ListView
函数。我想修改它,以便当搜索为空时,EditText文本颜色变为红色。我有以下代码,它不是我的应用程序,但返回字符串是空白而不是EditText
我的部分适配器类:
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
data = (ArrayList<SetRows>)results.values;
if (data.isEmpty()) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View myView = inflater.inflate(R.layout.main, null);
EditText myTextView = (EditText) myView.findViewById(R.id.etSearch);
myTextView.setTextColor(Color.RED);
Toast.makeText(getContext(), myTextView.getText().toString(), 2000).show();
}
notifyDataSetChanged();
clear();
for(int i = 0, l = data.size(); i < l; i++)
add(data.get(i));
notifyDataSetInvalidated();
}
如何修改代码以便我可以实现结果?
答案 0 :(得分:1)
尝试... myTextView.getEditable().toString()
,有时可行
答案 1 :(得分:1)
我不认为涉及LayoutInflater
的代码正在按照您的想法行事。
inflater.inflate(R.layout.main, null)
不会为您提供R.layout.main
的现有实例;而是使用main.xml中定义的XML布局来生成全新的View树。
假设您的主要活动正在调用setContentView(R.layout.main)
,调用inflater.inflate(R.layout.main, null)
将导致您在内存中有两个完全独立的布局实例。对其中一个树中的EditText的引用绝不会与另一个树中的引用相关。
一旦你给第二个View树充气,你似乎什么也没做,所以它永远不会显示给用户。当您尝试从第二个不可见树中获取数据时,用户仍在与您在“活动”中创建的布局进行交互。
如何修改代码以便我可以实现结果?
有很多方法可以做到这一点,但不知道publishResults()
与您的活动的关系,很难推荐一个。以下是一些想法:
publishResults()
方法答案 2 :(得分:1)
public class YourActivity extends Activity
{
private EditText editText = null;
// etc.
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);
editText = (EditText) findViewById(R.id.my_edit_text);
// etc.
}
private Filter listFilter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint)
{
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results)
{
ArrayList<SetRows> data = (ArrayList<SetRows>) results.values;
if (data.isEmpty()) YourActivity.this.editText.setTextColor(Color.RED);
Toast.makeText(getContext(), myTextView.getText().toString(), 2000).show();
}
};
}
答案 3 :(得分:1)
注意:baseAdapters的目的是在listview上设置数据。因此必须在已声明EditText的类上进行检查。
利用TextWatcher接口检查EditText的更新值,
public class SearchActivity extends Activity implements TextWatcher{
private EditText searchField;
private SearchActivity activity;
private ListView listView;
private String [] matches;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.yourLayout);
activity = this;
searchField = (EditText)findViewById(R.id.searchField);
searchField.addTextChangedListener(this);
listView = (ListView)findViewById(R.id.list);
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position,
long arg3) {
//your action
}
});
}
@Override
public void afterTextChanged(final Editable searchField) {
listView.setAdapter(null);
//check for matches here and store it to newly created array of Strings
if(searchField.length()>0 && matches.length > 0){ //added another condition here
listView.setAdapter(new YourAdapter());
}else{
this.searchField.setTextColor(Color.RED); // <--changes HERE
}
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {}
@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {}
}