当前位置: 首页 > 知识库问答 >
问题:

根据最终列表项错误修改了listview中的按钮

呼延才俊
2023-03-14

我正在制作一个有三个选项卡的应用程序(类似于WhatsApp布局)。三个选项卡是朋友、家人和联系人。每个选项卡中都有一个列表。每个列表项还具有以下视图:名称位于左侧,名称下面的描述和一个按钮,该按钮具有背景,位于名称的同一行。(我以前发布过这个,但现在重新发布了这个,因为我已经能够找出主要的错误并减少我需要放在这里的代码)

每个listview项包含一个类(朋友、家庭、联系人)。这三个类都有一个标志(canViewYouOnlineFlag)。如果此标志设置为true,则相应的联系人、家人或朋友将知道您在线,反之亦然。如果将标志设置为true,则按钮的颜色必须为蓝色;如果将标志设置为false,则按钮的颜色必须为黑色。

listview中的3个项(每个项都有一个对象和这三个项的CanViewYouOnlineflags)如下:listview item 1:true、listview item 2:false、listview item 3:false。

呈现时,列表视图项的按钮颜色必须为蓝色、黑色、黑色。然而,原来全是黑色的。

类似地,如果listview item 3的对象标志设置为“true”,那么所有按钮都是蓝色的。基本上,按钮的颜色是由上一个Listview项中的对象决定的。listview项中包含的对象的实际标志不是问题所在,我也验证了这一点(即object标志为true,但button仍然呈现黑色,因为最后一个listview项的按钮为黑色)。请帮我解决这个问题。以下是main_lp_view_item布局的xml文件:

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

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="10dp"
    android:id="@+id/main_lp_text"
    android:textSize="18sp"
    android:textColor="@color/colorPrimaryDark"
    android:focusable="false" />

<TextView
    android:id="@+id/main_lp_subtitle"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/main_lp_text"
    android:textSize="13sp"
    android:focusable="false" />

<Button
    android:id="@+id/can_view_you_online"
    android:layout_width="33sp"
    android:layout_height="29sp"
    android:layout_above="@+id/main_lp_subtitle"
    android:layout_marginTop="10dp"
    android:textStyle="bold"
    android:background="@drawable/lp_list_button"
    android:layout_alignParentEnd="true"
    android:focusable="false"
    />

</RelativeLayout>
public class LPListItemAdapter<T> extends BaseAdapter{  //Class for rendering each ListItem

Context context;
List<T> rowItems;

public LPListItemAdapter(Context context, List<T> rowItems)
{
    this.context=context;
    this.rowItems=rowItems;

}

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

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

@Override
public long getItemId(int position)
{
    return rowItems.indexOf(getItem(position));
}


private class ViewHolder{
    TextView main_text; //Display Name
    TextView subtitle;  //Display Description
    Button can_view_you_online;   //Button to set and display status of CanViewYouOnline flag of the class

}

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
    ViewHolder holder=null;


    LayoutInflater mInflater= (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

    holder = new ViewHolder();



    if(convertView==null)
    {
        convertView=mInflater.inflate(R.layout.main_lp_view_item, null);

        holder.main_text= (TextView) convertView.findViewById(R.id.main_lp_text);
        holder.subtitle= (TextView) convertView.findViewById(R.id.main_lp_subtitle);
        holder.canViewYouOnline= (Button) convertView.findViewById(R.id.can_view_you_online);

        convertView.setTag(holder);

    }
    else{
        holder = (ViewHolder) convertView.getTag();
    }


    final T rowItem= rowItems.get(position);

    String main_text;
    String subtitle;

    if(rowItem instanceof Friends)    //If Row Item is a Friend class
    {
        main_text= ((Friends) rowItem).getName();
        subtitle=  ((Friends) rowItem).getDescription();
    }
    else if(rowItem instanceof Family)  //If Row Item is a Family class
    {
        main_text= ((Family) rowItem).getName();
        subtitle= ((Family) rowItem).getDescription();
    }
    else if(rowItem instanceof Contact) //If Row Item is a Contact class
    {
        main_text=((Contact) rowItem).getName();
        subtitle=((Contact) rowItem).getDescription();
    }
    else
    {
        main_text="NA";
        subtitle="";
    }

    holder.main_text.setText(main_text);
    holder.subtitle.setText(subtitle);

    if(getflagstatus(rowItem))              //If rowItem's canViewYouOnline flag is set true, then let color of button be default (i.e. blue)
        holder.canViewYouOnline.getBackground().clearColorFilter(); 
    else                                        //Else (if it false), make it black
        holder.canViewYouOnline.getBackground().setColorFilter(Color.argb(255, 0, 0, 0), PorterDuff.Mode.SRC_ATOP);     

//This part of the function is the problem because the color filter of the drawable of the button in the current list item gets overriden when
//this same code is executed for the next listview item.


    holder.canViewYouOnline.setOnClickListener(new View.OnClickListener() {
        boolean buttonClickFlag;



        @Override
        public void onClick(View v) {           //The Onclick function allows one to click the button on the list item and set/reset the canViewYouOnline flag. It is working fine. 
            buttonClickFlag=getflagstatus(rowItem);       //get buttonClickFlag from canViewYouOnline flag status
            if(buttonClickFlag==false)          //If buttonClickFlag is false
            {
                v.getBackground().clearColorFilter();   //set color of button drawable to default (which is blue)
                buttonClickFlag=true;           //set buttonClickflag to true

            }
            else    //if buttonClickFlag is true
            {

                v.getBackground().setColorFilter(Color.argb(255,0,0,0), PorterDuff.Mode.SRC_ATOP);  //set color of button drawable to black
                buttonClickFlag=false;          //set buttonClickflag to false

            }
    //update the canViewYouOnline flag in the rowItem by calling the onlineStatusUpdateButtonOnClickActivity function. 
    //Function is working perfectly so is not included in the stack overflow entry due to space constraints

            onlineStatusUpdateButtonOnClickActivity(rowItem, buttonClickFlag,v); 

        }
    });



return convertView;

}


public boolean getflagstatus(T rowItem)
{
    //Function to get the CanViewYouOnlineFlag() from the underlying class in the rowItem

    boolean flagStatus=false;
    if(rowItem instanceof Friends)      
        flagStatus=((Friends) rowItem).getCanViewYouOnlineFlag();   
    else if(rowItem instanceof  Family)
        flagStatus=((Family) rowItem).getCanViewYouOnlineFlag();
    else if(rowItem instanceof Contact)
        flagStatus= ((Contact) rowItem).getCanViewYouOnlineFlag();

    return flagStatus;
}
public void onlineStatusUpdateButtonOnClickActivity(T rowItem, boolean mLBflag, View convertView)   {//WORKS FINE SO NOT PUTTING IT HERE DUE TO SPACE CONSTRAINT}

}

共有1个答案

万俟震博
2023-03-14

我得到答案了。如果您使用单个可提取的资源,并且仅在标记更改时更改颜色,就会出现此错误。相反,使用两个drawable,当CanViewYouOnline为true时,将button的背景设置为drawable1,当CanViewYouOnline为false,将button的背景设置为drawable2。

 类似资料:
  • 问题内容: 让我们从一个简单的测试用例开始: 任何人都在乎猜测什么将作为输出打印(在底部显示,以免立即破坏惊喜)。 问题是: 为什么原始和包装的整数表现不同? 为什么反射访问与直接访问返回不同的结果? 最困扰我的人-为什么String表现得像原始的而不是像? 结果(java 1.5): 问题答案: 内联编译时常量(在javac编译时)。参见JLS,尤其是15.28定义了常量表达式,而13.4.9讨

  • 问题内容: 我正在尝试使用for循环修改列表中的项目,但出现错误(请参见下文)。样例代码: 错误: 有什么办法解决这个问题? 问题答案: 尝试以下方法: 您遇到的基本问题是,当你写的,有是一个列表,则需要是一个整数,数字索引列表。但是在循环中 是列表中的实际事物,即字符串,而不是事物的数字索引。是一个迭代器,它生成数字而不是列表中的值,因此您可以使用它。 一个替代方案是 该函数为您提供了一个在表单

  • “我的列表视图”项包含一个“删除”按钮,我在适配器中将其设置为从数据库中删除该项。完成后,如何刷新包含listView的片段以删除该项?相关代码如下: 删除适配器中的项功能: listview在我的片段中是这样设置的: 谢谢 更新: 现在我已经将子项目上的OnClickListener从适配器传递到片段ListView OnItemClickListener,如下所示: 更新适配器 更新片段 但现

  • 问题内容: 我刚刚开始使用Java中的列表。我想知道推荐的修改列表中每个元素的方法是什么? 我已经可以通过以下两种方法来完成此任务,但是它们看起来都相当简单。有没有更好的方法可以在Java中完成此操作?是否推荐以下任何一种方法,或者两者都处于同一水平? 问题答案: 第二个版本会更好。在内部,它们最后是相同的,但是第二个实际上允许您修改列表,而第一个将引发ConcurrentModification

  • 本文向大家介绍Android中实现长按修改ListView对象的内容,包括了Android中实现长按修改ListView对象的内容的使用技巧和注意事项,需要的朋友参考一下 实现的效果如下: 我在ListView的Item长按事件内打开一个弹出窗口,窗口内有一个EditText对象,在这个编辑框内输入文本点确定后,直接修改掉ListView对象内某个TextView对象的内容。 示例代码如下: 总结

  • 问题内容: 我有一个列表列表,看起来像: 有大约30,000个内部清单。我想做的是根据每个内部列表的第4个项目消除重复项。因此,上面的列表列表如下所示: 这是我到目前为止的内容: 我认为这应该可行,但它会不断运行。我让它运行30分钟,然后将其杀死。我认为程序不需要花那么长时间,所以我猜我的逻辑有问题。 我觉得创建一个全新的列表列表非常愚蠢。任何帮助将不胜感激,请随时随地学习。如果不正确,请更正我的