Android ListView::选中项目时滚动ListView会导致显示问题

Android ListView::选中项目时滚动ListView会导致显示问题,android,xml,android-layout,android-listview,android-xml,Android,Xml,Android Layout,Android Listview,Android Xml,好的,我正在使用带有自定义适配器的列表视图。在用户选择一个ListView行并尝试滚动之前,一切都很正常 当用户选择一行时,该行的背景色变为蓝色(这很好) 但是,当我们开始滚动时会出现问题:当我们滚动到所选行的上方时,蓝色会固定在列表视图的底部或顶部,这取决于我们滚动的方式 选定行在触摸时更改颜色(良好) 向下滚动时,选定行的部分背景固定在顶部(不好) 向上滚动时,选定行的部分背景固定在底部(不好) 以下是我的源代码: 动态填充的列表视图 <ListView

好的,我正在使用带有自定义适配器的
列表视图。在用户选择一个
ListView
行并尝试滚动之前,一切都很正常

当用户选择一行时,该行的背景色变为蓝色(这很好)

但是,当我们开始滚动时会出现问题:当我们滚动到所选行的上方时,蓝色会固定在
列表视图的底部或顶部,这取决于我们滚动的方式

选定行在触摸时更改颜色(良好)



向下滚动时,选定行的部分背景固定在顶部(不好)



向上滚动时,选定行的部分背景固定在底部(不好)



以下是我的源代码:

动态填充的列表视图

<ListView
     android:id="@+id/tallyDataListView"
     android:layout_height="wrap_content"
     android:layout_width="fill_parent"
     android:divider="#000000"
     android:dividerHeight="1dp"
     android:fadeScrollbars="false"
     android:listSelector="#0099FF" >


布局\列表\视图\行.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

    <View
        android:focusable="false"
        android:focusableInTouchMode="false"
        style="@style/tableSideBorderLine" />

    <TextView
        android:id="@+id/COLUMN_PIPE_NUMBER"
        android:layout_height="wrap_content"
        android:layout_width="0dp"
        android:layout_weight="1"
        style="@style/tableColumn"
        xmlns:android="http://schemas.android.com/apk/res/android" />

    <View
        android:focusable="false"
        android:focusableInTouchMode="false"
        style="@style/tableColumnDivider" />

    <TextView
        android:id="@+id/COLUMN_TOTAL_LENGTH"
        android:layout_height="wrap_content"
        android:layout_width="0dp"
        android:layout_weight="1"
        style="@style/tableColumn"
        xmlns:android="http://schemas.android.com/apk/res/android" />

    <View
        android:focusable="false"
        android:focusableInTouchMode="false"
        style="@style/tableColumnDivider" />

    <TextView
        android:id="@+id/COLUMN_ADJUSTED"
        android:layout_height="wrap_content"
        android:layout_width="0dp"
        android:layout_weight="1"
        style="@style/tableColumn"
        xmlns:android="http://schemas.android.com/apk/res/android" />

    <View
        android:focusable="false"
        android:focusableInTouchMode="false"
        style="@style/tableSideBorderLine" />

</LinearLayout>



我的自定义适配器

import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

import java.util.ArrayList;

public class ListViewAdapter extends ArrayAdapter<String>{

    LayoutInflater inflater;
    private final ArrayList<String> adjustedValues;
    private final ArrayList<String> pipeNumbers;
    private final ArrayList<String> totalLengthValues;

    public ListViewAdapter(Activity pContext, ArrayList<String> pPipeNumbers,
                           ArrayList<String> pTotalLengthValues, ArrayList<String> pAdjustedValues)
    {

        super(pContext, R.layout.layout_list_view_row, pAdjustedValues);

        adjustedValues = pAdjustedValues;
        pipeNumbers = pPipeNumbers;
        totalLengthValues = pTotalLengthValues;

        inflater = pContext.getLayoutInflater();

    }

    @Override
    public View getView(int pPosition, View pView, ViewGroup pParent)
    {

        View view = inflater.inflate(R.layout.layout_list_view_row, pParent, false);

        TextView col1 = (TextView)view.findViewById(R.id.COLUMN_PIPE_NUMBER);
        col1.setText(pipeNumbers.get(pPosition));
        TextView col2 = (TextView)view.findViewById(R.id.COLUMN_TOTAL_LENGTH);
        col2.setText(totalLengthValues.get(pPosition));
        TextView col3 = (TextView)view.findViewById(R.id.COLUMN_ADJUSTED);
        col3.setText(adjustedValues.get(pPosition));

        return view;

    }
}
导入android.app.Activity;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.ArrayAdapter;
导入android.widget.TextView;
导入java.util.ArrayList;
公共类ListViewAdapter扩展了ArrayAdapter{
充气机;
私有最终阵列列表调整值;
专用最终阵列列表管道编号;
私人最终阵列列表总长度值;
公共ListViewAdapter(活动pContext、ArrayList PPipeNumber、,
ArrayList pTotalLengthValues、ArrayList pAdjustedValues)
{
super(pContext、R.layout.layout\u list\u view\u row、pAdjustedValues);
adjustedValues=pAdjustedValues;
管道编号=管道编号;
totalLengthValues=pTotalLengthValues;
充气器=pContext.getLayoutInflater();
}
@凌驾
公共视图getView(内部位置、视图pView、视图组pParent)
{
视图=充气机。充气(R.layout.layout\u list\u View\u row,pParent,false);
TextView col1=(TextView)view.findViewById(R.id.COLUMN\u PIPE\u NUMBER);
col1.setText(pipeNumbers.get(position));
TextView col2=(TextView)view.findViewById(R.id.COLUMN\u TOTAL\u LENGTH);
col2.setText(totalengthvalues.get(position));
TextView col3=(TextView)view.findViewById(R.id.COLUMN\u调整);
col3.setText(adjustedValues.get(position));
返回视图;
}
}

在适配器中保留选定行位置的引用,例如

int-selectedPos=-1


当未选择任何行时,该值将为
-1
。在listview的
OnItemClickListener
中,使用单击的位置更新
selectedPos
,并在适配器上调用
notifyDatasetChanged()
。在适配器的
getView
方法中,检查
selectedPos
值,并相应地突出显示该行。

这是listview的常见问题。向下滚动时,每次都会创建新视图。这就是为什么从顶部选择的元素脱离焦点,而选择另一个元素的原因。 对于这个问题,您必须扩展
BaseAdapter
类和

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

    Vehical vehical = vehicals.get(position);
    ViewHolder viewHolder = null;

    if(convertView==null)
    {
        viewHolder = new ViewHolder();
        convertViewactivity.getLayoutInflater().inflate(R.layout.list_item,null);
        convertView.setTag(viewHolder);
    }
    else
    {
        viewHolder = (ViewHolder) convertView.getTag();
    }

    viewHolder.tvVehicalName = (TextView) convertView.findViewById(R.id.vehicle_name);
    viewHolder.tvVehicalName.setText(vehical.getVehicalName());

    if(vehical.isSelected()){
        viewHolder.tvVehicalName.setTextColor(Color.RED);
    }
    else
    {
        viewHolder.tvVehicalName.setTextColor(Color.BLACK);
    }
    return convertView;
}
//在listview的侦听器上
searchList.setOnItemClickListener(
新的MClickListener(){
@凌驾
public void onItemClick(AdapterView arg0、视图视图、整型位置、长arg3){
如果(searchAdapter.isItemSelected(位置))
{
searchAdapter.setSelectedItem(位置,false);
selectedList.remove(((车辆)searchAdapter.getItem(position)).getVehicalName());
}
其他的
{
如果(selectedList.size()
//On listener of the listview
searchList.setOnItemClickListener(

    new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View view, int position, long arg3) {

            if(searchAdapter.isItemSelected(position))
            {
                searchAdapter.setSelectedItem(position,false);
                selectedList.remove(((Vehical)searchAdapter.getItem(position)).getVehicalName());
            }
            else
            {
                if(selectedList.size()<new_vehiclelimit){
                    searchAdapter.setSelectedItem(position,true);
                    selectedList.add(((Vehical)searchAdapter.getItem(position)).getVehicalName());
                }
                else
                {
                    Toast.makeText(getApplicationContext(), "Vechicle Limit is Over", Toast.LENGTH_SHORT).show();
                }
            }