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