适用于GridView的不规则格式/视图的Android适配器

时间:2013-12-14 21:40:07

标签: android listview gridview android-listview android-gridview

我正在制作扩展BaseAdapter的自定义适配器FieldAdapter。我创建了一个LinearLayout视图的GridView,它包含一个TextView和一个Spinner或一个EditText。

看来,经过多次研究,优化的方法是使用ViewHolder方法。但这似乎针对所有共享相同属性的项目列表进行了优化。

这是一个潜在的问题是因为我可能有4个带有TextView和EditText的视图,另外5个带有TextView和一个微调器,所以我不能假设某个布局。

在我的getView方法中使用逻辑来检查每个项目需要返回哪种视图或者有更好的方法是否最佳?我应该只拥有ViewHolder对象来保存相应的布局吗?即DropdownViewHolder和TextViewHolder?

这会使convertView无效吗?

以下是我的代码可行,但我注意到如果我有一个大的项目列表并快速向上和向下滚动我的整个列表消失,这让我相信我没有正确地做某事。

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

    if (convertView == null) {
        LayoutInflater inflater = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        LinearLayout layoutSection = (LinearLayout) inflater.inflate(R.layout.dropdown, null);

        TextView labelText = new TextView(this.context);
        labelText.setText(data.get(position).getLabelText());
        labelText.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
        layoutSection.addView(labelText);

        if (data.get(position).getFieldType().equalsIgnoreCase("dropdown")) {
            Spinner spinner = new Spinner(this.context);
            spinner.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
            // Options
            final List<String> options = new ArrayList<String>();
            ArrayAdapter<String> spinnerAdapter = new ArrayAdapter<String>(context,
                    android.R.layout.simple_list_item_1, options);
            spinner.setAdapter(spinnerAdapter);


            layoutSection.addView(spinner);
        } else if (data.get(position).getFieldType().equalsIgnoreCase("text")) {
            EditText textbox = new EditText(this.context);
            textbox.setText("Hi");
            textbox.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
            layoutSection.addView(textbox);
        }

        return layoutSection;
    } else {
        return convertView;
    }
}   

1 个答案:

答案 0 :(得分:1)

请参阅以下方法:getItemViewType&amp; getViewTypeCount