簡體   English   中英

在列表視圖行中分別突出顯示嵌套的TextView和ImageView

[英]Separately highlight nested TextView and ImageView in ListView row

(好吧,我已經做了很多研究,找到了一些答案,但對我來說並沒有什么用。。所以我終於在這里開設了一個帳戶。感謝社區早些時候提供的所有答案!)

上下文

我正在創建類別選擇器(帶有自定義適配器的ListView)-每個類別可以具有多個子類別,每個子類別可以具有多個子類別。 對於選擇器,我使用帶有自定義列表項的ListView-TextView(用於顯示類別)和ImageView(向前箭頭),以指示類別是否具有子類別-請參見此圖像:

圖片


我希望用戶執行以下操作
(1)單擊類別名稱以選擇該類別
(2)單擊前進箭頭以查看所有子類別(它將使用所有子類別重新填充ListView)

問題從這里開始

我希望用戶看到以下亮點/關注於用戶是否執行了兩個操作(1)和(2)

突出行動(1)

看到這張圖片:

圖片


當用戶單擊類別名稱/行時,突出顯示該行。 這是自動發生的,因為我已經設置

listView.setOnItemClickListener()

突出動作(2)

看到這張圖片:

圖片


我希望用戶在前向箭頭而非行上看到突出顯示。 我可以在圖像上注冊點擊

imageView.setOnClickListener()

在我的自定義適配器中,但是我無法在前向箭頭上突出顯示

如何在ImageView上獲得此突出顯示?

    Activity's onCreate() {
      LayoutInflater inflater = getActivity().getLayoutInflater();
      View categorySelectView = inflater.inflate(R.layout.cat_select, null);
      LinearLayout categorySelectLayout = (LinearLayout) categorySelectView;
      ListView categoryListView = (ListView) categorySelectLayout.findViewById(R.id.list_cat_select);
      CategoryArrayAdapter categoryArrayAdapter = new CategoryArrayAdapter(this.getActivity(), CategoryAdapter.getAllCategories());
      categoryListView.setAdapter(categoryArrayAdapter);
      categoryListView.setOnItemClickListener(categorySelectClickHandler);
    }

CategoryARrayAdapter's getView(int position, View covertView, ViewGroup parent) {
    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View rowView = inflater.inflate(R.layout.cat_item, parent, false);

    TextView textView = (TextView) rowView.findViewById(R.id.cat_name);
    Category catToDisplay = categories.get(position);
    textView.setText(catToDisplay.getName());

    if(catToDisplay.isParent()) {
        ImageView imageView = (ImageView) rowView.findViewById(R.id.cstrow_cat_expand);
        imageView.setImageResource(R.drawable.cat_expand);
        imageView.setOnClickListener(categoryExpandClickHandler);
        imageView.setFocusable(false); // to make sure the highlight on row shows
        imageView.setFocusableInTouchMode(false); // to make sure the highlight on row shows
    }

    return rowView;
}

這就是我所做的。 這也應該是可擴展的。

CategoryArrayAdapter具有以下getView()

    public View getView(int position, View covertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View rowView = inflater.inflate(R.layout.cat_select, parent, false);

        TextView textView = (TextView) rowView.findViewById(R.id.cat_name);
        Category catToDisplay = categories.get(position);
        textView.setText(catToDisplay.getName());

        if(catToDisplay.isParent()) {
            ImageView imageView = (ImageView) rowView.findViewById(R.id.cstrow_cat_expand);
            imageView.setImageResource(R.drawable.cat_expand);
            imageView.setOnClickListener(categoryExpandClickHandler);
            imageView.setOnTouchListener(categoryExpandTouchHandler);
            imageView.setFocusable(false); // to make sure the highlight on the item shows
            imageView.setFocusableInTouchMode(false); // to make sure the highlight on the item shows
            imageView.setTag(catToDisplay);
        }

        return rowView;
    }

使這項工作起作用的兩件事

  1. imageView.setOnTouchListener()允許我設置高光(感謝Piyush Gupta指出setBackgroundColor()方法
  2. imageView.setOnClickListener()允許我在用戶單擊箭頭時執行操作

     /** * This method listens to the TOUCH CLICK on the IMAGEVIEW to give it button like feeling */ private View.OnTouchListener categoryExpandTouchHandler = new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch(event.getAction()) { case MotionEvent.ACTION_DOWN: { v.setBackgroundColor(getContext().getResources().getColor(R.color.highlight_cat_expand)); break; } case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_UP: { v.setBackgroundColor(getContext().getResources().getColor(android.R.color.transparent)); break; } } return false; } }; /** * This method listens to EXPAND IMAGEVIEW CLICK in the LISTVIEW of categories */ private View.OnClickListener categoryExpandClickHandler = new View.OnClickListener() { @Override public void onClick(View view) { // Expanding this category ... expand code here ... } }; 

要使HIGHLIGHT和CLICK一起工作,請在onTouchListener() return false 這會將touch事件傳遞給onClickListener() 我得到了這個解決方案https://stackoverflow.com/a/10376887/3393044 通過評論

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM