Aal*_*lem 4 android listview android-arrayadapter
我对 Android 还很陌生。在下面的类中,从数据库中检索数据并显示在具有两种不同布局的 ListView 中。\n虽然它按预期工作,但问题是滚动不平滑,因为文本视图被一次又一次分配。我不知道如何让它们只分配一次。请有人帮我解决这个问题。\n提前致谢。我对代码表示歉意,我知道它看起来很糟糕。
\n\npublic class FragmentVerses extends ListFragment {\n\nTypeface font;\nViewHolder viewHolder = new ViewHolder();\nViewHolderHeader viewHolderHeader = new ViewHolderHeader();\nDatabaseHelper db;\n\npublic List<VersesModel> verses;\npublic List<ChapterModel> chapterName;\nArrayAdapter<VersesModel> adapter;\n\npublic FragmentVerses() {\n}\n\n@Nullable\n@Override\npublic View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {\n View view = inflater.inflate(R.layout.verses_fragment, container, false);\n\n db = new DatabaseHelper(getActivity());\n try {\n db.createDatabase();\n } catch (IOException e) {\n Toast.makeText(getActivity(), "Error Creating Database", Toast.LENGTH_LONG)\n .show();\n }\n\n verses = db.getVerses(" WHERE " + getActivity().getIntent().getStringExtra(MainActivity.CONDITION));\n chapterName = db.getChapter();\n adapter = new MyListAdapter();\n setListAdapter(adapter);\n return view;\n}\n\nprivate class MyListAdapter extends ArrayAdapter<VersesModel> {\n public MyListAdapter() {\n super(getActivity(), R.layout.verses_custom_list, verses);\n }\n\n @Override\n public View getView(int position, View convertView, ViewGroup parent) {\n VersesModel currentVerse = verses.get(position);\n if (convertView == null) {\n convertView = getActivity().getLayoutInflater().inflate(\n R.layout.verses_custom_list, parent, false);\n font = Typeface.createFromAsset(convertView.getContext().getAssets(), "Quran_Taha.ttf");\n viewHolder.textView = (TextViewEx) convertView.findViewById(R.id.textView_Verse);\n viewHolder.textViewTranslation = (TextView) convertView.findViewById(R.id.textView_VerseTranslation);\n viewHolder.nView = (TextView) convertView.findViewById(R.id.textView_verseNumber);\n viewHolder.textView.setTypeface(font);\n viewHolder.imageView = (ImageView) convertView.findViewById(R.id.versesImageView);\n convertView.setTag(viewHolder);\n } else {\n if (currentVerse.getVerseNumber() != 0) {\n convertView = getActivity().getLayoutInflater().inflate(\n R.layout.verses_custom_list, parent, false);\n viewHolder.textView = (TextViewEx) convertView.findViewById(R.id.textView_Verse);\n viewHolder.nView = (TextView) convertView.findViewById(R.id.textView_verseNumber);\n viewHolder.textViewTranslation = (TextView) convertView.findViewById(R.id.textView_VerseTranslation);\n viewHolder.textView.setTypeface(font);\n viewHolder.textView.setText(currentVerse.getVerseText() + "", true);\n viewHolder.textViewTranslation.setText(currentVerse.getVerseTranslation());\n viewHolder.nView.setText(currentVerse.getVerseNumber() + "");\n convertView.setTag(viewHolder);\n } else {\n convertView = getActivity().getLayoutInflater().inflate(\n R.layout.verses_custom_list_header, parent, false);\n ChapterModel chapterModel = chapterName.get(currentVerse.getChapterNumber() - 1);\n if (viewHolderHeader.textViewChapter == null) viewHolderHeader.textViewBismillah = (TextView) convertView.findViewById(R.id.textView_Verse_Bismillah);\n viewHolderHeader.textViewChapter = (TextView) convertView.findViewById(R.id.textView_Verse_ChapterName);\n viewHolderHeader.textViewChapter.setText("\xd8\xb3\xd9\x88\xd8\xb1\xd8\xa9 " + chapterModel.getChapterText());\n viewHolderHeader.textViewBismillah.setTypeface(font);\n viewHolderHeader.textViewChapter.setTypeface(font);\n } else {\n viewHolderHeader = (ViewHolderHeader) convertView.getTag();\n }\n convertView.setTag(viewHolderHeader);\n\n }\n }\n return convertView;\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n
我知道这篇文章很旧,但仅供将来参考...在这种情况下,您应该使用 ViewHolder 模式。
如果您想使用 2 个布局,只需创建两个 ViewHolder 并在 getView 方法中进行切换。
与接受的答案非常相似,但性能更好。
声明视图类型。
private final int VIEW_TYPE_EXAMPLE = 0;
private final int VIEW_TYPE_EXAMPLE_TWO = 1;
Run Code Online (Sandbox Code Playgroud)
返回与上面声明的类型一样多的类型。
@Override
public int getViewTypeCount() {
return 2;
}
Run Code Online (Sandbox Code Playgroud)
当项目位于位置 X 时返回 viewType 时进行切换。在这种情况下,我仅在项目是列表中的第一个项目时更改类型。
@Override
public int getItemViewType(int position) {
return (position == 0) ? VIEW_TYPE_EXAMPLE : VIEW_TYPE_EXAMPLE_TWO;
}
Run Code Online (Sandbox Code Playgroud)
创建与您的布局相匹配的视图持有者。他们将保存您的数据。
class SecondViewHolder {
TextView mDate;
TextView mDescription;
TextView mObservations;
public SecondViewHolder(View view) {
mDate = (TextView) view.findViewById(R.id.txt_date);
mDescription = (TextView) view.findViewById(R.id.txt_description);
mObservations = (TextView) view.findViewById(R.id.txt_observations);
}
}
class FirstViewHolder {
ImageView mPhoto;
TextView mName;
TextView mAge;
public FirstViewHolder(View view) {
mPatientPhoto = (ImageView)view.findViewById(R.id.img_photo);
mPatientName = (TextView)view.findViewById(R.id.txt_name);
mPatientAge = (TextView)view.findViewById(R.id.txt_age);
}
}
Run Code Online (Sandbox Code Playgroud)
在 getView 方法中切换 then 。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
int viewType = getItemViewType(position);
switch (viewType) {
case VIEW_TYPE_EXAMPLE: {
FirstViewHolder firstViewHolder = null;
if(convertView == null){
convertView = LayoutInflater.from(getContext()).inflate(R.layout.item_example, parent, false);
firstViewHolder = new FirstViewHolder(convertView);
convertView.setTag(firstViewHolder);
}
else firstViewHolder = (FirstViewHolder)convertView.getTag();
firstViewHolder.mName.setText("Your name");
firstViewHolder.mAge.setText("20 years old");
break;
}
case VIEW_TYPE_EXAMPLE_TWO: {
SecondViewHolder holder = null;
if(convertView == null){
convertView = LayoutInflater.from(getContext()).inflate(R.layout.item_example_two, parent, false);
holder = new SecondViewHolder(convertView);
convertView.setTag(holder);
}
else holder = (SecondViewHolder)convertView.getTag();
holder.mDate.setText("01/01/2016");
holder.mDescription.setText("Description");
holder.mObservations.setText("Obs");
break;
}
}
return convertView;
}
Run Code Online (Sandbox Code Playgroud)
但我不能忽视这样一个事实:在这个特定问题中,您应该使用 CursorAdapter,因为您正在从数据库进行查询。
您也不应该直接访问数据库。应该创建一个Loader(执行异步任务但不与活动绑定)。
如果您想遵循最佳实践并在以后避免一些麻烦,请创建 ContentProvider来管理您的 SQLite 数据库。
但对于我来说,这个答案中的代码太多了:/
希望这对某人有帮助。
| 归档时间: |
|
| 查看次数: |
3676 次 |
| 最近记录: |