2012-03-01 21 views
8

Đây là một theo dõi để question này, nơi Reimar Twelker đề nghị sử dụng View.setFocusable()View.setClickable() để bật/hàng vô hiệu hóa trong một cái nhìn danh sách sử dụng một ArrayAdapter.View.setFocusable() và View.setClickable() có hiệu lực thi hành trái trong tùy chỉnh ArrayAdapter

Tôi đã thử làm điều này, nhưng tôi nhận được hiệu ứng ngược lại với những gì tôi mong đợi. Nếu tôi sử dụng

View.setFocusable(true); 
View.setClickable(true); 

hàng bị tắt (không có tác dụng khi tôi nhấn vào). Và nếu tôi sử dụng đối diện:

View.setFocusable(false); 
View.setClickable(false); 

hàng được bật (chọn được áp dụng khi tôi nhấn vào).

Bất kỳ đầu mối nào về những gì có thể xảy ra?

Dưới đây là nội dung của cách bố trí của tôi:

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/row_style" 
    android:layout_width="fill_parent" 
    android:layout_height="?android:attr/listPreferredItemHeight" 
    android:paddingLeft="5dip" 
    android:paddingRight="5dip"> 

    <ImageView android:id="@+id/row_image_style" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:adjustViewBounds="false" 
    android:scaleType="centerCrop" 
    android:drawingCacheQuality="low" /> 
</FrameLayout> 

tôi sử dụng nó trong một hộp thoại cảnh báo như thế này:

dialog = new AlertDialog.Builder(this) 
      .setTitle(R.string.templates_dialog) 
      .setAdapter(new StyleAdapter(this, R.id.row_style, StyleTemplate.values()), 
       new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         setTemplate(StyleTemplate.values()[which]); 
        } 
       }) 
      .create(); 
      dialog.setCanceledOnTouchOutside(true); 

StyleAdapter được định nghĩa như sau:

public class StyleAdapter extends ArrayAdapter<StyleTemplate>{ 

     private final StyleTemplate[] m_objects; 
     private final LayoutInflater inflater; 

     public StyleAdapter(Context context, int textViewResourceId, StyleTemplate[] objects) { 
      super(context, textViewResourceId, objects); 
      m_objects = objects; 
      inflater = getLayoutInflater(); 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      View row = convertView; 
      if (row == null) { // Reuse the old view if it exists 
       row = inflater.inflate(R.layout.row_style, parent, false); 
      } 

      // Get the selected style data 
      StyleTemplate style = m_objects[position]; 

      // Set the background image to the template background 
      ImageView bg = (ImageView) row.findViewById(R.id.row_image_style); 
      bg.setImageDrawable(null); 
      bg.setBackgroundColor(Color.rgb(style.bR, style.bG, style.bB)); 

      boolean val = true; 
      row.setFocusable(val); 
      row.setClickable(val); 

      return row; 
     } 
    } 

Để kiểm tra hiệu ứng của setFocusable()setClickable(), tôi chỉ cần thay đổi val ue của val trong StyleAdapter.getView().

+0

Điều tồi tệ nhất là, ngay cả khi bạn vô hiệu hóa nó, nó chỉ giảm đi, nhưng tiếp tục làm việc và nắm bắt các sự kiện. – Gangnus

+0

Tôi thực sự quan tâm đến điều này, vì tôi đang cố gắng vô hiệu hóa bộ chọn trên một listItem. Là gọi setClickable (true) (như trái ngược với setClickable (false)) trên mục đó là lựa chọn duy nhất hoặc có những cách khác thực sự? – doplumi

+0

@domenicop Bạn cũng có thể muốn thử ghi đè isEnabled (int position) cho ArrayAdapter của bạn và trả về false cho các mục bị vô hiệu hóa. Tôi không thể nhớ tại sao tôi không muốn đi theo cách đó, nhưng nó có thể làm việc cho bạn. – Pooks

Trả lời

2

Thực ra here Tôi đã tìm thấy giải thích về tất cả. Vấn đề là nếu bạn đặt chế độ xem là có thể nhấp, thì nó sẽ tiêu thụ nhấp chuột và không truyền đến vùng chứa.

Do đó convertView.setClickable(true) thực sự vô hiệu hóa các nhấp chuột.

Các vấn đề liên quan