2009-10-05 44 views
19

Tôi đã triển khai ListView tùy chỉnh bằng cách mở rộng LinearLayout cho mỗi hàng. Mỗi hàng có một hình nhỏ, một văn bản và một số check box. list view được triển khai đúng cách và tôi có thể cuộn và lướt qua nó mà không gặp bất kỳ sự cố nào.setOnItemClickListener() không hoạt động trên ListView tùy chỉnh @ Android

Nhưng ListView dường như không phản hồi với setOnItemClickListener() chút nào, Vì vậy, tôi phải tìm cách giải quyết bằng cách đặt trình nghe nhấp vào getView() của Văn bản bên trong mỗi hàng rõ ràng là tạo ra sự cố khi tôi cố gắng sử dụng lại adapter. Có ai có giải pháp không?

Trả lời

43

Hãy thử
này Đối với ListView,

final ListView list = (ListView) findViewById(R.id.list); 
list.setItemsCanFocus(false); 

Ngoài ra, hãy chắc chắn rằng cho CheckBox bên trong mục danh sách thiết đặt tiêu điểm sai

android:focusable="false" 
android:focusableInTouchMode="false" 
+0

Tôi đang gặp cùng một vấn đề, giải pháp trên làm cho việc phát hiện các nhấp chuột trên hàng nhưng tôi có 2 nút ở hàng tùy chỉnh ListView của tôi. Làm cách nào tôi có thể cho biết nút nào đã được nhấp? Cảm ơn – longhairedsi

+0

cảm ơn bạn !!! bạn thực sự đã giúp tôi !!! –

+1

@longhairedsi: vui lòng thêm mã sau vào phương thức getView() button1.setFocusable (false); button2.setFocusable (false); button1.setFocusableInTouchMode (false); button2.setFocusableInTouchMode (sai); button1.setOnClickListener (điều này); button2.setOnClickListener (điều này); triển khai trình nghe nhấp chuột của bạn cho nút trong bộ điều hợp (hoặc nơi bạn muốn ....) đặt trình nghe nhấp chuột cho chế độ xem danh sách cũng ..... bây giờ kiểm tra nhấp chuột của bạn sẽ hoạt động cho cả ..... listview đối với các nút cũng là –

0

Bạn đã tạo bất kỳ ViewHolder nào trong lớp bộ điều hợp mở rộng của mình chưa? Nếu có, sau đó tạo một thể hiện của trình giữ chỗ đó trong setOnItemClickListener(), một cái gì đó sẽ có thể hoạt động như thế này.

@Override 
    protected void onListItemClick(ListView l, View v, int position, long id) {   
     View rowView = v; 
     if (rowView == null) { 
      LayoutInflater inflater = this.getLayoutInflater(); 
       // GET INFLATE OF YOUR LAYOUT. 
      rowView = inflater.inflate(R.layout.projectpeopledescrate, null); 
      // CUSTOM ViewHolder Class Created in Adapter. 
// name,title,comment are my components on the same listview clicked item. 
      PPDViewHolder viewHolder = new PPDViewHolder(); 
      viewHolder.name  = (TextView) rowView.findViewById(R.id.ppeopledescrvname); 
      viewHolder.title = (TextView) rowView.findViewById(R.id.ppeopledescrvtime); 
      viewHolder.comment = (TextView) rowView.findViewById(R.id.ppeoplervcomment); 
      viewHolder.hiddenLayout = (RelativeLayout) rowView.findViewById(R.id.hiddenCommentPanel); 
      rowView.setTag(viewHolder); 
     } 
      // ANOTHER object instance to apply new changes. 
     PPDViewHolder holder = (PPDViewHolder) rowView.getTag(); 
// I've setted up visibility over the components. You can set your onClickListener over your buttons. 
     holder.comment.setVisibility(View.GONE); 
     holder.name.setVisibility(View.GONE); 
     holder.title.setVisibility(View.GONE); 
     holder.hiddenLayout.setVisibility(View.VISIBLE); 
     holder.hiddenLayout.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.MATCH_PARENT)); 
     holder.hiddenLayout.bringToFront(); 

    } 

Hy vọng, bạn muốn điều gì đó tương tự. Chúc may mắn!

11

câu trả lời cũ: tôi đã viết trong previous post here

android:focusable="false" 
android:clickable="false" 

sẽ không giúp đỡ khi ImageButton là theo quan điểm tùy chỉnh .. Người ta phải sử dụng button.setFocusable(false); trong thời gian chạy (từ mã nguồn java)

Chỉnh sửa: Thậm chí còn có nhiều giải pháp thanh lịch hơn. Hãy thử thêm android:descendantFocusability="blocksDescendants" trong bố cục gốc của phần tử danh sách. Điều đó sẽ làm cho nhấp chuột onListItem thể và riêng biệt u có thể xử lý nút hoặc nhấp chuột ImageButton

0

tôi có mã này

this.mListView.setOnItemClickListener(new OnItemClickListener() { 

      @Override 
      public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
       Log.v(TAG,"loul"); 
      } 
     }); 

Nhưng nó đã không làm việc

Vì vậy, tôi đã Juste đặt một onItemSelectedListener dưới và nó Oo làm việc:

this.mListView.setItemsCanFocus(false); 
this.mListView.setOnItemClickListener(new OnItemClickListener() { 

    @Override 
    public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) { 
     Log.v(TAG,"loul"); 
    } 
}); 
//listener for nothing but it allow OnItemClickListener to work 
this.mListView.setOnItemSelectedListener(new OnItemSelectedListener() { 

    @Override 
    public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 

    } 

    @Override 
    public void onNothingSelected(AdapterView<?> arg0) { 

    } 
}); 
0

Đặt các thuộc tính:

android:focusable="false" 
android:focusableInTouchMode="false" 

cho tất cả các thành phần giao diện người dùng trong tệp list_item.xml của bạn.

nếu điều này không được giải quyết trong bộ adapter của bạn:

v.imageView.setFocusable(false); 
    v.imageView.setFocusableInTouchMode(false); 
Các vấn đề liên quan