android setOnItemClickListener使用2行布局不在一行上但在其他行中正常

时间:2013-09-20 01:51:26

标签: android android-listview onitemclicklistener

我使用的listView对于一行上的行有两个布局

  

setOnItemClickListener

但在另一行它不识别水龙头,

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);
    }
    }

因此,当“item.getType()”是文件夹而不是项目

时,会检测到点击

。我应该包含RowItemPhone.java和RowFolderPhone.java的代码吗?

那么如何解决这个问题?

谢谢!

编辑1. RowPhone.java

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

编辑2. RowFolder.java ..点击检测罚款的那个:

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;
    }
}

   }

这里的RowFolderPhone.java ......显示正常,但没有检测到水龙头:

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 个答案:

答案 0 :(得分:3)

PhoneItemAdapter上的getItem方法有问题。 getItem方法应该返回列表项而不是位置。所以你应该将你的代码替换为

public RowPhone getItem(int position) {
    return rows.get(position);
}

答案 1 :(得分:1)

通过设置descendantFocusability

解决了这个问题

in:row_item_phone.xml

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