【问题标题】:Context for ArrayAdapter in Fragment ClassFragment 类中 ArrayAdapter 的上下文
【发布时间】:2022-01-19 22:37:38
【问题描述】:

我正在尝试在 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() 方法,我正在尝试为我的数组列表初始化适配器,但我不确定如何修复它。它不接受“这个”。我也尝试了“getContext”但没有成功。错误消息是“无法解析构造函数”。 如果我使用“getActivity”作为上下文运行应用程序,它不会崩溃,但搜索栏也不存在。

【问题讨论】:

  • 不,不,不,适配器中的过滤是通过调用 adapter.getFilter().filter(constraint) 完成的,SO 和网络上也有数百个示例
  • 如果您想询问丢失的搜索栏,请询问该问题,而不是无关的错误

标签: android listview android-fragments


【解决方案1】:

它不接受“this”。

this 是一个FragmentFragment does not inherit from Context.

我也尝试了“getContext”,但没有成功。

Fragment does not have a getContext() method.

使用getActivity() 获取托管Activity 的实例。 Activity 继承自 Context

但搜索栏也不在那里。

这是一些单独的问题,例如您的布局。它与您传递给ArrayAdapter 构造函数的参数无关。

【讨论】:

    【解决方案2】:

    您应该使用 (View v = inflater.inflate(...)) 中的 v.getContext() 并将其作为 initList(Context context) 而不是 getActivity() 传递给您的 initList() 方法,这可能会导致两个问题:

    1) 你不能确定getActivity()onCreateView(..) 中不会为空,所以如果你想使用getActivity(),那么在onActivityCreated(..) 中设置你的数组适配器

    2) 如果您在片段中使用 setRetainInstance(true),它可能会导致内存泄漏,因为它无法在方向更改时垃圾收集活动实例

    【讨论】:

      【解决方案3】:
      override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
          val v : View = inflater.inflate(R.layout.fragment_panneau, container, false)
          val listItem = mutableListOf("Julien", "Gabriel","Henok","Audrey","Sandra","Hervé","Gargarine")
          val arrayAdapter: ArrayAdapter<*>
         arrayAdapter = ArrayAdapter(  v.getContext(),android.R.layout.simple_list_item_1 ,listItem)
          v.listView_panneau.adapter = arrayAdapter
      
          return v
      }
      

      【讨论】:

      • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
      猜你喜欢
      • 2014-11-13
      • 1970-01-01
      • 2016-06-21
      • 1970-01-01
      • 1970-01-01
      • 2017-03-31
      • 1970-01-01
      • 1970-01-01
      • 2014-09-25
      相关资源
      最近更新 更多