2015-06-15 69 views
1

好吧,所以我使用ListView自定義適配器。一切工作正常,戴... ...直到用戶選擇ListView行並嘗試滾動。Android ListView ::滾動列表視圖,而項目被選中導致顯示問題

當用戶選擇一行時,該行的背景色變爲藍色(這很好)。

但是,當我們開始滾動時會出現問題:當我們滾動選定的行時,藍色將自身修復爲ListView的底部或頂部,具體取決於我們滾動的方式。

選定行改變觸摸顏色(好)選擇的行的背景的
Selected Row Looks Good


部固定向下滾動(不好)時頁首
enter image description here


向上滾動時,所選行背景的一部分固定在底部(不好)
enter image description here



這裏是我的源代碼:

列表查看我動態填充

<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; 

    } 
} 

回答

0

保持在您的適配器選擇行位置的參考,說

int selectedPos = -1;

當沒有行被選中時,該值將是-1。並且在列表視圖的OnItemClickListener中,更新selectedPos並單擊位置並在適配器上調用notifyDatasetChanged()。在適配器的getView方法中,檢查selectedPos值並相應地突出顯示該行。

0

這是關於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; 
} 
//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(); 
       } 
      } 
相關問題