【问题标题】:Updating an adapter in a fragment from the activity从活动更新片段中的适配器
【发布时间】:2011-07-15 18:49:42
【问题描述】:

我正在学习如何使用新的 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 扩展片段 { 私有静态最终字符串 TAG = "BulkScanChosenAttributes"; 私有 ArrayList 项; 私有 GridAttributeAdapter 适配器;

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 (R.layout.bulk_scan_chosen) 的 XML 布局:

<?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 仍然有点不稳定。任何帮助将不胜感激。

【问题讨论】:

    标签: android adapter android-fragments


    【解决方案1】:

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

    【讨论】:

    • 嗨。便当盒!你能显示你的活动代码吗?现在我的 gridView 遇到了一些问题。或者可能在电子邮件/Skype 中?可能吗?我的 googleProfile gplus.to/vsvydenko 谢谢
    猜你喜欢
    • 2012-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多