[英]EditText is returning null when accessed from an adapter
我有一個適配器類,它在ListView
使用getFilter
函數。 我想對其進行修改,以便當搜索為空時,EditText文本顏色變為紅色。 我有以下代碼無法FC我的應用程序,但返回字符串為空,而不是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();
}
如何修改代碼以便獲得結果?
嘗試... myTextView.getEditable().toString()
,有時可以
我不認為涉及LayoutInflater
的代碼正在執行您認為正在做的事情。
inflater.inflate(R.layout.main, null)
不會讓您獲得R.layout.main
的現有實例; 而是使用main.xml中定義的XML布局來生成全新的View樹 。
假設您的主要Activity正在調用setContentView(R.layout.main)
,則調用inflater.inflate(R.layout.main, null)
將導致您在內存中具有該布局的兩個完全獨立的實例。 在其中一棵樹中對EditText的引用將與另一棵樹中的引用毫無關系。
放大第二個“視圖”樹后,您似乎對其不執行任何操作,因此它永遠不會顯示給用戶。 當您試圖從第二棵不可見的樹中獲取數據時,用戶仍在與您在“活動”中創建的布局進行交互。
如何修改代碼以便獲得結果?
有許多方法可以做到這一點,但是不知道publishResults()
與您的Activity publishResults()
關系,很難推薦一種方法。 這里有一些想法:
publishResults()
EditText的引用傳遞給具有publishResults()
方法的任何類 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();
}
};
}
注意:baseAdapters的目的是在列表視圖上設置數據。 因此,必須在聲明了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) {}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.