Question

Im using a listView that have 2 layouts for the rows on one row the

setOnItemClickListener

but on the other row it doesnt recognize the taps,

public void initItemTable()
{
    listViewItem = (ListView) getView().findViewById(R.id.listViewItem);

    listViewItem.setAdapter(new PhoneItemAdapter(new ItemPhoneDataSource().getItems()));

    listViewItem.setOnItemClickListener(new OnItemClickListener() {

    @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
    // TODO Auto-generated method stub

    Log.d("mensa", "item index :"+arg2);    
        }
    });
}

//
    private class PhoneItemAdapter extends BaseAdapter {  
    final List<RowPhone> rows;//row
    //data source, style
    PhoneItemAdapter(List<ItemPhone> animals) {
        rows = new ArrayList<RowPhone>();//member variable

        //choose cell! iterator
        for (ItemPhone item : animals) {

            if (item.getType().equals("item")) {
                rows.add(new RowItemPhone(LayoutInflater.from(getActivity()), item));                   

            } else {
                rows.add(new RowFolderPhone(LayoutInflater.from(getActivity()), item)); //imageRow!

            }                
        }
    }

    //delegate
    @Override
    public int getViewTypeCount() {
        return RowTypePhone.values().length;
    }

    @Override
    public int getItemViewType(int position) {
        //con cast
        return ((RowPhone) rows.get(position)).getViewType();

    }

    public int getCount() {
        return rows.size();
    }

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

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

    public View getView(int position, View convertView, ViewGroup parent) {

        //cambiado con cast!
        return ((RowPhone) rows.get(position)).getView(convertView);
    }
    }

So the tap is detected when "item.getType()" is folder but not in item,

. Shall I include the code for RowItemPhone.java and RowFolderPhone.java?

so how to fix this tap problem?

thanks!

edit 1. RowPhone.java

public  interface RowPhone {
public  View getView(View convertView);
public  int getViewType();
}

edit 2. RowFolder.java .. the one that have the tap detecting fine:

public class RowItemPhone implements RowPhone{

private final ItemPhone item;
private final LayoutInflater inflater;

public RowItemPhone(LayoutInflater inflater, ItemPhone animal) {
    this.item = animal;
    this.inflater = inflater;
}

//text doble
public View getView(View convertView) {
    ViewHolder holder;
    View view = null;

    if (convertView == null) {
        //ViewGroup viewGroup = (ViewGroup)inflater.inflate(R.layout.row_item_phone, null);

        ViewGroup viewGroup = (ViewGroup)inflater.inflate(R.layout.row_item_phone, (ViewGroup) view, false);


        holder = new ViewHolder(
                (ImageView)viewGroup.findViewById(R.id.image_item), 
                (TextView)viewGroup.findViewById(R.id.title),
                (TextView)viewGroup.findViewById(R.id.description));

        viewGroup.setTag(holder); //pa q y como usa tag!
        view = viewGroup;
    } else {
        view = convertView;
        holder = (ViewHolder)convertView.getTag();
    }


    //setup
    holder.imageView.setImageResource(item.getImageId());
    holder.descriptionView.setText(item.getDescription());
    holder.titleView.setText(item.getName());

    return view;
}

public int getViewType() {
    return RowTypePhone.DESCRIPTION_ROW.ordinal();
}

private static class ViewHolder {
    final ImageView imageView;
    final TextView titleView;
    final TextView descriptionView;

    private ViewHolder(ImageView imageView, TextView titleView, TextView descriptionView)     {
        this.imageView = imageView;
        this.titleView = titleView;
        this.descriptionView = descriptionView;
    }
}

   }

And here the RowFolderPhone.java ... showing fine, but not detecting taps:

public class RowFolderPhone implements RowPhone {


private final ItemPhone item;
private final LayoutInflater inflater;

public RowFolderPhone(LayoutInflater inflater, ItemPhone animal) {
    this.item = animal;
    this.inflater = inflater;
}

public View getView(View convertView) {
    ViewHolder holder;
    View view = null;

    //we have a don't have a converView so we'll have to create a new one
    if (convertView == null) {
       // ViewGroup viewGroup = (ViewGroup)inflater.inflate(R.layout.row_folder_phone, null);
        ViewGroup viewGroup = (ViewGroup)inflater.inflate(R.layout.row_folder_phone, (ViewGroup) view, false);

        //use the view holder pattern to save of already looked up subview
        holder = new ViewHolder((ImageView)viewGroup.findViewById(R.id.image),
                (TextView)viewGroup.findViewById(R.id.title));

        viewGroup.setTag(holder);

        view = viewGroup;

    } else {
        //get the holder back out
        holder = (ViewHolder)convertView.getTag();

        view = convertView;
    }

    //actually setup the view
    holder.imageView.setImageResource(item.getImageId());
    holder.titleView.setText(item.getName());

    return view;
}

public int getViewType() {
    return RowTypePhone.IMAGE_ROW.ordinal();
}

private static class ViewHolder {
    final ImageView imageView;
    final TextView titleView;

    private ViewHolder(ImageView imageView, TextView titleView) {
        this.imageView = imageView;
        this.titleView = titleView;
    }
  } 
 }
Was it helpful?

Solution 2

the problem was solved by setting descendantFocusability

in : row_item_phone.xml

 <RelativeLayout ...
 android:descendantFocusability="blocksDescendants"

OTHER TIPS

There are something wrong with your getItem method on PhoneItemAdapter. getItem method should return list item not position. So you should replace your code to

public RowPhone getItem(int position) {
    return rows.get(position);
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top