I'm learning how to use the new Fragment classes and have run across a situation that I can't find an answer to.
I have a listener set up so that when an item is clicked in a list fragment that item is supposed to be reflected in a GridView in another fragment.
Here is the listener:
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();
}
Here are the constructors and onActivityCreate and onCreateView methods from the fragment with the GridView: public class BulkScanChosenAttributes extends Fragment { private static final String TAG = "BulkScanChosenAttributes"; private ArrayList items; 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);
}
Here is the XML layout for the GridView (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" />
The XML layout for the view in the GridView (R.layout.grid_item_layout):
<?xml version="1.0" enc开发者_开发百科oding="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>
(This is getting long!) And finally, my adapter:
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;
}
}
The adapter is declared within BulkScanChosenAttributes.
The BulkScanChosenAttributes fragment that I want to be updated is blank. I've checked to make sure that the code is executing, but I'm still a little shaky on Fragments. Any help would be greatly appreciated.
The problem was in my BaseAdapter implementation. The getCount method was returning 0. After fixing that, it worked as expected.
精彩评论