我正在尝试在Android的Fragment中为listView实现搜索栏。我让它在一个活动中工作,但现在我需要让它在片段中工作。这是我的代码:
public class AboFragment extends Fragment {
String [] items;
ArrayList<String> listItems;
ArrayAdapter<String> adapter;
ListView listView;
EditText editText;
public AboFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.fragment_abo, container, false);
listView=(ListView)v.findViewById(R.id.listview);
editText=(EditText)v.findViewById(R.id.textsearch);
initList();
editText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if(s.toString().equals("")){
initList();
}
else{
searchItem(s.toString());
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
Button dealerActivity = (Button) v.findViewById(R.id.button_dealer);
dealerActivity.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent startDealer = new Intent(getActivity(), DealerActivity.class);
startActivity(startDealer);
}
});
return v;
}
public void initList(){
items = new String[]{"Canada", "China", "Japan", "USA"};
listItems = new ArrayList<>(Arrays.asList(items));
adapter = new ArrayAdapter<String>(this, R.layout.list_item, R.id.textitem, listItems);
listView.setAdapter(adapter);
}
public void searchItem(String textToSearch){
for(String item:items){
if(!item.contains(textToSearch)){
listItems.remove(item);
}
}
adapter.notifyDataSetChanged();
}
}
问题在于initList()方法,我正在尝试为我的arraylist初始化适配器,但我不确定如何修复它。它不接受“这个”。我也试过“getContext”没有成功。错误消息是“无法解析构造函数”。 如果我使用“getActivity”作为上下文运行应用程序,它不会崩溃,但搜索栏也不存在。
答案 0 :(得分:4)
它不接受“这个”。
this
是Fragment
。 Fragment
does not inherit from Context
我也试过“getContext”但没有成功。
Fragment
does not have a getContext()
method
使用getActivity()
获取托管Activity
的实例。 Activity
继承自Context
。
但搜索栏也不存在。
这是一个单独的问题,例如您的布局。它与您传递给ArrayAdapter
构造函数的参数无关。
答案 1 :(得分:0)
您应该使用(v.getContext()
)中的View v = inflater.inflate(...)
并将其作为initList()
方法传递给initList(Context context)
,而不是getActivity()
,这可能会导致两个问题:< / p>
1)您无法确定getActivity()
中的onCreateView(..)
是否为空,因此如果您想使用getActivity()
,请设置阵列适配器在onActivityCreated(..)
2)如果在片段中使用setRetainInstance(true),它可能会导致内存泄漏,因为它无法在方向更改时垃圾收集活动实例