簡體   English   中英

從適配器訪問時EditText返回null

[英]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()關系,很難推薦一種方法。 這里有一些想法:

  • 在您的Activity中創建執行所需操作的回調
  • 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM