views:

68

answers:

1

Hi everyone. Doing some R&D for my company. We are trying to have a listView that contains an imageview, and two edit boxes for each entry in the listview.

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent"
  android:layout_height="wrap_content"
  android:orientation="horizontal"
  android:isScrollContainer="true"
  android:focusableInTouchMode="false"
  android:focusable="false">
  <ImageView android:id="@+id/imgView"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:maxWidth="100dp"
  android:maxHeight="100dp"/>
  <LinearLayout 
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:orientation="vertical">
    <EditText android:id="@+id/img_title"
    android:hint="Title"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:minWidth="150dp"/>
    <EditText android:id="@+id/img_desc"
    android:hint="Description"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:minWidth="150dp"/>
  </LinearLayout>
</LinearLayout>

This is the layout file I am attempting to use for the item that will be within the listview. Within the getView of our ImageAdapter (which extends ArrayAdapter), I am attempting to use the LayoutInflater to inflate the xml, which I then store into a ViewGroup. I findViewByID() to get the imageView in the xml, and set the properties of the imageView that we would like.

If we keep inflating this xml file, all the id's will be the same. Here is our issues.

  1. If we remove a list item with a context menu, it actually removes the incorrect one. Testing shows that it's mostly the last one added, but not always.
  2. The EditText's do not respond to keyboard input. On occasion, they're store some data, usually always "bbb".

We have more issues, but we'll post back after we get these more serious errors fixed.

public View getView(int position, View convertView, ViewGroup parent)
    {
        final ImageView imageView;
        //InputStream is = null;
        final Context mContext = super.getContext();
        final AdapterItem item = super.getItem(position);
        final Uri imageUri = item.getUri();
        ViewGroup viewGroup = null;

        try
        {
            //-- If the view has not been created yet.
            if (convertView == null)
            {
                /*
                 * Build the ImageView from the URI with some custom
                 * view settings.
                 */

                viewGroup = (ViewGroup) LayoutInflater.from(mContext).inflate(R.layout.mediauploadobject, null);
                imageView = (ImageView) viewGroup.findViewById(R.id.imgView);
                //imageView.setLayoutParams(new GridView.LayoutParams(IMAGE_WIDTH, IMAGE_HEIGHT));
                imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
                imageView.setPadding(IMAGE_PADDING_LEFT, IMAGE_PADDING_TOP,
                        IMAGE_PADDING_RIGHT, IMAGE_PADDING_BOTTOM);
                imageView.setDrawingCacheEnabled(true);
                imageView.setClickable(true);
                imageView.setFocusable(true);
                imageView.setFocusableInTouchMode(true);
                imageView.setSaveEnabled(false);
                //the following two lines are required for the menu to popUp
                imageView.setOnLongClickListener(new LongClickListener());
                imageView.setOnCreateContextMenuListener(new LongClickMenu());
                imageView.setOnClickListener(new ShortClickListener());

                //the following two lines are required to put a boarder around the images
                imageView.setOnTouchListener(new PictureOnTouchListener());
                imageView.setOnFocusChangeListener(new PictureOnFocusChangeListener());

                //-- Keep a reference to the ImageView by tagging it.
                imageView.setTag(imageUri);
            }else
            {
                //-- R-E-C-Y-C-L-E recycle!
                viewGroup = (ViewGroup) convertView;
                imageView = (ImageView) viewGroup.findViewById(R.id.imgView);
            }

            //-- Lazy load the images so the user doesn't have to wait for all of the querying non-sense
            //   that happens behind the scenes.
            imageView.setImageResource(android.R.drawable.gallery_thumb);
            imageView.post(new ImageLoader(imageUri, imageView));           

            //-- Be VERY careful when changing this code. Due to heap size issues,
            //   the size of the bitmap image MUST be modified with the
            //   provided BitmapFactory.Options or the program will
            //   crash often and frequent.
            //post
            //-- AJG 7/1/2010 added this assignment so we aren't always setting these preferences every
            //   iteration
            convertView = viewGroup;
        }catch(Throwable t)
        {
            Log.e(TAG, t.toString());
            return null;            
        }finally
        {
            //try{if(is != null)is.close();}catch(Exception squish){}
        }

        return viewGroup;
    }
+1  A: 

Subviews aren't focusable in a listview by default. This is to prevent odd trackball/non-touch navigation behavior. That might be why your edittexts aren't responding to input. Make sure you're calling the ListView.setItemsCanFocus(true) method.

CodeFusionMobile
While this wasn't the fix to my problem, this was the answer that I generally found else where also. Thanks I decided to instead instantiate my own view group as a row in a "fake" listview by just adding view groups to a linear layout.
DavidAndroidDev