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

Posted

技术标签:

【中文标题】如何在单击另一个视图(即按钮)时突出显示自定义列表视图【英文标题】:how to highlight a custom list view on clicking of another view i.e Button 【发布时间】:2013-02-18 10:15:06 【问题描述】:

我正在显示一个 自定义列表视图,我想从另一个按钮遍历列表,一个用于向下列表,一个用于向上列表,所以在这里我可以获得当前选定的项目位置所以我正在使用-

list.setSelection(newpostion);

但我无法看到给定位置的亮点。在这里,list 正在被正确遍历,但用户无法看到他当前位于哪个列表项上。所以请告诉我如何突出显示或更改特定列表项的背景。

我尝试使用 selector 就像状态更改背景一样,但即不适合我。请提供任何可行的解决方案。

这是列表适配器的代码-

package com.sho;

import java.util.ArrayList;
import java.util.HashMap;
import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageButton;
import android.widget.TextView;

public class list_adapter extends ArrayAdapter<HashMap<String,String>>

ArrayList<HashMap<String,String>> items;
LayoutInflater mInflater ; 
Context context;
int layoutResourceId; 

public list_adapter(Context context, int layoutResourceId, ArrayList<HashMap<String, String>> _list) 

        super(context, layoutResourceId, _list);
        this.layoutResourceId=layoutResourceId;
        this.items = _list;
        this.context=context;


@Override
public View getView(int position, View convertView, ViewGroup parent) 

            View row = convertView;
            ViewHolder holder = new ViewHolder();
            if(row==null)
            
                mInflater = ((Activity)context).getLayoutInflater();
                row = mInflater.inflate(R.layout.chapterdetails, parent, false);
                holder.name = (TextView) row.findViewById(R.id.chapterdata);


            

            else
            
                holder=(ViewHolder)row.getTag();

            

            row.setTag(holder);
            row.setId(position);

       HashMap<String,String>  map=items.get(position);
       holder.name.setText(map.get("DESCRIPTION"));
        return row;


static class ViewHolder

    TextView name;
    ImageButton annotion,bookmark,edit;



我想要遍历列表的按钮的代码,这里的列表名称是 ls-

View earliest=new View(MainActivity.this);

                if(postion<a1&&postion<=a1-2) 
                
                     postion++;
                     earliest=ls.getRootView().findViewById(postion);
                        earliest.setBackground(null);




                     View v=new View(MainActivity.this); 
                    v=ls.getRootView().findViewById(postion); 
                    v.setBackgroundColor(Color.RED);
                    previous.setBackgroundColor(Color.BLUE); // your list
                    previous=v;
                       ); 

【问题讨论】:

您是否可以通过单击手动关注列表项?这可能表明列表项不可聚焦。 是的,如果我点击它,选定的背景会出现在该特定项目上 【参考方案1】:

编辑: 设置后list.setSelection(newpostion);

像这样得到那个视图

View v=list.getSelectedView();

然后同样的逻辑如下

你的代码是这样的

创建一个全局变量

View previous;

在 onCreate 中初始化它

previous=new View(this);



 traverse_listdown.setOnClickListener(new OnClickListener() 
 @Override 
public void onClick(View v)  
// TODO Auto-generated method stub 
System.out.println("down"); 
int a1=list.getCount();

if(postion<a1&&postion<=a1-2) 
 postion++; list.setSelection(postion);
 View v1=new View(MainActivity.this); 
v1=list.getSelectedView(); 
v1.setBackgroundColor(Color.RED);
previous.setBackgroundColor(Color.WHITE); // your list
previous=v1;
   ); 

试试这个,

像这样创建一个可绘制的选择器

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/pause_button"
          android:state_selected="true" />
    <item android:drawable="@drawable/play_button" />
</selector>

您可以指定您选择的颜色或可绘制对象。

像这样创建全局变量

View previous;

初始化

previious=new View(context);

当你的列表项被点击时,像这样使用

yourlist.setOnItemClickListener(new OnItemClickListener() 
            @Override
        public void onItemClick(AdapterView<?> arg0, View view, int arg2,long arg3) 
        previous.setSelected(false);                        
        view.setSelected(true);
        previous=view;


);

【讨论】:

但是如何从一个单独的按钮中选择列表项,我有自定义列表视图 没有按钮在列表之外的某个地方,我必须从这些按钮上下遍历列表 对不起,我听不懂你的意思.. 你的意思是按钮不是你的列表视图的一部分。? yaa 按钮不是列表视图的一部分,这些按钮是独立的 方式只有这个,但我改变了适配器,以便突出显示正确【参考方案2】:

这可能与可聚焦性有关。如果您有一个包含可聚焦对象的自定义列表视图,请尝试将它们设为不可聚焦。

aButtonInYourListView.Focusable = false;
aButtonInYourListView.FocusableInTouchMode = false;

对 ListViewAdapter 中的所有按钮、图像按钮执行此操作。根据我的经验,它也可以从 xml 完成,但不能用于 imagebutton。为了安全起见,在代码中执行此操作。

这应该允许 ListViewItems 成为焦点。

【讨论】:

我已经使用这两个属性使我正在显示并提供给列表适配器的布局和按钮不可聚焦,但如果我试图从任何其他视图遍历列表,我仍然不是能够看到选择了哪个项目,即没有突出显示,当前所选项目没有不同的背景

以上是关于如何在单击另一个视图(即按钮)时突出显示自定义列表视图的主要内容,如果未能解决你的问题,请参考以下文章

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

单击自定义按钮时如何创建视图

如何将一个自定义列表的选定数据显示到同一活动的另一个自定义列表视图

android在单击按钮时更改列表视图内的图像视图

单击另一个活动时如何发送自定义arraylist的列表项的数据?

uitableview 单元格突出显示