【问题标题】:Android ListView :: Scrolling ListView while item is selected causes display problemsAndroid ListView :: 选择项目时滚动 ListView 会导致显示问题
【发布时间】:2015-06-15 00:58:10
【问题描述】:

好的,所以我正在使用带有自定义适配器的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" >


layout_list_view_row.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 xml android-layout android-listview android-xml


    【解决方案1】:

    这是关于列表视图的常见问题。当您向下滚动时,它每次都会创建新视图。这就是为什么从顶部选择的元素离开焦点并选择另一个元素的原因。 对于这个问题,你必须扩展 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;
    }
    
    //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();
                    }
                }
    

    【讨论】:

      【解决方案2】:

      在您的适配器中保留所选行位置的参考,例如

      int selectedPos = -1;

      当没有选择行时,该值将是-1。并在列表视图的OnItemClickListener 中,使用单击的位置更新selectedPos 并在适配器上调用notifyDatasetChanged()。在适配器的getView 方法中,检查selectedPos 值并相应地突出显示该行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多