简体   繁体   English

在列表视图行中分别突出显示嵌套的TextView和ImageView

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

(Ok, I've researched a lot and found a few answers but nothing really worked for me.. so I've finally opened an account to post here. Thanks to the community for all your answers earlier!) (好吧,我已经做了很多研究,找到了一些答案,但对我来说并没有什么用。。所以我终于在这里开设了一个帐户。感谢社区早些时候提供的所有答案!)

Context 上下文

I am creating a category selector (ListView with a custom adapter)- each category can have multiple sub-categories and each sub-category can have multiple sub-categories. 我正在创建类别选择器(带有自定义适配器的ListView)-每个类别可以具有多个子类别,每个子类别可以具有多个子类别。 For the selector, I'm using a ListView with a custom List item - TextView (to display category) and an ImageView (the forward arrow) to indicate if the category has sub-categories - see this image: 对于选择器,我使用带有自定义列表项的ListView-TextView(用于显示类别)和ImageView(向前箭头),以指示类别是否具有子类别-请参见此图像:

图片


I want the user to do the following actions 我希望用户执行以下操作
(1) Click on the category name to SELECT that category (1)单击类别名称以选择该类别
(2) Click on the forward arrow to SEE all sub-categories (it will re-populate the ListView with all sub-categories) (2)单击前进箭头以查看所有子类别(它将使用所有子类别重新填充ListView)

Question Starts here 问题从这里开始

I want the user to see the following highlights/focus on the user does the about two actions (1) and (2) 我希望用户看到以下亮点/关注于用户是否执行了两个操作(1)和(2)

Highlight on action (1) 突出行动(1)

See this image: 看到这张图片:

图片


Highlight the row when the user clicks on the category name/row. 当用户单击类别名称/行时,突出显示该行。 This happens automatically because I've setup 这是自动发生的,因为我已经设置

listView.setOnItemClickListener()

Highlight on action (2) 突出动作(2)

See this image: 看到这张图片:

图片


I want the user to see the highlight only on the forward-arrow and not the row. 我希望用户在前向箭头而非行上看到突出显示。 I'm able to register the CLICK on the image with 我可以在图像上注册点击

imageView.setOnClickListener()

in my custom adapter but I'm unable to get the highlight on the forward-arrow 在我的自定义适配器中,但是我无法在前向箭头上突出显示

How do I get this highlight on the ImageView? 如何在ImageView上获得此突出显示?

Code

    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;
}

So here is what I've done. 这就是我所做的。 This should be scalable too. 这也应该是可扩展的。

The CategoryArrayAdapter has the following getView() 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;
    }

Two things that made this work 使这项工作起作用的两件事

  1. imageView.setOnTouchListener() allows me to set the highlight (thanks Piyush Gupta for pointing out the setBackgroundColor() method imageView.setOnTouchListener()允许我设置高光(感谢Piyush Gupta指出setBackgroundColor()方法
  2. imageView.setOnClickListener() allows me to perform the action when the user clicks on arrow 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 ... } }; 

To get the HIGHLIGHT and CLICK to work together, return false in onTouchListener() . 要使HIGHLIGHT和CLICK一起工作,请在onTouchListener() return false This will pass the touch event to the onClickListener() . 这会将touch事件传递给onClickListener() I got this solution from https://stackoverflow.com/a/10376887/3393044 comment by the thin 我得到了这个解决方案https://stackoverflow.com/a/10376887/3393044 通过评论

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM