Search code examples
androidlistandroid-listviewtextwatcher

Android: help Text Watcher , List compare .logical error with afterTextChanged


facing problem in searching and displaying the list using text watcher. it is a simple search operation in the List. firstly the data is retrieved from the .txt line by line. first word of string is stored in the list content and now i want to perform search operation on this content list and display the result in listview

here is the code

enter code here

package com.android;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;

import android.app.ListActivity;
import android.os.Bundle;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.ListView;
import android.widget.TextView;

public class MyListDemoActivity extends ListActivity {
    /** Called when the activity is first created. */
    TextView tv;
    // final String[] values=new String[]{"android","Windows",
    // "ios","BlackBerry","Java",".Net","WebOS", "Ubuntu", "Windows7"};
    //String[] content;
    List<String> content ;

    AutoCompleteTextView actv;
    List<String> arr_sort;
    ArrayAdapter<String> adapter;
    ListView lv;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);


        String line = " ";
        LineNumberReader linenoreader = null;
        StringTokenizer stringtokanixer = null;
        content=new ArrayList<String>();
        lv=(ListView)findViewById(android.R.id.list);

        try {

            InputStream istream = getResources().openRawResource(R.raw.hihihi);
            InputStreamReader streamreader = new InputStreamReader(istream);

            linenoreader = new LineNumberReader(streamreader);
            linenoreader.mark(15);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }// try catch ends here



        Log.v("getting", "working");

        for (int i = 0; i < 6; i++) {
            try {
                line = linenoreader.readLine();
            } catch (IOException e) {

                e.printStackTrace();
            }
            Log.v("getting", line);
            stringtokanixer = new StringTokenizer(line);

            String st=stringtokanixer.nextToken();
            content.add(st);    
        }// for ends here

                    adapter=new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,content);
        //          setListAdapter(adapter);

                    lv.setAdapter(adapter);
                    tv= (TextView)findViewById(R.id.textView1);



                    actv=(AutoCompleteTextView)findViewById(R.id.autoCompleteTextView1);
                    actv.addTextChangedListener(new TextWatcher() {
                        int len=0;
                        @Override
                        public void onTextChanged(CharSequence s, int start, int before, int count) {
                            // TODO Auto-generated method stub

                        }

                        @Override
                        public void beforeTextChanged(CharSequence s, int start, int count,
                                int after) {
                            // TODO Auto-generated method stub

                        }

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

                            len=actv.getText().length();

                            for(int i=0;i<content.size();i++)
                            {
                                if(len<=content.get(i).length())
                                {
                                    if(actv.getText().toString().equalsIgnoreCase((String) content.get(i).subSequence(0, len)))
                                    {

                                        arr_sort.add(content.get(i));

                                    }


                                }

                            }

                            adapter=new ArrayAdapter<String>(MyListDemoActivity.this,android.R.layout.simple_list_item_1,arr_sort);
                            setListAdapter(adapter);
                        }
                    }); // text watcher class ends here



    }// on create ends here
    public void onListItemClick(ListView ls,View v, int position,long id) {
      tv.setText(content.get(position));

      //tv.setText(content[position]) // in case of string

    }// endsd here onListItemClick(
}

here is the main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <AutoCompleteTextView
        android:id="@+id/autoCompleteTextView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text=" " >

      </AutoCompleteTextView>


    <TextView
        android:id="@+id/textView1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="TextView" />

    <ListView
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:drawSelectorOnTop="false"
         >
    </ListView>

</LinearLayout>

here is txt file

joke happy 
hota happy okgame
ok happy okgame
asitis happy 
okgame happy 
oktested happy happy 

i guess there is logical error in afterTextChanged but cant figure it out.


Solution

  • solved

    im working on icecream sandwitch... it worked with this code...

    public void onTextChanged(CharSequence s, int start, int before,
                        int count) {
                        arr_sort = new ArrayList<String>();
    
                        len = actv.getText().length();
    
                        for (int i = 0; i < content.size(); i++) {
                            if (len <= content.get(i).length()) {
                                if (actv.getText()
                                        .toString()
                                        .trim()
                                        .equalsIgnoreCase(
                                                (String) content.get(i).subSequence(0,
                                                        len))) {
    
                                    arr_sort.add(content.get(i));
                                    Log.v("infor loop afterTextChanged", s.toString());
                                }
    
                            }
    
                        }
    
            //          adapter.notifyDataSetChanged();
    
                        adapter = new ArrayAdapter<String>(MyListDemoActivity.this,
                            android.R.layout.simple_list_item_1, arr_sort);
                        setListAdapter(adapter);
    
    
        }