点击事件写在外层OnItemClickListener中。

解决方案 »

  1.   

    啊,怎么写在外层?你意思是和ListView一层么???我不仅要监听里面的各个控件,还要监听总的Item
      

  2.   

    看来大家估计都没遇到过,谁可以给我一份正规的getView方法呀,有Item里面的各种控件的监听邮箱[email protected]。不胜感激。
      

  3.   

    我不仅要监听里面的各个控件,还要监听总的Item
    这句话什么意思?
    用listView.setOnItemClickListener也一样啊我感觉你的错误应该是被点击的position和convertView混乱了导致的。
    先写到OnItemClickListener里试试。
      

  4.   

    ListView中不是有很多Item么,每个Item中有很多控件,我还要对各个控件进行监听。明白???
      

  5.   


    public View getView(final int position, View view, ViewGroup parent) {
    // holder = new ViewHolder();
    if (view == null) {
    view = inflater.inflate(R.layout.custom_list_item, null);
    } final Button praise = (Button) view.findViewById(R.id.praise);
    praise.setText(allMessage.get(position).getPraNum() + "");
    praise.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
    if (isPraised(allMessage.get(position).getMsgId())) {
    ViewUtil.toastShort("你已经赞过了", context);
    return;
    }
                                    Button btn = (Button)v;
    btn.setText(allMessage.get(position).getPraNum() + 1 + "");
    btn.setBackgroundResource(R.drawable.message_praise_yes);
    new DownLoadThread(handler, allMessage.get(position).getMsgId())
    .start();
    }
    });
    }
      

  6.   

    我是这样写的,每个list item里面的控件的监听事件OnClickListener在getView里面注册,而list的点击事件OnItemClickListener写在继承listActivity的那个文件里
      

  7.   

    回复8楼,我这个Adapter还要扩展呢,不能那么写
      

  8.   

    扩展是个什么意思,Adapter只是个向列表添加数据的容器,getview是在添加数据的时候调用,点击时是不调用的
      

  9.   

    扩展是个什么意思,Adapter只是个向列表添加数据的容器,getview是在添加数据的时候调用,点击时是不调用的
    给个getView的例子吧。
      

  10.   

    监听类不要写在适配器类里面吧.
    可以参考一下这个例子
    http://download.csdn.net/detail/fzllz/5369093
      

  11.   

    问题解决了,这是布局的滚动混乱问题,我一开始就应该想到的,可以监听到东西,滚动的时候会在别的地方出现,解决办法,就是定义一个List或者map将每个Item的状态保存下来就行了。谢谢各位大哥。额。。
      

  12.   

    我也遇到这个问题,ListFragment中的监听item点击事件,结果点第一个item,第7,14,21都会响应,本人手机是三星note2,然后换了同事的魅族,结果是0,5,10,15一起响应。楼主怎么解决的,具体代码发一份给我吧,[email protected]
      

  13.   

    同遇到此问题,求源码[email protected]
      

  14.   

    我也遇到此问题了,头疼,求解啊 [email protected],万分感谢!
      

  15.   

    楼主怎么解决的 可发我份源码 [email protected]
      

  16.   

    楼主怎么解决的啊 发我份源码把 [email protected] 急求 谢谢
      

  17.   

    楼主,我现在遇到的问题跟你一样,能把你的那份代码发我参考下吗,谢谢![email protected]
      

  18.   

    package com.mars.library.adapter;import java.util.ArrayList;
    import java.util.HashMap;import android.annotation.SuppressLint;
    import android.app.Activity;
    import android.content.Context;
    import android.os.Handler;
    import android.os.Message;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.Button;
    import android.widget.ProgressBar;
    import android.widget.RelativeLayout;
    import android.widget.TextView;import com.mars.library.entry.BookMyBorrow;
    import com.mars.library.main.R;
    import com.mars.library.util.BookDetailHandler;
    import com.mars.library.util.ConstantUtil;
    import com.mars.library.util.RequestThread;
    import com.mars.library.util.VarUtil;
    import com.mars.library.util.ViewUtil;/**
     * Book简单的适配器
     * 
     * @author Administrator
     * 
     */
    @SuppressLint({ "HandlerLeak", "UseSparseArrays" })
    public class ListViewBookMyBorrowAdapter extends BaseAdapter { private Context context;
    private ArrayList<BookMyBorrow> allBook;
    private LayoutInflater inflater;

    //同学:保存按钮的状态,来判断是否有这个按钮。不保存状态的话,下拉以后就可能不显示了。
    //同学:因为这个保存是全部保存,而ListView的机制,是保存当前显示的,所以那个不靠谱。但是那个省内存。所以需要保存状态再保存,不需要就不要保存
    private HashMap<Integer, Boolean> isCanRenew = new HashMap<Integer, Boolean>(); public ListViewBookMyBorrowAdapter(Context context, ArrayList<BookMyBorrow> allBook) {
    this.context = context;
    this.allBook = allBook;
    this.inflater = LayoutInflater.from(context);
    } @Override
    public View getView(final int position, View view, ViewGroup parent) {
    // 如果不加这行代码,很容易溢出
    if (view == null) {
    view = inflater.inflate(R.layout.book_my_borrow_item, null);
    }
    if (allBook.isEmpty()) {
    return view;
    }
    final ViewHolder holder = new ViewHolder(); holder.item = (RelativeLayout) view.findViewById(R.id.item);
    holder.number = (TextView) view.findViewById(R.id.number);
    holder.name = (TextView) view.findViewById(R.id.name);
    holder.date = (TextView) view.findViewById(R.id.date);
    holder.renew = (Button) view.findViewById(R.id.renew);
    holder.progress = (ProgressBar) view.findViewById(R.id.progressBar); holder.number.setText(allBook.get(position).getId());
    holder.name.setText(allBook.get(position).getName());
    holder.date.setText(allBook.get(position).getDate()); // 点击列表查看图书的详细信息
    holder.item.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
    lookUpBookDetail(position);
    }
    }); //同学:看这里
    isCanRenew.put(position, allBook.get(position).isRenew());// 保存 //同学:看这里
    if (isCanRenew.get(position) == false) {// 如果不可用
    holder.renew.setVisibility(View.GONE);
    } else {// 如果可以续借
    holder.renew.setVisibility(View.VISIBLE);
    holder.renew.setEnabled(true);
    } holder.renew.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
    String url = VarUtil.URL + "/renew";
    HashMap<String, String> allParams = new HashMap<String, String>();
    allParams.put(ConstantUtil.ACCOUNT, VarUtil.student.getAccount());
    allParams.put(ConstantUtil.PASSWORD, VarUtil.student.getPassword());
    allParams.put(ConstantUtil.BARCODE, allBook.get(position).getBarcode());
    allParams.put(ConstantUtil.DEPARTMENTID, allBook.get(position).getDepartmentId());
    allParams.put(ConstantUtil.LIBRARYID, allBook.get(position).getLibraryId());
    VarUtil.threadPool.submit(new RequestThread(url, new RenewHandler(holder),
    allParams));
    }
    });// if (allBook.get(position).isRenew() == false) {
    // holder.renew.setVisibility(View.GONE);
    // } else {
    // holder.renew.setVisibility(View.VISIBLE);
    // holder.renew.setEnabled(true);
    //
    // holder.renew.setOnClickListener(new OnClickListener() {
    // @Override
    // public void onClick(View v) {
    // String url = VarUtil.URL + "/renew";
    // HashMap<String, String> allParams = new HashMap<String, String>();
    // allParams.put(ConstantUtil.ACCOUNT, VarUtil.student.getAccount());
    // allParams.put(ConstantUtil.PASSWORD, VarUtil.student.getPassword());
    // allParams.put(ConstantUtil.BARCODE, allBook.get(position).getBarcode());
    // allParams.put(ConstantUtil.DEPARTMENTID, allBook.get(position)
    // .getDepartmentId());
    // allParams.put(ConstantUtil.LIBRARYID, allBook.get(position).getLibraryId());
    // VarUtil.threadPool.submit(new RequestThread(url, new RenewHandler(holder),
    // allParams));
    // }
    // });
    // } return view;
    } private void lookUpBookDetail(int position) {
    // 根据参数,请求数据
    String url = ConstantUtil.URL + "/lib/detail.aspx";
    HashMap<String, String> allParams = new HashMap<String, String>();
    allParams.put(ConstantUtil.DETAIL, "true");
    allParams.put(ConstantUtil.BARCODE, allBook.get(position).getBarcode()); BookDetailHandler handler = new BookDetailHandler((Activity) context); VarUtil.threadPool.submit(new RequestThread(url, handler, allParams));
    } private class RenewHandler extends Handler {
    private ViewHolder holder; public RenewHandler(ViewHolder holder) {
    this.holder = holder;
    } @Override
    public void handleMessage(Message msg) {
    switch (msg.what) {
    // 任务开始
    case ConstantUtil.START:
    holder.renew.setVisibility(View.INVISIBLE);
    holder.progress.setVisibility(View.VISIBLE);
    break;
    // 任务结束
    case ConstantUtil.END:
    if (VarUtil.result.equals(ConstantUtil.SUCCESS)) {
    holder.renew.setVisibility(View.GONE);
    holder.progress.setVisibility(View.GONE);
    } else if (VarUtil.result.equals(ConstantUtil.FAIL)) {
    holder.renew.setVisibility(View.VISIBLE);
    holder.progress.setVisibility(View.INVISIBLE);
    ViewUtil.toastShort("续借失败!", (Activity) context);
    }
    break;
    // 任务出错
    case ConstantUtil.INTERNET_ERROR:
    ViewUtil.toastShort("客户端网络异常!请您稍后重试!", (Activity) context);
    break;
    default:
    break;
    }
    }
    } class ViewHolder {
    RelativeLayout item;
    TextView number;
    TextView name;
    TextView date;
    Button renew;
    ProgressBar progress;
    } @Override
    public int getCount() {
    return allBook.size();
    } @Override
    public Object getItem(int arg0) {
    return allBook.get(arg0);
    } @Override
    public long getItemId(int arg0) {
    return arg0;
    }}
    不懂的再发我邮箱[email protected]
      

  19.   

    package com.mars.library.adapter;import java.util.ArrayList;
    import java.util.HashMap;import android.annotation.SuppressLint;
    import android.app.Activity;
    import android.content.Context;
    import android.os.Handler;
    import android.os.Message;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.View.OnClickListener;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.Button;
    import android.widget.ProgressBar;
    import android.widget.RelativeLayout;
    import android.widget.TextView;import com.mars.library.entry.BookMyBorrow;
    import com.mars.library.main.R;
    import com.mars.library.util.BookDetailHandler;
    import com.mars.library.util.ConstantUtil;
    import com.mars.library.util.RequestThread;
    import com.mars.library.util.VarUtil;
    import com.mars.library.util.ViewUtil;/**
     * Book简单的适配器
     * 
     * @author Administrator
     * 
     */
    @SuppressLint({ "HandlerLeak", "UseSparseArrays" })
    public class ListViewBookMyBorrowAdapter extends BaseAdapter { private Context context;
    private ArrayList<BookMyBorrow> allBook;
    private LayoutInflater inflater;

    //同学:保存按钮的状态,来判断是否有这个按钮。不保存状态的话,下拉以后就可能不显示了。
    //同学:因为这个保存是全部保存,而ListView的机制,是保存当前显示的,所以那个不靠谱。但是那个省内存。所以需要保存状态再保存,不需要就不要保存
    private HashMap<Integer, Boolean> isCanRenew = new HashMap<Integer, Boolean>(); public ListViewBookMyBorrowAdapter(Context context, ArrayList<BookMyBorrow> allBook) {
    this.context = context;
    this.allBook = allBook;
    this.inflater = LayoutInflater.from(context);
    } @Override
    public View getView(final int position, View view, ViewGroup parent) {
    // 如果不加这行代码,很容易溢出
    if (view == null) {
    view = inflater.inflate(R.layout.book_my_borrow_item, null);
    }
    if (allBook.isEmpty()) {
    return view;
    }
    final ViewHolder holder = new ViewHolder(); holder.item = (RelativeLayout) view.findViewById(R.id.item);
    holder.number = (TextView) view.findViewById(R.id.number);
    holder.name = (TextView) view.findViewById(R.id.name);
    holder.date = (TextView) view.findViewById(R.id.date);
    holder.renew = (Button) view.findViewById(R.id.renew);
    holder.progress = (ProgressBar) view.findViewById(R.id.progressBar); holder.number.setText(allBook.get(position).getId());
    holder.name.setText(allBook.get(position).getName());
    holder.date.setText(allBook.get(position).getDate()); // 点击列表查看图书的详细信息
    holder.item.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
    lookUpBookDetail(position);
    }
    }); //同学:看这里
    isCanRenew.put(position, allBook.get(position).isRenew());// 保存 //同学:看这里
    if (isCanRenew.get(position) == false) {// 如果不可用
    holder.renew.setVisibility(View.GONE);
    } else {// 如果可以续借
    holder.renew.setVisibility(View.VISIBLE);
    holder.renew.setEnabled(true);
    } holder.renew.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
    String url = VarUtil.URL + "/renew";
    HashMap<String, String> allParams = new HashMap<String, String>();
    allParams.put(ConstantUtil.ACCOUNT, VarUtil.student.getAccount());
    allParams.put(ConstantUtil.PASSWORD, VarUtil.student.getPassword());
    allParams.put(ConstantUtil.BARCODE, allBook.get(position).getBarcode());
    allParams.put(ConstantUtil.DEPARTMENTID, allBook.get(position).getDepartmentId());
    allParams.put(ConstantUtil.LIBRARYID, allBook.get(position).getLibraryId());
    VarUtil.threadPool.submit(new RequestThread(url, new RenewHandler(holder),
    allParams));
    }
    });// if (allBook.get(position).isRenew() == false) {
    // holder.renew.setVisibility(View.GONE);
    // } else {
    // holder.renew.setVisibility(View.VISIBLE);
    // holder.renew.setEnabled(true);
    //
    // holder.renew.setOnClickListener(new OnClickListener() {
    // @Override
    // public void onClick(View v) {
    // String url = VarUtil.URL + "/renew";
    // HashMap<String, String> allParams = new HashMap<String, String>();
    // allParams.put(ConstantUtil.ACCOUNT, VarUtil.student.getAccount());
    // allParams.put(ConstantUtil.PASSWORD, VarUtil.student.getPassword());
    // allParams.put(ConstantUtil.BARCODE, allBook.get(position).getBarcode());
    // allParams.put(ConstantUtil.DEPARTMENTID, allBook.get(position)
    // .getDepartmentId());
    // allParams.put(ConstantUtil.LIBRARYID, allBook.get(position).getLibraryId());
    // VarUtil.threadPool.submit(new RequestThread(url, new RenewHandler(holder),
    // allParams));
    // }
    // });
    // } return view;
    } private void lookUpBookDetail(int position) {
    // 根据参数,请求数据
    String url = ConstantUtil.URL + "/lib/detail.aspx";
    HashMap<String, String> allParams = new HashMap<String, String>();
    allParams.put(ConstantUtil.DETAIL, "true");
    allParams.put(ConstantUtil.BARCODE, allBook.get(position).getBarcode()); BookDetailHandler handler = new BookDetailHandler((Activity) context); VarUtil.threadPool.submit(new RequestThread(url, handler, allParams));
    } private class RenewHandler extends Handler {
    private ViewHolder holder; public RenewHandler(ViewHolder holder) {
    this.holder = holder;
    } @Override
    public void handleMessage(Message msg) {
    switch (msg.what) {
    // 任务开始
    case ConstantUtil.START:
    holder.renew.setVisibility(View.INVISIBLE);
    holder.progress.setVisibility(View.VISIBLE);
    break;
    // 任务结束
    case ConstantUtil.END:
    if (VarUtil.result.equals(ConstantUtil.SUCCESS)) {
    holder.renew.setVisibility(View.GONE);
    holder.progress.setVisibility(View.GONE);
    } else if (VarUtil.result.equals(ConstantUtil.FAIL)) {
    holder.renew.setVisibility(View.VISIBLE);
    holder.progress.setVisibility(View.INVISIBLE);
    ViewUtil.toastShort("续借失败!", (Activity) context);
    }
    break;
    // 任务出错
    case ConstantUtil.INTERNET_ERROR:
    ViewUtil.toastShort("客户端网络异常!请您稍后重试!", (Activity) context);
    break;
    default:
    break;
    }
    }
    } class ViewHolder {
    RelativeLayout item;
    TextView number;
    TextView name;
    TextView date;
    Button renew;
    ProgressBar progress;
    } @Override
    public int getCount() {
    return allBook.size();
    } @Override
    public Object getItem(int arg0) {
    return allBook.get(arg0);
    } @Override
    public long getItemId(int arg0) {
    return arg0;
    }}
      

  20.   

    楼主,你好!我的也出现和你一样的状况。我的代码如下,麻烦帮忙看看哪里出了问题。小的不才,你提供的那段代码,我看不出具体在哪段代码上解决了问题。
    public class ContactInviteAdapter extends BaseAdapter 
    {
        private Context mContext;
        private List<HashMap<String, Object>> contactLists;
        private LayoutInflater inflater;
        private boolean img_Flag = false;
        HashMap<Integer, Boolean> state = new HashMap<Integer, Boolean>(); //主要用来存储position对应的boolean数据
        
        public ContactInviteAdapter(Context context, List<HashMap<String, Object>> contactFriends) 
        {
         mContext = context;
         this.contactLists = contactFriends;
         inflater = LayoutInflater.from(mContext);
         initMap();
        }
        
        private void initMap() 
    {
    for (int i = 0; i < contactLists.size(); i++) 
    {
    state.put(i, false);
    }

    }

    @Override
    public int getCount() 
    {
    return contactLists == null?0:contactLists.size();
    } @Override
    public Object getItem(int arg0) 
    {
    return contactLists == null?0:contactLists.get(arg0);
    } @Override
    public long getItemId(int arg0) 
    {
    return contactLists.indexOf(contactLists.get(arg0));
    } @Override
    public View getView(final int position, View convertView, ViewGroup parent) 
    {
    final ViewHolder holder = new ViewHolder();
            View view = convertView;
    if(view == null) 
    {
    view = inflater.inflate(R.layout.contact_find_all, null);
    }
    else 
    {
    view = convertView;
    }
    holder.imgCheck = (ImageView) view.findViewById(R.id.contact_find_all_edit_id);
    holder.imgHead = (ImageView) view.findViewById(R.id.contact_img_id);
        holder.tvName = (TextView) view.findViewById(R.id.contact_name_id);
        holder.tvNumber = (TextView) view.findViewById(R.id.contact_number_id);
        holder.tvInvite = (TextView) view.findViewById(R.id.contact_inviteby_id);
    holder.imgHead.setBackgroundResource((Integer) contactLists.get(position).get("contactinviteimgHead"));
    holder.tvName.setText(contactLists.get(position).get("contactinvitename").toString());
    holder.tvNumber.setText(contactLists.get(position).get("contactinvitenumber").toString());
    holder.tvInvite.setText(contactLists.get(position).get("contactinviteBy").toString());

    holder.imgCheck.setOnClickListener(new View.OnClickListener() 
    {
    @Override
    public void onClick(View v) 
    {
    if(!state.get(position))
    {
    holder.imgCheck.setImageDrawable(mContext.getResources().getDrawable(R.drawable.invitebuttonbk33));
    } else
    {
    ;
    }
    img_Flag = !state.get(position);
    state.put(position, img_Flag);
    notifyDataSetChanged();
    }

    });
    return view;
    } static class ViewHolder 
    {
    ImageView imgCheck;
    ImageView imgHead;
    TextView tvName;
    TextView tvNumber;
    TextView tvInvite;
    }
    }
      

  21.   

    你那个isRenew()的方法怎么写的啊
      

  22.   


    //不加这段就会出现混乱
    switch(curr.getVisibleState())
    {
    case 1:
    holder.content.setVisibility(View.VISIBLE);
    break;
    case 0:
    holder.content.setVisibility(View.GONE);
    break;
    }

    //监听状态,更新状态码
    trasHolder.arrow_down.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
    // TODO Auto-generated method stub

    if(curr.getVisibleState() == 1){
    curr.setVisibleState(0);
    trasHolder.content.setVisibility(View.GONE);
    }else{
    curr.setVisibleState(1);
    trasHolder.content.setVisibility(View.VISIBLE);
    }

    }
    });