绕过过滤功能,不更新的ListView的Andr​​oid的bug [英] Bypassing the bug in filtering that does not update ListView Android

查看:306
本文介绍了绕过过滤功能,不更新的ListView的Andr​​oid的bug的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

下面是code,我用了一个自定义适配器,并应用了过滤器的方法,现在当退格键输入,当一个切换从项目活动重新站上的ListView不更新。我读了它在过滤器中的错误,但我怎么绕过它,我知道,已经实现了这种设置我想要的应用程序。

 公共类IndexPageActivity扩展活动实现OnItemClickListener {
    ListView控件的ListView;
    的EditText editTextB;
    PagesAdapter适配器1;    @覆盖
    保护无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);        的setContentView(R.layout.activity_main);
        ListView控件=(ListView控件)findViewById(R.id.pageList);
        editTextB =(EditText上)findViewById(R.id.searchB);
        适配器1 =新PagesAdapter(本);
        listView.setAdapter(适配器1);
        adapter1.notifyDataSetChanged();
        listView.setOnItemClickListener(本);        editTextB.addTextChangedListener(新TextWatcher(){
            @覆盖
            公共无效onTextChanged(CharSequence的CS,INT ARG1,ARG2 INT,INT ARG3){
                。IndexPageActivity.this.adapter1.getFilter()过滤(cs.toString());
                adapter1.notifyDataSetChanged();
            }            @覆盖
            公共无效beforeTextChanged(CharSequence的为arg0,ARG1 INT,
                        INT ARG2,诠释ARG3){}            @覆盖
            公共无效afterTextChanged(编辑为arg0){}
        });
    }    @覆盖
    公共无效onItemClick(适配器视图<>为arg0,视图V,INT位置,长ARG3){
        我的意图;
        字符串名称= adapter1.getItem(位置);
        Log.d(ID,名);        如果(name.equals(项目1))
        {
            I =新意图(这一点,anActivity.class);
            startActivity(ⅰ);
        }
        否则如果(name.equals(项目2))
        {
            I =新意图(这一点,anActivity2.class);
            startActivity(ⅰ);
        }
    }
}类SingleRow {
    串pagedata;
    SingleRow(字符串pagedata){
        this.pagedata = pagedata;
    }
}
类PagesAdapter扩展了BaseAdapter实现过滤的{
    ArrayList的<串GT;分页;
    清单<串GT; ArrayList的;
    上下文语境;
    的String [] pagedatas;    PagesAdapter(上下文C){
        上下文= C;
        分页=新的ArrayList<串GT;();
        资源解析度= c.getResources();
        pagedatas = res.getStringArray(R.array.pages_data);
        的for(int i = 0; I< 463;我++){
            pagelist.add(pagedatas [I]);
        }
    }
    @覆盖
    公众诠释的getCount(){
        返回pagelist.size();
    }    @覆盖
    公共字符串的getItem(int i)以{
        返回pagelist.get(ⅰ);
    }    @覆盖
    众长getItemId(int i)以{
        返回我;
    }    @覆盖
    公共查看getView(INT I,查看视图的ViewGroup以及viewG){
        LayoutInflater吹气=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        查看排= inflater.inflate(R.layout.single_row,viewG,FALSE);
        TextView的PAGETITLE =(TextView中)row.findViewById(R.id.textViewRow);        字符串TEMP = pagelist.get(I)        pagetitle.setText(临时);
        返回行;
    }    公共类filter_here扩展过滤器{
        @覆盖
        保护FilterResults performFiltering(CharSequence的约束){
            FilterResults结果=新FilterResults();
            //如果约束为空,返回原来的名称
            如果(constraint.length()== 0){
                Result.values​​ =分页;
                Result.count = pagelist.size();
                返回结果;
            }            ArrayList的<串GT; Filtered_Names =新的ArrayList<串GT;();
            字符串filterString = constraint.toString()与toLowerCase()。
            串filterableString;            的for(int i = 0; I< pagelist.size();我++){
                filterableString = pagelist.get(ⅰ);
                如果(filterableString.toLowerCase()。包括(filterString)){
                    Filtered_Names.add(filterableString);
                }
            }
            Result.values​​ = Filtered_Names;
            Result.count = Filtered_Names.size();            返回结果;
        }        @覆盖
        保护无效publishResults(CharSequence的约束,FilterResults结果){
            分页=(ArrayList的<串GT;)results.values​​;
            notifyDataSetChanged();
        }
    }    @覆盖
    公共过滤用getFilter(){
        返回新filter_here();
    }
}


解决方案

终于找到了退格的错误,你必须在过滤功能的一些错误,我返回一个ArrayList,而不是保存在变量$名单C $ C必须最终code是:

 公共类IndexPageActivity扩展活动实现OnItemClickListener {
ListView控件的ListView;
的EditText editTextB;
PagesAdapter适配器1;@覆盖
保护无效的onCreate(捆绑savedInstanceState){
    // TODO自动生成方法存根
    super.onCreate(savedInstanceState);
     的setContentView(R.layout.activity_main);
        ListView控件=(ListView控件)findViewById(R.id.pageList);
        editTextB =(EditText上)findViewById(R.id.searchB);
        适配器1 =新PagesAdapter(本);
        listView.setAdapter(适配器1);
        adapter1.notifyDataSetChanged();
        listView.setOnItemClickListener(本);        editTextB.addTextChangedListener(新TextWatcher(){            @覆盖
            公共无效onTextChanged(CharSequence的CS,INT ARG1,ARG2 INT,
                    INT ARG3){
                //当用户更改文本
                。IndexPageActivity.this.adapter1.getFilter()过滤(cs.toString());
                adapter1.notifyDataSetChanged();
            }            @覆盖
            公共无效beforeTextChanged(CharSequence的为arg0,ARG1 INT,
                    INT ARG2,诠释ARG3){
                // TODO自动生成方法存根            }            @覆盖
            公共无效afterTextChanged(编辑为arg0){
                // TODO自动生成方法存根
            }
        });
}
@覆盖
公共无效onItemClick(适配器视图<>为arg0,视图V,INT位置,长ARG3){
// TODO自动生成方法存根
我的意图;
字符串名称= adapter1.getItem(位置);
        Log.d(ID,名);
如果(name.equals(项目1))
{
    I =新意图(这一点,anActivity.class);
    startActivity(ⅰ);
}
否则如果(name.equals(项目2))
{
    I =新意图(这一点,anActivity2.class);
    startActivity(ⅰ);
}
}
}
类SingleRow {
串pagedata;
SingleRow(字符串pagedata){
    this.pagedata = pagedata;
}
}
类PagesAdapter扩展了BaseAdapter实现过滤的{
ArrayList的<串GT;分页;
清单<串GT; ArrayList的;
上下文语境;
的String [] pagedatas;PagesAdapter(上下文C){
上下文= C;
分页=新的ArrayList<串GT;();
资源解析度= c.getResources();
pagedatas = res.getStringArray(R.array.pages_data);的for(int i = 0; I< 463;我++){
    pagelist.add(pagedatas [I]);
}
ArrayList的=分页;
}
@覆盖
公众诠释的getCount(){
// TODO自动生成方法存根
返回arrayList.size();
}@覆盖
公共无效notifyDataSetChanged(){
super.notifyDataSetChanged();
}@覆盖
公共字符串的getItem(int i)以{
// TODO自动生成方法存根
返回arrayList.get(ⅰ);
}@覆盖
众长getItemId(int i)以{
// TODO自动生成方法存根
返回我;
}
@覆盖
公共查看getView(INT I,查看视图的ViewGroup以及viewG){
// TODO自动生成方法存根
LayoutInflater吹气=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
查看排= inflater.inflate(R.layout.single_row,viewG,FALSE);
TextView的PAGETITLE =(TextView中)row.findViewById(R.id.textViewRow);字符串TEMP = arrayList.get(I)pagetitle.setText(临时);
返回行;
}@覆盖
公共过滤用getFilter(){
// TODO自动生成方法存根
过滤器过滤器=新的过滤器(){
    @燮pressWarnings(未登记)
    @覆盖
    保护无效publishResults(CharSequence的约束,FilterResults结果){        ArrayList的=(列表<串GT;)results.values​​;
        notifyDataSetChanged();
    }    @覆盖
    保护FilterResults performFiltering(CharSequence的约束){     FilterResults结果=新FilterResults();
        ArrayList的<串GT; FilteredArrayNames =新的ArrayList<串GT;();        如果(分页== NULL){
            分页=新的ArrayList<串GT;(ArrayList的);
        }
        如果(约束== NULL || constraint.length()== 0){
            results.count = pagelist.size();
            results.values​​ =分页;
        }其他{
            约束= constraint.toString()与toLowerCase()。
            的for(int i = 0; I< pagelist.size();我++){
                串dataNames = pagelist.get(ⅰ);
                如果(dataNames.toLowerCase()。startsWith(constraint.toString())){
                    FilteredArrayNames.add(dataNames);
                }
            }            results.count = FilteredArrayNames.size();
            的System.out.println(results.count);            results.values​​ = FilteredArrayNames;
            Log.e(价值观,results.values​​.toString());
        }        返回结果;
}
};
返回过滤器;
}
}

Here is the code, I used a custom adapter, and applied the Filter method, now the ListView does not update when the backspace key is entered, on when one switches back from an item activity. I read it is a bug in filter, but how do I bypass it, I know of apps that have achieved this kind of setup I want.

public class IndexPageActivity extends Activity implements OnItemClickListener{ 
    ListView listView;
    EditText editTextB;
    PagesAdapter adapter1;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);
        listView = (ListView) findViewById(R.id.pageList);
        editTextB = (EditText) findViewById(R.id.searchB);
        adapter1 = new PagesAdapter(this);
        listView.setAdapter(adapter1);
        adapter1.notifyDataSetChanged();
        listView.setOnItemClickListener(this);

        editTextB.addTextChangedListener(new TextWatcher() {
            @Override
            public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
                IndexPageActivity.this.adapter1.getFilter().filter(cs.toString());
                adapter1.notifyDataSetChanged();
            }

            @Override
            public void beforeTextChanged(CharSequence arg0, int arg1,
                        int arg2, int arg3) { }

            @Override
            public void afterTextChanged(Editable arg0) { }
        });
    }

    @Override
    public void onItemClick(AdapterView<?> arg0, View v, int position, long arg3) {
        Intent i;
        String name = adapter1.getItem(position);
        Log.d("id", name);

        if (name.equals("Item1"))
        {
            i = new Intent(this, anActivity.class);
            startActivity(i);
        }
        else if (name.equals("Item2"))
        {
            i = new Intent(this, anActivity2.class);
            startActivity(i);
        }
    }
}

class SingleRow {
    String pagedata;
    SingleRow(String pagedata){
        this.pagedata=pagedata;
    }
}
class PagesAdapter extends BaseAdapter implements Filterable{
    ArrayList<String> pagelist;
    List<String> arrayList;
    Context context;
    String [] pagedatas;

    PagesAdapter(Context c){
        context=c;
        pagelist = new ArrayList<String>();
        Resources res = c.getResources();
        pagedatas = res.getStringArray(R.array.pages_data);
        for (int i=0;i<463;i++){
            pagelist.add(pagedatas[i]);
        }
    }
    @Override
    public int getCount() {
        return pagelist.size();
    }

    @Override
    public String getItem(int i) {
        return pagelist.get(i);
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    @Override
    public View getView(int i, View view, ViewGroup viewG) {
        LayoutInflater inflater=(LayoutInflater)             context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View row=inflater.inflate(R.layout.single_row,viewG,false);
        TextView pagetitle = (TextView) row.findViewById(R.id.textViewRow);

        String temp=pagelist.get(i);

        pagetitle.setText(temp);
        return row;
    }

    public class filter_here extends Filter{
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults Result = new FilterResults();
            // if constraint is empty return the original names
            if(constraint.length() == 0 ){
                Result.values = pagelist;
                Result.count = pagelist.size();
                return Result;
            }

            ArrayList<String> Filtered_Names = new ArrayList<String>();
            String filterString = constraint.toString().toLowerCase();
            String filterableString;

            for(int i = 0; i<pagelist.size(); i++){
                filterableString = pagelist.get(i);
                if(filterableString.toLowerCase().contains(filterString)){
                    Filtered_Names.add(filterableString);
                }
            }
            Result.values = Filtered_Names;
            Result.count = Filtered_Names.size();

            return Result;
        }

        @Override
        protected void publishResults(CharSequence constraint,FilterResults results) {
            pagelist = (ArrayList<String>) results.values;
            notifyDataSetChanged();
        }
    }

    @Override
    public Filter getFilter() {
        return new filter_here();
    }
}

解决方案

Finally found the bug of the backspace, you had some error in the filter function, that am returning an ArrayList, instead of the List that holds the variable the code should the final code is:

public class IndexPageActivity extends Activity implements OnItemClickListener{ 
ListView listView;
EditText editTextB;
PagesAdapter adapter1;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_main);
        listView = (ListView) findViewById(R.id.pageList);
        editTextB = (EditText) findViewById(R.id.searchB);
        adapter1 = new PagesAdapter(this);
        listView.setAdapter(adapter1);
        adapter1.notifyDataSetChanged();
        listView.setOnItemClickListener(this);

        editTextB.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence cs, int arg1, int arg2,
                    int arg3) {
                // When user changed the Text
                IndexPageActivity.this.adapter1.getFilter().filter(cs.toString());
                adapter1.notifyDataSetChanged();
            }

            @Override
            public void beforeTextChanged(CharSequence arg0, int arg1,
                    int arg2, int arg3) {
                // TODO Auto-generated method stub

            }

            @Override
            public void afterTextChanged(Editable arg0) {
                // TODO Auto-generated method stub
            }
        });
}


@Override
public void onItemClick(AdapterView<?> arg0, View v, int position, long arg3) {
// TODO Auto-generated method stub
Intent i;
String name = adapter1.getItem(position);
        Log.d("id", name);
if (name.equals("Item1"))
{
    i = new Intent(this, anActivity.class);
    startActivity(i);
}
else if (name.equals("Item2"))
{
    i = new Intent(this, anActivity2.class);
    startActivity(i);
}
}
}


class SingleRow {
String pagedata;
SingleRow(String pagedata){
    this.pagedata=pagedata;
}
}
class PagesAdapter extends BaseAdapter implements Filterable{
ArrayList<String> pagelist;
List<String> arrayList;
Context context;
String [] pagedatas;

PagesAdapter(Context c){
context=c;
pagelist = new ArrayList<String>();
Resources res = c.getResources();
pagedatas = res.getStringArray(R.array.pages_data);

for (int i=0;i<463;i++){
    pagelist.add(pagedatas[i]);
}
arrayList = pagelist;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return arrayList.size();
}

@Override
public void notifyDataSetChanged() {
super.notifyDataSetChanged();
}

@Override
public String getItem(int i) {
// TODO Auto-generated method stub
return arrayList.get(i);
}

@Override
public long getItemId(int i) {
// TODO Auto-generated method stub
return i;
}


@Override
public View getView(int i, View view, ViewGroup viewG) {
// TODO Auto-generated method stub
LayoutInflater inflater=(LayoutInflater)                 context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View row=inflater.inflate(R.layout.single_row,viewG,false);
TextView pagetitle = (TextView) row.findViewById(R.id.textViewRow);

String temp=arrayList.get(i);

pagetitle.setText(temp);
return row;
}

@Override
public Filter getFilter() {
// TODO Auto-generated method stub
Filter filter = new Filter() {
    @SuppressWarnings("unchecked")
    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {

        arrayList = (List<String>) results.values;
        notifyDataSetChanged();
    }

    @Override
    protected FilterResults performFiltering(CharSequence constraint) {

     FilterResults results = new FilterResults();
        ArrayList<String> FilteredArrayNames = new ArrayList<String>();

        if (pagelist == null)    {
            pagelist = new ArrayList<String>(arrayList);
        }
        if (constraint == null || constraint.length() == 0) {
            results.count = pagelist.size();
            results.values = pagelist;
        } else {
            constraint = constraint.toString().toLowerCase();
            for (int i = 0; i < pagelist.size(); i++) {
                String dataNames = pagelist.get(i);
                if (dataNames.toLowerCase().startsWith(constraint.toString()))  {
                    FilteredArrayNames.add(dataNames);
                }
            }

            results.count = FilteredArrayNames.size();
            System.out.println(results.count);

            results.values = FilteredArrayNames;
            Log.e("VALUES", results.values.toString());
        }

        return results;
}
};
return filter;
}
}

这篇关于绕过过滤功能,不更新的ListView的Andr​​oid的bug的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆