Android : Listview filter the data contained in database very slowly

on Monday, August 18, 2014


I'm Working an English to Persian Dictionary ... Unfortunately, I could not using Lazzy Listview sample In my project , my project initially had a list and filter out about 50 thousand words from database , so slow typing and updating the list is occured , please Help me to use Lazzy Listview In my project and use a optimized filter to reduce the use of memory and increase speed .... Tnx


this is my classes :


MainActivity



public class MainActivity extends Activity {

ListView list;
ImageView clearText;
EditText editsearch;
Typeface edtSearchFont;
static String[] word;
static int[] index;
static ListViewAdapter adapter;
static ArrayList<ListViewStruct> arrayStructList = new ArrayList<ListViewStruct>();
Context context;


// onCreate

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.listview_main);
context = this;

Cursor en = G.database.rawQuery("SELECT * FROM English", null);
word = new String[en.getCount()];
index = new int[en.getCount()];
int i = 0;
ListViewStruct wp = null;
if (en.moveToFirst())
{
do
{
try {
word[i] = en.getString(en.getColumnIndex("English_Word"));
index[i] = en.getInt(en.getColumnIndex("Word_ID"));
wp = new ListViewStruct(word[i], index[i]);
arrayStructList.add(wp);
i++;

}
catch (Exception e) {

e.printStackTrace();
}
}
while (en.moveToNext());
}
en.close();

list = (ListView) findViewById(R.id.listview);
adapter = new ListViewAdapter(this, arrayStructList);
list.setAdapter(adapter);
editsearch = (EditText) findViewById(R.id.search);
edtSearchFont = Typeface.createFromAsset(context.getAssets(), "fonts/listFont.ttf");
editsearch.setTypeface(edtSearchFont);
editsearch.addTextChangedListener(new TextWatcher() {

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

}


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


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

String text = editsearch.getText().toString().toLowerCase(Locale.getDefault());
adapter.filter(text);
}
});

clearText = (ImageView) findViewById(R.id.clearTextImage);

clearText.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {

editsearch.setText("");

}
});

}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
//getMenuInflater().inflate(R.menu.activity_main, menu);
menu.add(0, 1, 1, "About");
menu.add(0, 2, 2, "Exit");

return true;

}


//@SuppressWarnings("deprecation")
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// TODO Auto-generated method stub

switch (item.getItemId()) {

case 1: {

AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
builder.setTitle("About")
.setMessage("\n" + "© Copyright" + "\n" + "Hossein Tahmasebi , 2014" + "\n")
.setCancelable(false)
.setIcon(R.drawable.logo)
.setNegativeButton("Ok", new DialogInterface.OnClickListener() {

@Override
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
AlertDialog alert = builder.create();
alert.show();

break;

}
case 2: {

this.finish();

}

}

return super.onOptionsItemSelected(item);
};


}


ListViewAdapter



public class ListViewAdapter extends BaseAdapter {

// Declare Variables
Context mContext;
LayoutInflater inflater;
private List<ListViewStruct> localWordsList;
private ArrayList<ListViewStruct> arraystructlist;
public int index;
Typeface listFont;


public ListViewAdapter(Context context, List<ListViewStruct> mainWordList) {
mContext = context;
this.localWordsList = mainWordList;
inflater = LayoutInflater.from(mContext);
this.arraystructlist = new ArrayList<ListViewStruct>();
this.arraystructlist.addAll(mainWordList);

}


public class ViewHolder {

TextView word;

}


@Override
public int getCount() {
return localWordsList.size();
}


@Override
public ListViewStruct getItem(int position) {
return localWordsList.get(position);
}


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


@Override
public View getView(final int position, View view, ViewGroup parent) {

final ViewHolder holder;

listFont = Typeface.createFromAsset(mContext.getAssets(), "fonts/listFont.ttf");

if (view == null) {
holder = new ViewHolder();
view = inflater.inflate(R.layout.listview_item, null);
holder.word = (TextView) view.findViewById(R.id.word);
view.setTag(holder);
} else {
holder = (ViewHolder) view.getTag();
}

holder.word.setText(localWordsList.get(position).getWord());
holder.word.setTypeface(listFont);

view.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
Intent intent = new Intent(mContext, enTranslatedResultActivity.class);
intent.putExtra("index", (localWordsList.get(position).getIndex()));
intent.putExtra("word", (localWordsList.get(position).getWord()));
mContext.startActivity(intent);
}
});

return view;
}


// Filter Class
public void filter(String charText) {
charText = charText.toLowerCase(Locale.getDefault());
localWordsList.clear();
if (charText.length() == 0) {
localWordsList.addAll(arraystructlist);
}
else
{
for (ListViewStruct wp: arraystructlist)
{
if (wp.getWord().toLowerCase(Locale.getDefault()).startsWith(charText))
{
localWordsList.add(wp);
}
}
}
notifyDataSetChanged();

}


}


ListViewStruct



public class ListViewStruct {
private int index;
private String word;
private String translatedWord;


public ListViewStruct(String word, int index) {

this.word = word;
this.index = index;

}


public int getIndex() {
return this.index;
}


public String getWord() {
return this.word;
}


public String getPopulation() {
return this.translatedWord;
}
}


G class , HelperIO And enTranslatedResultActivity for show translated result word.....


If these classes are required to be here , tell me to put them ,


Thank you for your attention.....


0 comments:

Post a Comment