具有两种布局的Android Listview ArrayAdapter [英] Android Listview ArrayAdapter with two layouts

查看:100
本文介绍了具有两种布局的Android Listview ArrayAdapter的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对Android很陌生.在下面的类中,从数据库中检索数据并将其显示在具有两种不同布局的ListView中. 尽管它可以按预期工作,但问题是滚动不流畅,因为一次又一次地分配了文本视图.我不知道如何只分配一次.请有人帮我解决这个问题. 提前致谢. 我为代码道歉,我知道它看起来很糟糕.

I am quite new to Android. In the following class the data is retrieved from the database and displayed in a ListView which has two different layouts. Though it works as expected, the problem is that scrolling is not smooth because the textviews are assigned again and again. I couldn't figure out how to have them assigned only once. Please somebody help me out with this. Thanks in advance. My apology for the code, I know it looks bad.

public class FragmentVerses extends ListFragment {

Typeface font;
ViewHolder viewHolder = new ViewHolder();
ViewHolderHeader viewHolderHeader = new ViewHolderHeader();
DatabaseHelper db;

public List<VersesModel> verses;
public List<ChapterModel> chapterName;
ArrayAdapter<VersesModel> adapter;

public FragmentVerses() {
}

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.verses_fragment, container, false);

    db = new DatabaseHelper(getActivity());
    try {
        db.createDatabase();
    } catch (IOException e) {
        Toast.makeText(getActivity(), "Error Creating Database", Toast.LENGTH_LONG)
                .show();
    }

    verses = db.getVerses(" WHERE " + getActivity().getIntent().getStringExtra(MainActivity.CONDITION));
    chapterName = db.getChapter();
    adapter = new MyListAdapter();
    setListAdapter(adapter);
    return view;
}

private class MyListAdapter extends ArrayAdapter<VersesModel> {
    public MyListAdapter() {
        super(getActivity(), R.layout.verses_custom_list, verses);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        VersesModel currentVerse = verses.get(position);
        if (convertView == null) {
            convertView = getActivity().getLayoutInflater().inflate(
                    R.layout.verses_custom_list, parent, false);
            font = Typeface.createFromAsset(convertView.getContext().getAssets(), "Quran_Taha.ttf");
            viewHolder.textView = (TextViewEx) convertView.findViewById(R.id.textView_Verse);
            viewHolder.textViewTranslation = (TextView) convertView.findViewById(R.id.textView_VerseTranslation);
            viewHolder.nView = (TextView) convertView.findViewById(R.id.textView_verseNumber);
            viewHolder.textView.setTypeface(font);
            viewHolder.imageView = (ImageView) convertView.findViewById(R.id.versesImageView);
            convertView.setTag(viewHolder);
        } else {
            if (currentVerse.getVerseNumber() != 0) {
                convertView = getActivity().getLayoutInflater().inflate(
                        R.layout.verses_custom_list, parent, false);
                viewHolder.textView = (TextViewEx) convertView.findViewById(R.id.textView_Verse);
                viewHolder.nView = (TextView) convertView.findViewById(R.id.textView_verseNumber);
                viewHolder.textViewTranslation = (TextView) convertView.findViewById(R.id.textView_VerseTranslation);
                viewHolder.textView.setTypeface(font);
                viewHolder.textView.setText(currentVerse.getVerseText() + "", true);
                viewHolder.textViewTranslation.setText(currentVerse.getVerseTranslation());
                viewHolder.nView.setText(currentVerse.getVerseNumber() + "");
                convertView.setTag(viewHolder);
            } else {
                convertView = getActivity().getLayoutInflater().inflate(
                        R.layout.verses_custom_list_header, parent, false);
                ChapterModel chapterModel = chapterName.get(currentVerse.getChapterNumber() - 1);
                if (viewHolderHeader.textViewChapter == null)    viewHolderHeader.textViewBismillah = (TextView) convertView.findViewById(R.id.textView_Verse_Bismillah);
                    viewHolderHeader.textViewChapter = (TextView) convertView.findViewById(R.id.textView_Verse_ChapterName);
                    viewHolderHeader.textViewChapter.setText("سورة  " + chapterModel.getChapterText());
                    viewHolderHeader.textViewBismillah.setTypeface(font);
                    viewHolderHeader.textViewChapter.setTypeface(font);
                } else {
                    viewHolderHeader = (ViewHolderHeader) convertView.getTag();
                }
                convertView.setTag(viewHolderHeader);

            }
        }
        return convertView;
    }
}

推荐答案

Android的适配器提供了一种在单个适配器中使用多个布局的方法.

Android's adapter provide a way to use multiple layouts in a single adapter.

首先,告诉适配器需要多少布局:

First, tell your adapter how many layouts you need:

public int getViewTypeCount()
{
    return 2;
}

然后,给出一些逻辑来判断当前项目应使用哪种布局:

Then, gives some logic to tell which layout should be used for the current item:

public int getItemViewType(int position)
{
    if (verses.get(position).getVerseNumber() != 0)
    {
        return 0;
    }

    return 1;
}

最后,在您的构建中使用适当的视图:

Finally, in your build the appropriate view:

public View getView(int position, View convertView, ViewGroup parent)
{
    if (this.getItemViewType(position) == 0)
    {
        // TODO Build the appropriate view
        return view;
    }

    // TODO Build the appropriate other view
    return view;
}

这篇关于具有两种布局的Android Listview ArrayAdapter的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆