【问题标题】:setOnItemClickListener in ListView affecting multiple rowsListView 中的 setOnItemClickListener 影响多行
【发布时间】:2013-08-23 22:47:08
【问题描述】:

我有一个自定义列表视图和一个自定义适配器。 单击此列表视图的一行时,TextView 的文本设置为白色,该行的背景设置为黑色。

一切都很好,但是当单击一行时,其他行的背景颜色也设置为黑色,上下滚动时一切都会混乱。

自定义适配器中的getView()

public View getView(final int position, View convertView, ViewGroup parent) {  
    final ListItem holder;
    View vi=convertView;

    if(vi==null){
        vi = inflater.inflate(R.layout.list, null);
        holder = new ListItem();
        holder.nametext= (TextView) vi.findViewById(R.id.name);
        vi.setTag(holder);

    }else{
        holder = (ListItem) vi.getTag();
    }

    holder.nametext.setText(""+item.name);
    return vi;
}

在主要活动中:

CustomAdapter listadapter = new CustomAdapter(context, R.layout.list, items);
list.setAdapter(listadapter);

    list.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> adapter, View view, int position, long arg){
               TextView v = (TextView) view.findViewById(R.id.name);
               view.setBackgroundColor(Color.BLACK);
               v.setTextColor(Color.WHITE);
        }

    });

我尝试在 getView() 中放入 setOnItemClickListener,但也没有运气..

有什么帮助吗?谢谢。

【问题讨论】:

    标签: android listview view textview onclicklistener


    【解决方案1】:

    自定义列表视图仅为显示行“创建”一个视图,当向下滚动时,下一个显示行将像第一个一样受到影响..

    为防止出现此问题,您需要在 ListItem Clicked 中创建一个布尔字段;

    然后当点击视图时,item.Clicked 被设置为 true 其中 getView()

    final ListItem item = items.get(position);   
    

    List<ListItem> items;
    

    作为适配器的变量

    实施:

    您需要在 getView() 中设置 setOnClickListener,如下所示

    vi.setOnClickListener(new OnClickListener(){
    
            @Override
            public void onClick(View arg1) {
    
                if(previousView!=null){
                    ListItem previousItem = items.get(previousPosition);
                    previousItem.Clicked = false;
                }
    
                item.Clicked = true;
                previousView = arg1;
                previousPosition = position;
                notifyDataSetChanged();
            }
    
        });
    
    
    
        if(!item.isClicked){
            holder.nametext.setTextColor(Color.BLACK);
            vi.setBackgroundColor(Color.WHITE);
        }else{
            holder.nametext.setTextColor(Color.WHITE);
            vi.setBackgroundColor(Color.BLACK);
        }
    
    });
    

    【讨论】:

    • @Chris: vi.setOnClickListenervi.setOnItemClickListener?
    • @LuisA.Florit vi.setOnItemClickListener 当然 :)
    【解决方案2】:

    这是列表视图缓存颜色提示的默认效果,您可以通过像这样将 "android:cacheColorHint" 属性设置为 @null 来避免

    <ListView
            android:id="@+id/lstEventComment"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"      
            android:cacheColorHint="@null"
    />
    

    【讨论】:

    • 我不认为我的问题是因为 xml.. 我尝试了所有可能的方法来从 xml 修复它(删除所有项目的可聚焦和可点击+您的建议)但它没有工作..
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-17
    • 1970-01-01
    相关资源
    最近更新 更多