Android ListView与所选项目一起滚动

Android ListView与所选项目一起滚动,android,listview,scroll,graphic,Android,Listview,Scroll,Graphic,我在这篇文章中提到了这个问题,但我不知道如何解决这个问题 这就是它看起来的样子: 一个项目的突出显示将移动到另一个未选中的项目上(滚动时)。 有时突出显示在两个项目(一半和一半)之间 默认适配器(未设置适配器)也会出现此错误 这是我的适配器: import java.util.ArrayList; import android.content.Context; import android.graphics.Color; import android.util.SparseBooleanAr

我在这篇文章中提到了这个问题,但我不知道如何解决这个问题

这就是它看起来的样子:

一个项目的突出显示将移动到另一个未选中的项目上(滚动时)。 有时突出显示在两个项目(一半和一半)之间

默认适配器(未设置适配器)也会出现此错误

这是我的适配器:

import java.util.ArrayList;

import android.content.Context;
import android.graphics.Color;
import android.util.SparseBooleanArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.TextView;
import android.widget.CompoundButton.OnCheckedChangeListener;

public class SimpleCheckAdapter extends ArrayAdapter<String> {

    private SparseBooleanArray mSparseBooleanArray;
    private LayoutInflater mInflater;
    private ArrayList<String> itemsArrayList;

    public SimpleCheckAdapter(Context context, ArrayList<String> a) {
        super(context,R.layout.srow,a);
        this.itemsArrayList = a;
        this.mInflater = LayoutInflater.from(context);
    }

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

      if(convertView == null){
          convertView = this.mInflater.inflate( R.layout.srow, parent, false);
      }

      // 3. Get the two text view from the rowView
        TextView txt = (TextView) convertView.findViewById(R.id.simpleText);

        // 4. Set the text for textView 
        txt.setText(itemsArrayList.get(position));


       // 5. return rowView
        return convertView;
    }
}
import java.util.ArrayList;
导入android.content.Context;
导入android.graphics.Color;
导入android.util.SparseBooleanArray;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.ArrayAdapter;
导入android.widget.CheckBox;
导入android.widget.CompoundButton;
导入android.widget.TextView;
导入android.widget.CompoundButton.OnCheckedChangeListener;
公共类SimpleCheckAdapter扩展了ArrayAdapter{
私有SparseBooleanArray mSparseBooleanArray;
私人停车场;
私有数组列表项数组列表;
公共SimpleCheckAdapter(上下文,ArrayList a){
super(context,R.layout.srow,a);
this.itemsArrayList=a;
this.mInflater=LayoutInflater.from(上下文);
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
if(convertView==null){
convertView=this.mInflater.充气(R.layout.srow,parent,false);
}
//3.从行视图中获取两个文本视图
TextView txt=(TextView)convertView.findViewById(R.id.simpleText);
//4.设置文本视图的文本
setText(itemsArrayList.get(position));
//5.返回行视图
返回视图;
}
}

谁能帮助并知道如何修复这种丑陋的行为?

创建onscrollistener并删除滚动列表的选择。

我在大多数项目中都使用这种方法,但我从未发现任何问题。我甚至制作了一个涉及联系人的应用程序,它可以管理大量的数据(考虑到联系人API的工作方式),并且运行平稳,因此我的答案是肯定的。

这里有一个简单的解决方案,对我来说很有效:

  • 扩展SimpleCheckAdapter的代码:

    private int selectedPosition = -1;
    void setSelectedPosition( int pos ) {
        selectedPosition = pos;
        notifyDataSetChanged();
    }
    
  • 扩展GetView()中的代码:

  • 在yout活动中,为ListView注册ClickCallback()

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View viewClicked, int position, long id) {
            adapter.setSelectedPosition(position);
        }
    });
    

    仅此而已,不需要编程设置setChoiceMode()和setSelector()或xml中的android:choiceMode和android:listSelector

    但是我想保留选择,如果我再次向上滚动,这可能吗?非常感谢。是的,在这种情况下,您需要记住选择,并且有不同的方法提供第一个和最后一个显示的项目索引。使用该选项,您将知道用户是否已再次向上滚动,您可以重新添加选择。如何检查项目是否正确?singleCheckView.setItemChecked(1,true);似乎不适合我(在OnScrollListener中的MainActivity中,singleCheckView是一个ListView)Jan:谢谢大家:有什么想法吗?
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View viewClicked, int position, long id) {
            adapter.setSelectedPosition(position);
        }
    });
    
        adapter.setSelectedPosition(-1);