如何使用在列表项单击时动态生成的文本视图标签突出显示我在列表视图中的当前位置

Posted

技术标签:

【中文标题】如何使用在列表项单击时动态生成的文本视图标签突出显示我在列表视图中的当前位置【英文标题】:How to highlight my current position in list-view using text-view tags generated dynamically on list-item click 【发布时间】:2018-08-18 17:34:52 【问题描述】:

我的活动流程是这样的。

**Main ListView**--- list item click

 SubListview- Listitem_1          (parent name-Group)
           Listitem_2

 childListview         Onclick Listitem_1 or 2:     
                             New ListView-new_list_item_1    (parent name-Party)
                                         -new_list_item_2

 grandchildlistview         Onclick new_list_item_1 or 2: 
                   Generate Final-List_view having n elements (parent name-Party name)

现在我采用了线性布局,它将位于工具栏下方的列表视图上方。

我创建了一个 headerTextviewpath 方法,该方法将从 Listitem_1 或 2 的项目点击触发并生成动态文本视图。

在此方法中,textview 将设置为单击的项目父名称的文本

我生成的线性布局如下所示

群组 > 派对 > 派对名称

现在我已经完成了这一切,并且还为动态生成的文本视图分配了颜色。

目标::我想以不同的颜色突出显示线性布局中最后选择的父名称,然后像这样在线性布局中突出显示其他文本视图

SubListview>(在主列表项上单击)

SubListview> childListview>(Onclick Listitem_1 或 2)

SubListview> childListview> grandchildlistview(点击 new_list_item_1 或 2)

注意:我将父名称作为标签添加到 textview 中,并将其存储在 arraylist 中,即 tag_list

动态Textview生成代码:::::

方法是这样调用的:

ArrayList tag_list=new ArrayList;

headerTextviewpath(listitem_seleted_name, functionName, true);

headerTextviewpath

    public void headerTextviewpath(final String listitem_selected, String parent_name, boolean b) 
    if (b) 
            linearLayout.removeAllViews();
        
        final TextView tv = new TextView(this);
        tv.setLayoutParams(new 
        LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
                LinearLayout.LayoutParams.WRAP_CONTENT));

        //tv.setBackgroundResource(R.drawable.button_design);
        tv.setBackgroundColor(getResources().getColor(R.color.DateTheme));
        tv.setText(listitem_selected);

        Drawable next = getResources().getDrawable(R.drawable.ic_keyboard_arrow_right);
        DrawableCompat.setTint(next, ContextCompat.getColor(this, R.color.colorPos6));
        tv.setCompoundDrawablesWithIntrinsicBounds(null, null, next, null);
        tv.setTag(parnet_name);
        tv.setTextColor(getResources().getColor(R.color.colorPos3));
        tag_list.add(parnet_name);

        tv.setPadding(8, 8, 8, 8);

        linearLayout.addView(tv);

       ///using this i am getting current tag of current textview
        int childCount = linearLayout.getChildCount();
        String currentModule = tag.get(childCount - 1);


如何为上述要求制定逻辑,请帮忙。

【问题讨论】:

【参考方案1】:

首先,当我传递数组列表中的值并发送一个标志时,所有注释到我当前的函数名称与添加到数组列表中的函数名称匹配的条件因此,我在下面的方法中为它创建了一个简单的函数。

public void headerTextviewpath(final String displayText, String functionCall, boolean b) 

        if (b) 
            linearLayout.removeAllViews();
        
        linearLayout.setVisibility(View.VISIBLE);
        TextView tv = new TextView(this);
        tv.setFocusable(true);
        tv.setFocusableInTouchMode(true);
        tv.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
                LinearLayout.LayoutParams.WRAP_CONTENT));

        //tv.setBackgroundResource(R.drawable.button_design);
        tv.setBackgroundColor(getResources().getColor(R.color.DateTheme));
        tv.setText(Fromhtml.getText(displayText));

        Drawable next = getResources().getDrawable(R.drawable.ic_keyboard_arrow_right);
        DrawableCompat.setTint(next, ContextCompat.getColor(this, R.color.colorPos6));
        tv.setCompoundDrawablesWithIntrinsicBounds(null, null, next, null);
        tv.setTag(functionCall);
        tv.setTextColor(getResources().getColor(R.color.colorPos3));
        tag.add(functionCall);

        tv.setPadding(8, 8, 8, 8);

        linearLayout.addView(tv);


        int childCount = linearLayout.getChildCount();


        Object tagObj = linearLayout.getChildAt(0).getTag();
        Log.e("TagObj", "==>" + tagObj.toString() + childCount);

        final String currentModule = tag.get(childCount - 1);
        //  Log.e("TagObjCurr","==>"+currentModule+" "+functionName);
        for (int i = 0; i < tag.size(); i++) 

            Log.e("MoudelFound==>" + i, "tag.get(i):" + tag.get(i) + "  currentModule:" + currentModule);

            if (tag.get(i).equals(currentModule)) 
                tv = linearLayout.findViewWithTag(currentModule);
                tv.setTextColor(getResources().getColor(R.color.colorPos3));
                tv.requestFocus();

             else 

                tv = linearLayout.findViewWithTag(tag.get(i));
                tv.setTextColor(getResources().getColor(R.color.colorAccent));

            
        
 

最后它工作正常并显示正确的路径,您还可以显示颜色代码以确定差异。

【讨论】:

以上是关于如何使用在列表项单击时动态生成的文本视图标签突出显示我在列表视图中的当前位置的主要内容,如果未能解决你的问题,请参考以下文章

如何在单击另一个视图(即按钮)时突出显示自定义列表视图

如何选择/突出显示列表视图中的项目而不触摸它?

如何将消息映射添加到 MFC 中的动态菜单项

如何在列表视图项中显示和隐藏视图?

单击时如何使列表视图导航到另一个页面

如何在单击 oracle apex 中的每个列表视图项时显示动态模型内容?