【问题标题】:Listview filter the data contained in database very slowlyListview过滤数据库中包含的数据非常慢
【发布时间】:2014-10-11 01:10:00
【问题描述】:

我正在使用英语到波斯语词典... 不幸的是,我无法在我的项目中使用 Lazzy Listview 示例, 我的项目最初有一个列表,filter 从数据库中提取了大约 50000 个单词,因此出现输入和更新列表缓慢的情况,请帮助我在我的项目中使用 Lazzy Listview 并使用优化的过滤器来减少内存的使用并提高速度.... 天呐

这是我的课:

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 , HelperIOenTranslatedResultActivity 用于显示翻译结果字.....

如果这些课程需要在这里,告诉我把它们,

感谢您的关注.....

【问题讨论】:

  • 使用 SimpleCursorAdapter,因为您的数据来自 sqlite 数据库
  • 请按你说的编辑我的代码,我是初学者
  • 你尝试过使用光标适配器吗?对于这种类型的列表,它比其他人快得多
  • @MHP 请编辑我的代码并告诉我如何在此处使用光标适配器

标签: android database listview dictionary filter


【解决方案1】:

这是 cursorAdapter 的示例(使用它而不是 baseAdapter)您需要将光标传递给它,并且不需要在 while 循环中将光标放在 arraylist 中

public class ImageCursorAdapter extends CursorAdapter {
public ImageCursorAdapter(Context context, Cursor c) {
    super(context, c);
}

@Override
public void bindView(View view, Context context, Cursor cursor) {
    TextView word = (TextView) view.findViewById(R.id.word);
    word.setText(cursor.getString(cursor.getColumnIndex("English_Word")));
    word.setTypeface(listFont);
view.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View arg0) {
        Intent intent = new Intent(context, enTranslatedResultActivity.class);
        intent.putExtra("index", (cursor.getInt(cursor.getColumnIndex("Word_ID")));
        intent.putExtra("word", (cursor.getColumnIndex("English_Word")));
        context.startActivity(intent);
        }
  });
}

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
    LayoutInflater infalInflater = (LayoutInflater) this._context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View convertView = infalInflater.inflate(R.layout.listview_item, null);
    bindView(convertView , context, cursor);
    return convertView ;
}
}  

在 newView 中执行类似于您的 getView 方法的操作(没有 viewHolder)
在 bindView 中只需要为您的视图设置数据 您还可以设置 editText 并将其与此适配器绑定到此设置 OntextchangeListener 为 editText 然后当用户输入 editText 时您可以快速搜索。
可能存在更好的性能更好的方法,但我分享我所知道的一切

【讨论】:

    猜你喜欢
    • 2013-08-13
    • 2019-09-17
    • 1970-01-01
    • 2021-06-24
    • 1970-01-01
    • 2015-10-30
    • 2019-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多