Android使用自定义适配器设置高亮显示的选定listview项

Android使用自定义适配器设置高亮显示的选定listview项,android,listview,android-listview,Android,Listview,Android Listview,我需要你的帮助。我的问题是我需要突出显示所选的listview项。请注意,它只需要设置单个项,而不需要设置多个项 以下是我迄今为止所尝试的: @Override public View getView(final int position, View convertView, ViewGroup parent) { final ViewHolder viewHolder; if(convertView == null) { inflater = (Lay

我需要你的帮助。我的问题是我需要突出显示所选的listview项。请注意,它只需要设置单个项,而不需要设置多个项

以下是我迄今为止所尝试的:

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

    final ViewHolder viewHolder;

    if(convertView == null) {

        inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        convertView = inflater.inflate(R.layout.list_video_item, parent, false);

        viewHolder = new ViewHolder();
        viewHolder.background = (LinearLayout) convertView.findViewById(R.id.background);
    } else {
        viewHolder = (ViewHolder) convertView.getTag();
    }

    result = new HashMap<>();
    result = data.get(position);

    if(firstTimeStartup && position == 0) { // default selected
        result = data.get(0);
        highlightCurrentRow(viewHolder.background);
    } else {
        unhighlightCurrentRow(viewHolder.background);
    }

    convertView.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            result = data.get(position);

            if (firstTimeStartup) { // first time  highlight first row
                firstTimeStartup = false;
                result = data.get(0);
                unhighlight(viewHolder.background, 0);
            }

            highlightCurrentRow(viewHolder.background);
    });

    return convertView;

}

private void unhighlightCurrentRow(View rowView) {
    rowView.setBackgroundResource(android.R.color.transparent);
}

private void highlightCurrentRow(View rowView) {
    rowView.setBackgroundResource(R.color.main_blue);
}

private Boolean firstTimeStartup = true;
@覆盖
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
最终持票人;
if(convertView==null){
充气器=(充气器)上下文
.getSystemService(上下文布局\充气机\服务);
convertView=充气机。充气(R.layout.list\u video\u项,父项,false);
viewHolder=新的viewHolder();
viewHolder.background=(LinearLayout)convertView.findViewById(R.id.background);
}否则{
viewHolder=(viewHolder)convertView.getTag();
}
结果=新的HashMap();
结果=数据。获取(位置);
如果(firstTimeStartup&&position==0){//默认选中
结果=数据。获取(0);
highlightCurrentRow(viewHolder.background);
}否则{
取消高亮CurrentRow(viewHolder.background);
}
convertView.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
结果=数据。获取(位置);
如果(firstTimeStartup){//第一次高亮显示第一行
firstTimeStartup=false;
结果=数据。获取(0);
取消高亮度(viewHolder.background,0);
}
highlightCurrentRow(viewHolder.background);
});
返回视图;
}
私有void unhighlightCurrentRow(视图rowView){
setBackgroundResource(android.R.color.transparent);
}
私有void highlightCurrentRow(视图rowView){
rowView.setBackgroundResource(R.color.main_蓝色);
}
私有布尔值firstTimeStartup=true;
但问题是,当我单击convertView时,无法取消高亮显示该项目。此外,当我尝试单击其他项目时,默认(第一个)项目也没有取消高亮显示。如果有任何帮助,将不胜感激。谢谢!

convertView.setOnClickListener(new View.OnClickListener(){
convertView.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        result = data.get(position);

        for(int i=0;i<data.size();i++){
              if(i == position){
                      highlightCurrentRow(viewHolder.background);
                  }
                else{
                    unhighlightCurrentRow(viewHolder.background);
                     }
              }


});
@凌驾 公共void onClick(视图v){ 结果=数据。获取(位置);
对于(int i=0;i创建如下方法:

CustomAdapter extends BaseAdapter {

int selectedPosition=0;

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

 if(position==selectedPosition){
   highlightCurrentRow(viewHolder.background);
 }else{
     unhighlightCurrentRow(viewHolder.background);
 }




 }

  void highlightUnhighlight(int position){

 seslectedPostion= postion;
 notifyDatasetChanged

 }
 }

在onItemClickListener中调用highlightUnhighlight(position)。

我编辑了您的代码,请检查此代码是否可以解决您的问题。我在项目中使用了此代码

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

final ViewHolder viewHolder;

if(convertView == null) {

    inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    convertView = inflater.inflate(R.layout.list_video_item, parent, false);

    viewHolder = new ViewHolder();
    viewHolder.background = (LinearLayout) convertView.findViewById(R.id.background);
} else {
    viewHolder = (ViewHolder) convertView.getTag();
}

result = new HashMap<>();
result = data.get(position);

if(firstTimeStartup[position]) { // default selected
    result = data.get(0);
    highlightCurrentRow(viewHolder.background);
} else {
    unhighlightCurrentRow(viewHolder.background);
}

convertView.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {
        result = data.get(position);

        if (firstTimeStartup[position]) { 
            Arrays.fill(firstTimeStartup, Boolean.FALSE);
            firstTimeStartup[position] = false;
            result = data.get(0);
            unhighlight(viewHolder.background, 0);
        }else{
        Arrays.fill(firstTimeStartup, Boolean.FALSE);
        firstTimeStartup[position] = true;
        highlightCurrentRow(viewHolder.background);
        }

   notifyDataSetChanged();
});

return convertView;
}

private void unhighlightCurrentRow(View rowView) {
rowView.setBackgroundResource(android.R.color.transparent);
}

private void highlightCurrentRow(View rowView) {
rowView.setBackgroundResource(R.color.main_blue);
}

 private Boolean firstTimeStartup[] = new Boolean[data.size()];
 firstTimeStartup[0]=true;
@覆盖
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
最终持票人;
if(convertView==null){
充气器=(充气器)上下文
.getSystemService(上下文布局\充气机\服务);
convertView=充气机。充气(R.layout.list\u video\u项,父项,false);
viewHolder=新的viewHolder();
viewHolder.background=(LinearLayout)convertView.findViewById(R.id.background);
}否则{
viewHolder=(viewHolder)convertView.getTag();
}
结果=新的HashMap();
结果=数据。获取(位置);
如果(firstTimeStartup[position]){//默认选中
结果=数据。获取(0);
highlightCurrentRow(viewHolder.background);
}否则{
取消高亮CurrentRow(viewHolder.background);
}
convertView.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
结果=数据。获取(位置);
if(firstTimeStartup[位置]{
fill(firstTimeStartup,Boolean.FALSE);
firstTimeStartup[位置]=假;
结果=数据。获取(0);
取消高亮度(viewHolder.background,0);
}否则{
fill(firstTimeStartup,Boolean.FALSE);
firstTimeStartup[位置]=真;
highlightCurrentRow(viewHolder.background);
}
notifyDataSetChanged();
});
返回视图;
}
私有void unhighlightCurrentRow(视图rowView){
setBackgroundResource(android.R.color.transparent);
}
私有void highlightCurrentRow(视图rowView){
rowView.setBackgroundResource(R.color.main_蓝色);
}
私有布尔值firstTimeStartup[]=新布尔值[data.size()];
firstTimeStartup[0]=真;

Hi这部分起作用,但当我单击其他项目时,默认选中的项目不会取消高亮显示。它一次只能选择一个项目。项目只有在再次单击时才会取消高亮显示。这不应该。我选择行时如何?当您选择一行时,这意味着您的on item click将被调用,并且您将高亮显示当前行并取消所有其他行的高亮显示。