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;
    }
  } 
 }
有帮助吗?

解决方案 2

the problem was solved by setting descendantFocusability

in : row_item_phone.xml

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

其他提示

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);
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top