从活动更新片段中的适配器

时间:2011-07-15 18:49:43

标签: android adapter android-fragments

我正在学习如何使用新的Fragment类,并遇到了无法找到答案的情况。

我有一个监听器设置,以便在列表片段中单击一个项目时,该项目应该反映在另一个片段的GridView中。

以下是听众:

public void onBulkScanAttributesFragmentListItemClicked(View v)
{
    TextView nameID = (TextView) v.findViewById(R.id.list_item_with_checkbox_dialog_item_name);
    String name = (String) nameID.getText();
    String value = "Set value";

    if (!names.contains(name))
    {
        names.add(name);
        items.add(new Row(name, value));
    }

    for (Row row : items)
    {
        Log.d(TAG, row.getRowName());
        Log.d(TAG, row.getRowValue());
    }
    BulkScanChosenAttributes chosen = new BulkScanChosenAttributes(items);

    FragmentTransaction transaction = getFragmentManager().beginTransaction();
    transaction.replace(R.id.chosen_att_fragment, chosen);
    transaction.commit();
}

以下是使用GridView的片段中的构造函数和onActivityCreate以及onCreateView方法:     公共类BulkScanChosenAttributes扩展Fragment {     private static final String TAG =“BulkScanChosenAttributes”;     private ArrayList项;     private GridAttributeAdapter adapter;

public BulkScanChosenAttributes()
{
    items = null;
}

public BulkScanChosenAttributes(ArrayList<Row> items)
{
    this.items = items;
}

@Override
public void onActivityCreated(Bundle savedInstance)
{
    super.onActivityCreated(savedInstance);

    adapter = new GridAttributeAdapter(getActivity(), items);

    if (items != null)
    {
        LayoutInflater gridInflater = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View v = gridInflater.inflate(R.layout.bulk_scan_chosen, null);
        GridView gridView = (GridView) v.findViewById(R.id.gridview);

        gridView.setAdapter(adapter);
    }
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{ 
    if (adapter != null)
        adapter.notifyDataSetChanged();
    return inflater.inflate(R.layout.bulk_scan_chosen, container, false); 
}

以下是GridView的XML布局(R.layout.bulk_scan_chosen):

<?xml version="1.0" encoding="utf-8"?>
<GridView xmlns:android="http://schemas.android.com/apk/res/android" 
  android:id="@+id/gridview"
  android:layout_width="fill_parent" 
  android:layout_height="fill_parent"
  android:columnWidth="90dp"
  android:numColumns="auto_fit"
  android:verticalSpacing="10dp"
  android:horizontalSpacing="10dp"
  android:stretchMode="columnWidth"
  android:gravity="center" />

GridView中视图的XML布局(R.layout.grid_item_layout):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical">
  <TextView
    android:id="@+id/grid_att_name"
    android:layout_width = "fill_parent"
    android:layout_height = "wrap_content"
    android:textColor = "@color/black"
    android:textSize = "@dimen/font_large"
    android:textStyle = "bold"
    android:gravity = "center_horizontal" />
  <TextView
    android:id="@+id/grid_att_value"
    android:layout_width = "fill_parent"
    android:layout_height = "wrap_content"
    android:textColor = "@color/black"
    android:textSize = "@dimen/font_large"
    android:textStyle = "bold"
    android:gravity = "center_horizontal" />
</LinearLayout>

(这已经很久了!)最后,我的适配器:

public class GridAttributeAdapter extends BaseAdapter
{
    private int count;
    private LayoutInflater inflater;
    private Context context;
    private String name;
    private String value;
    private ArrayList<Row> items;

    public GridAttributeAdapter(Context context, ArrayList<Row> items)
    {
        int count = 0;
        this.context = context;
        this.items = items;
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }
    @Override
    public int getCount()
    {
        return count;
    }

    @Override
    public Object getItem(int position)
    {
        return position;
    }

    @Override
    public long getItemId(int position)
    {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        View v = convertView;
        //try to inflate the view
        try
        {
            v = inflater.inflate(R.layout.grid_item_layout, null);
        }
        catch (NullPointerException npe)
        {
            npe.printStackTrace();
            Log.e(TAG, "view is null");
        }

        Row row = items.get(position);

        try
        {
            TextView name = (TextView) v.findViewById(R.id.grid_att_name);
            TextView value = (TextView) v.findViewById(R.id.grid_att_value);

            if (ListMetaData.withDates.contains(ListMetaData.reverseScreenNames.get(row.getRowName())))
            {
                try
                {
                    Date date = new Date(new Long(row.getRowValue()));
                    value.setText(date.getMonth() + "/" + date.getDate() + "/" + date.getYear());
                }
                catch (NumberFormatException nfe)
                {
                    value.setText(row.getRowValue());
                }
            }
            else
            {
                value.setText(row.getRowValue());
            }

            name.setText(row.getRowName());
        }
        catch (NullPointerException npe)
        {
            npe.printStackTrace();
            Log.e(TAG, "something went wrong in TextView assignment");
        }

        return v;
    }

}

适配器在BulkScanChosenAttributes中声明。

我想要更新的BulkScanChosenAttributes片段是空白的。我已经检查过以确保代码正在执行,但我对Fragments仍然有些不稳定。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

问题出在我的BaseAdapter实现中。 getCount方法返回0.修复后,它按预期工作。