Android Listview ArrayAdapter 具有两种布局

Aal*_*lem 4 android listview android-arrayadapter

我对 Android 还很陌生。在下面的类中,从数据库中检索数据并显示在具有两种不同布局的 ListView 中。\n虽然它按预期工作,但问题是滚动不平滑,因为文本视图被一次又一次分配。我不知道如何让它们只分配一次。请有人帮我解决这个问题。\n提前致谢。我对代码表示歉意,我知道它看起来很糟糕。

\n\n
public 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}\n
Run Code Online (Sandbox Code Playgroud)\n

Mat*_*tro 5

我知道这篇文章很旧,但仅供将来参考...在这种情况下,您应该使用 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 数据库。

但对于我来说,这个答案中的代码太多了:/

希望这对某人有帮助。