1

I have used a ListFragment with an ArrayAdapter to show a list of items. You can find the code below.

public class SelectRepiceFragment extends ListFragment {

    private BuyRecipeActivity mActivity;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Resources res = mActivity.getResources();
        int recipeNum = res.getInteger(R.integer.recipe_number);
        String[] titles = res.getStringArray(R.array.titles);
        ArrayList<RecipeItem> recipeItems = new ArrayList<RecipeItem>(recipeNum);
        for (int i = 0; i < recipeNum; i++) {
            RecipeItem item = new RecipeItem();
            item.title = titles[i];
            recipeItems.add(item);
        }

        RecipeItemAdapter recipeItemAdapter = new RecipeItemAdapter(mActivity, recipeItems);
        setListAdapter(recipeItemAdapter);
    }

    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);
        this.mActivity = (BuyRecipeActivity) activity;
    }

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        mActivity.onRecipeSelected(position);
    }

}

The size of recipeItems is 3 (I check it with debugger). So the getView function in ArrayAdapter should be called 3 times to generate the ListFragment. Here I have copied the ArrayAdapter.

public class RecipeItemAdapter extends ArrayAdapter<RecipeItem> {

    private final Activity mActivity;

    static class ViewHolder {
        public MyTextView title;
        public ImageView image;
    }

    public RecipeItemAdapter(Activity context, ArrayList<RecipeItem> recipeItems) {
        super(context, R.layout.recipe_list, recipeItems);
        this.mActivity = context;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View rowView = convertView;
        // reuse views
        if (rowView == null) {
            LayoutInflater inflater = mActivity.getLayoutInflater();
            rowView = inflater.inflate(R.layout.recipe_item, null);
            // configure view holder
            ViewHolder viewHolder = new ViewHolder();
            viewHolder.title = (MyTextView) rowView.findViewById(R.id.recipeItemTitle);
            viewHolder.image = (ImageView) rowView.findViewById(R.id.recipeItemImage);
            rowView.setTag(viewHolder);
        }

        // fill data
        ViewHolder holder = (ViewHolder) rowView.getTag();

        RecipeItem recipeItem = getItem(position);
        holder.title.setText(recipeItem.title);
        holder.image.setImageResource(R.drawable.ic_launcher);

        return rowView;
    }
}

The problem is that getView is actually called three times, while every time the position parameter is equal to 0. So After running the app, I just see a single row in my list instead of 3 rows.

UPDATE: I found out that I just see the first item, but if I scroll it up, then it shows the rest of items in that single row! Consequently I guessed there should be a mistake in the xml file. So I add xml files bellow.

This is my main activity xml.

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <!-- The main content view -->

    <ScrollView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <FrameLayout
            android:id="@+id/fragmentView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center|top" />
    </ScrollView>

    <!-- The navigation drawer -->

    <ListView
        android:id="@+id/left_drawer"
        android:layout_width="240dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:background="#dcdcdc"
        android:choiceMode="singleChoice"
        android:divider="#dcdcdc"
        android:dividerHeight="0.5dp" />

</android.support.v4.widget.DrawerLayout>

And this is my recipe_item xml file.

<?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="100dp"
    android:gravity="center"
    android:orientation="horizontal" >

    <TextView
        android:id="@+id/recipeItemTitle"
        android:layout_width="100dp"
        android:layout_height="50dp"
        android:layout_marginLeft="10dp"
        android:background="@drawable/design_price_view"
        android:gravity="center" />

    <ImageView
        android:id="@+id/recipeItemImage"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:src="@drawable/app_icon" />

</LinearLayout>

UPDATE 2: I removed the DrawerLayout from my main activity xml and now I see the list. Just confusing.

Abouzar Nouri
  • 140
  • 12
  • I think it might be an issue with the way you're calling the `inflate` method. The inflation should be `inflate(R.layout.xyz, parent, false)` see http://developer.android.com/reference/android/widget/Adapter.html#getView(int, android.view.View, android.view.ViewGroup) – frozenkoi May 17 '14 at 12:01
  • Thanks frozenkoi. I checked this point but it didn't fix my problem. I have added xml file to the main question with some new explanation. – Abouzar Nouri May 18 '14 at 05:47

1 Answers1

0

You may try removing the ScrollView, take the FrameLayout out, put

layout_height="0dp"
layout_weight="1"

to the FrameLayout. You will need to manually fix the height of your navigation drawer to predefined pixel.

The above setup will make your FrameLayout & your ListView inside it take all the available space left from the navigational drawer.

The problem is, if you place a ListView inside a ScrollView - there is a rendering problem. I have not worked with ListView inside FrameLayout so cant really comment on that.

If you absolutely need to keep the ScrollView, you would need to re-render your ListView so that it spans the height it needs. Check this thread

Community
  • 1
  • 1
Pocha
  • 226
  • 4
  • 11