从适配器访问时,EditText返回null

时间:2013-12-16 20:12:56

标签: java android android-listview layout-inflater

我有一个适配器类,它使用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();
        }

如何修改代码以便我可以实现结果?

4 个答案:

答案 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()与您的活动的关系,很难推荐一个。以下是一些想法:

  • 在您的Activity中创建一个执行所需操作的回调
  • 将对EditText的引用传递给具有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) {}
}