Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Java:用于滚动和过滤问题的listview自定义适配器_Java_Android_Android Listview - Fatal编程技术网

Android Java:用于滚动和过滤问题的listview自定义适配器

Android Java:用于滚动和过滤问题的listview自定义适配器,java,android,android-listview,Java,Android,Android Listview,我在网上搜索过,我需要一个自定义适配器来解决我的listview的滚动和过滤问题。我使用片段,因为我的主要活动上有一些选项卡 我曾尝试实现我发现的不同版本的代码,但我无法使其工作 公共类扩展片段{ 字符串filename=“symptoms.txt”; 私有静态最终字符串标记=“症状片段”; ReadFile rf=新的ReadFile(); 字符串[]行; ListView单纯形列表; 语境; 私人编辑文本过滤器文本; 专用阵列适配器阵列适配器; ArrayList listItems=新的A

我在网上搜索过,我需要一个自定义适配器来解决我的listview的滚动和过滤问题。我使用片段,因为我的主要活动上有一些选项卡

我曾尝试实现我发现的不同版本的代码,但我无法使其工作

公共类扩展片段{
字符串filename=“symptoms.txt”;
私有静态最终字符串标记=“症状片段”;
ReadFile rf=新的ReadFile();
字符串[]行;
ListView单纯形列表;
语境;
私人编辑文本过滤器文本;
专用阵列适配器阵列适配器;
ArrayList listItems=新的ArrayList();
整数计数=0;
@可空
@凌驾
创建视图时的公共视图(LayoutFlater充气机、@Nullable ViewGroup容器、@Nullable Bundle savedInstanceState){
最终视图mView=充气机。充气(右布局。症状\u布局,容器,错误);
simpleList=(ListView)mView.findViewById(R.id.list);
filterText=(EditText)mView.findViewById(R.id.EditText);
试一试{
lines=rf.readLines(文件名,getContext());
arrayAdapter=新的arrayAdapter(getActivity(),android.R.layout.simple\u list\u item\u 1,行);
simpleList.setAdapter(arrayAdapter);
}
捕获(IOE异常){
//打印出发生的异常
Toast.makeText(getContext(),“无法创建”+filename+:“+e.getMessage(),Toast.LENGTH_LONG).show();
}
filterText.addTextChangedListener(新的TextWatcher(){
@凌驾
public void beforeTextChanged(字符序列s、int start、int count、int after){}
@凌驾
public void onTextChanged(字符序列、int start、int before、int count){
arrayAdapter.getFilter().filter;
}
@凌驾
公共无效后文本更改(可编辑的s){}
});
setCacheColorHint(Color.TRANSPARENT);
simpleList.setChoiceMode(ListView.CHOICE\u MODE\u MULTIPLE);
simpleList.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
TextView tv=(TextView)view.findViewById(android.R.id.text1);
字符串selectedSymptom=tv.getText().toString();
如果(!listItems.contains(selectedSymptom)){
电视.彩色(彩色.白色);
tv.setBackgroundColor(Color.CYAN);
listItems.add(selectedSymptom);
}否则{
tv.setTextColor(Color.BLACK);
tv.setBackgroundColor(彩色透明);
listItems.remove(selectedSymptom);
}
System.out.println(列表项);
}
});
返回mView;
}
}

我正在读取一个文本文件,并将每一行保存到arraylist元素中,我正在将ArrayAdapter用于我的listview。我正在更改所选项目的背景和文本颜色。但是,当我使用“EditText”在listview上搜索时,或者当我滚动突出显示的元素时,这些元素会被洗牌(仅在视觉上)。我在网上为那些在listview中的复选框遇到同样问题的人找到了许多解决方案,但我真的很难实现这些解决方案。在这种情况下,自定义Listview适配器应该是什么样子?提前谢谢

错误来自
lines=rf.readLines(文件名,getContext())
您无法在主线程上读取文件,因为应用程序将是ANR

ANR(应用程序无响应)是应用程序被冻结且不响应任何用户手势或绘图的状态。与设计决策导致的无响应手势(例如,错误地看起来像可点击按钮的图像)不同,ANR通常是由于长时间运行的代码冻结了“UI线程”而发生的


您可以使用在后台创建一个新线程的类来读取文件,然后您可以将结果绑定到UI。

考虑使用RecyclerView,它将如下所示:

适配器声明:

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ViewHolder> implements Filterable {

    private List<IssuePOJO> myList;     // search results
    private List<IssuePOJO> myListFull; // all items

}
菜单:


您不必添加
图标
,但您可以自定义它以适合您的应用程序。

尝试更改:

arrayAdapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, lines);
arrayAdapter=newarrayadapter(getActivity(),android.R.layout.simple\u list\u item\u 1,行);
致:

arrayAdapter=new arrayAdapter(getActivity(),android.R.layout.simple\u list\u item\u 1,行){
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
TextView tv1=(TextView)super.getView(位置、转换视图、父级);
字符串selectedSymptom=getItem(位置);
if(listItems.contains(selectedSymptom)){
tv1.setTextColor(Color.WHITE);
tv1.setBackgroundColor(Color.CYAN);
}否则{
tv1.setTextColor(Color.BLACK);
tv1.setBackgroundColor(颜色.透明);
}
返回tv1;
}
};

希望有帮助

这是如何在listview上创建突出显示项的视觉背景滚动问题的?是的,但我没有菜单您不需要为此创建整个菜单,它将只是一个搜索图标,插入菜单,当您单击它时,它将显示您的字段,您可以在其中键入搜索文本。检查我对
菜单的回答
XML
,但这不是问题所在,正如您所看到的,我已经对搜索字段和listview的元素进行了所有设置,问题是当我选择一个项目并滚动或搜索时,所选内容被问题覆盖,我从未要求菜单,
@Override
    public Filter getFilter() {
        return listFilter;
    }

    private Filter listFilter = new Filter() {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            List<String> filteredList = new ArrayList<>();
            if (constraint == null || constraint.length() == 0) {  // checking if filter field is empty
                filteredList.addAll(myListFull);  
            } else {
                String filterPattern = constraint.toString().toLowerCase().trim(); 
                for (String item : myListFull) {
                    if (item.toLowerCase().contains(filterPattern)) {
                        filteredList.add(item);
                    }
                }
            }
            FilterResults results = new FilterResults();
            results.values = filteredList;

            return results;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            myList.clear();
            myList.addAll((List) results.values); // only this list is pressented to users inside RecyclerView, myListFull 
            notifyDataSetChanged();
        }
    };
@Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        menu.clear();
        inflater.inflate(R.menu.menu_main, menu);
        MenuItem searchItem = menu.findItem(R.id.action_search);
        SearchView searchView = (SearchView) searchItem.getActionView();

        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                recyclerAdapter.getFilter().filter(newText);
                return false;
            }
        });
        //super.onCreateOptionsMenu(menu, inflater);
    }
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context="com.example.damianadamski.service.MainActivity">
    <item
        android:id="@+id/action_search"
        android:icon="@drawable/ico_search"
        android:title=""
        android:tooltipText="Search..."
        app:showAsAction="ifRoom|collapseActionView"
        app:actionViewClass="android.support.v7.widget.SearchView"/>

</menu>
arrayAdapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, lines);
        arrayAdapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, lines){
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                TextView tv1 = (TextView)super.getView(position, convertView, parent);
                String selectedSymptom = getItem(position);
                if(listItems.contains(selectedSymptom)) {
                    tv1.setTextColor(Color.WHITE);
                    tv1.setBackgroundColor(Color.CYAN);
                }else{
                    tv1.setTextColor(Color.BLACK);
                    tv1.setBackgroundColor(Color.TRANSPARENT);
                }
                return tv1;
            }
        };