2017-03-15 36 views
0

我有一個自定義適配器,因爲我有兩個Textviews在一行。首先,我只想要左側的TextViews可點擊並禁用右側的點擊事件。禁用ListView項目單擊然後啓用它

layout_list_xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<RelativeLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <TextView style="@style/TextDesign" 
     android:text="TextView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:id="@+id/left" /> 

    <TextView style="@style/TextDesign" 
     android:text="TextView" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentEnd="true" 
     android:id="@+id/right" /> 
</RelativeLayout> 
</LinearLayout> 

自定義適配器:

public class CustomAdapter extends BaseAdapter { 

    Context context; 
    List<Occurence> occurenceList; 
    TextView left, right; 

    public CustomAdapter(Context context, List<Occurence> occurenceList) { 
     this.context = context; 
     this.occurenceList = occurenceList; 
    } 

    @Override 
    public int getCount() { 
     return occurenceList.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return occurenceList.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater=LayoutInflater.from(context); 
     View v=inflater.inflate(R.layout.layout_list,parent,false); 
     left=(TextView) v.findViewById(R.id.left); 
     right=(TextView) v.findViewById(R.id.right); 
     left.setText(occurenceList.get(position).singleNumber); 
     right.setText(occurenceList.get(position).occurence+" occurence"); 
     v.setTag(occurencekList.get(position).getId()); 
     return v; 
    } 



    @Override 
    public boolean areAllItemsEnabled() { 
     return super.areAllItemsEnabled(); 
    } 

    @Override 
    public boolean isEnabled(int position) { 
     return super.isEnabled(position); 
    } 



} 

所以當TextView的用戶點擊我要禁用點擊在列表中的TextView。被點擊的TV的值將作爲SpannableString移動到另一個TextView,我可以在哪裏執行另一個操作。這意味着如果用戶單擊該SpannableString將刪除該SpannableString並重新啓用該ListItem被禁用的點擊操作。

我在下面附上了一張圖片以查看結果。

image

我讀過有關,我應該把一個if語句在適配器類叫的IsEnabled覆蓋方法,但我需要具體的解決方案。

+0

禁用點擊:listview.setOnItemclickListener(NULL); –

+0

但這會禁用整個列表的onclick,不會嗎? 我只想禁用選定的項目並在需要時啓用它。 –

回答

0

直接在TextView上設置ClickListener。由於ClickListener在觸發時獲取單擊的View as參數,所以您可以在發生時禁用偵聽器。

在你getView方法把

left.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     v.setOnClickListener(null); // This disables the click right away 
    } 
}); 
0

您可以點擊監聽器設置你的左邊TextView的,你必須做的事,然後刪除監聽,直到需要。

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    LayoutInflater inflater=LayoutInflater.from(context); 
    View v=inflater.inflate(R.layout.layout_list,parent,false); 
    left=(TextView) v.findViewById(R.id.left); 

    left.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      //In here your data treatment 

      left.setOnClickListener(null); 
     } 
    }); 

    right=(TextView) v.findViewById(R.id.right); 
    left.setText(occurenceList.get(position).singleNumber); 
    right.setText(occurenceList.get(position).occurence+" occurence"); 
    v.setTag(occurencekList.get(position).getId()); 
    return v; 
} 

請記住,如果你使用Java 8,你可以監聽更改爲lambda表達式和節省一些線。

+0

2人,同樣的想法:) – Grisgram

+0

它的工作原理,所以左側是不可點擊我得到了觀後。我將它改爲右側,因爲我想讓右側無法點擊,沒關係我有這個想法。謝謝! 你有什麼解決辦法,我怎麼可以禁用onClickListener或如何設置不可點擊後單擊所選的項目,並能夠設置回聽者或重新設置爲可點擊該TextView的。我希望能夠對同一個物品多次執行此操作。 –

+0

如果可以工作,我不是很爛,但是當你調用notifyDataSetChanded()時,getView()方法會被調用到列表的每一行。這可能會將clickListener設置回來。請確認。 –

0

我解決了如何禁用listItem點擊並在需要時啓用它。 將布爾變量添加到自定義列表中的每個項目,並在適配器類中創建布爾實例。

public class CustomAdapter extends BaseAdapter { 

Context context; 
List<Object> objectList; 
public boolean clicked=false; 

public CustomAdapter(Context context, List<Object> objectList) { 
    this.context = context; 
    this.objectList = objectList; 
} 

@Override 
public int getCount() { 
    return objectList.size(); 
} 

@Override 
public Object getItem(int position) { 
    return objectList.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    //your custom code.... 
    return View; 
} 


@Override 
public boolean areAllItemsEnabled() { 
    return super.areAllItemsEnabled(); 
} 


//this is what you need 
@Override 
public boolean isEnabled(int position) { 
    if(objectList.get(position).yourBoolean()==false){ 
     return false; 
    } 
    if(objectList.get(position).yourBoolean()==true && clicked==true){ 
     return true; 
    } 
    return super.isEnabled(position); 
} 

在你main_activity.java調用你的list.onItemClickListener

list.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
        @Override 
        public void onItemClick(AdapterView<?> parent, final View view, int position, long id) { 

//Then the isEnabled method will return false for this position and 
//this item wont be clickable 
objectList.get(position).setYourBooleanValue(false); 
          customAdapter.setclicked(true); 

} 
       }); 

如果你想重新設置這個位置上點擊,只要將布爾回真,那麼的IsEnabled方法將返回true那個位置。

我希望它對將來的某個人有用。

相關問題