2015-09-22 8 views
5

私のリストビューをタブレットで表示するには、選択した状態を維持するために選択したリストアイテムを選択しようとしていますが、残念ながら、何らかの理由で、選択したアイテムが表示されていないポイントまでスクロールし、選択したアイテムが表示されているポイントまでスクロールすると、予期せず背景色が再利用されます。私は何かがgetViewメソッドに行く必要があると信じていますが、私はこのメソッドで何をすべきか分かりません。背景色が再利用されないようにするためには何が必要ですか?選択したリストアイテムの背景色がタブレットのリストスクロールの後に予期せず再利用されました

アダプタクラス

public class VictoriaListAdapter extends BaseAdapter { 

    private List<Victoria> mData; 
    private LayoutInflater mInflater; 

    public VictoriaListAdapter (List<Victoria> data, Context context) { 
     mData = data; 
     mData = new ArrayList(mData); 
     mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    @Override 
    public int getCount() { 
     return mData.size(); 
    } 

    @Override 
    public String getItem(int position) { 
     return mData.get(position).getStation(); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

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

     ViewHolder holder; 

     if (convertView == null) { 
      convertView = mInflater.inflate(R.layout.list_item_dualline, parent, false); 
      holder = new ViewHolder(); 

      holder.title = (TextView) convertView.findViewById(R.id.item_station); 
      holder.description = (TextView) convertView.findViewById(R.id.item_zone); 

      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     holder.title.setText(mData.get(position).getStation()); 
     holder.description.setText(mData.get(position).getZone()); 

     return convertView; 
    } 

    /** 
    * View holder 
    */ 
    static class ViewHolder { 
     private TextView title; 
     private TextView description; 
    } 
} 

断片クラス

public class FragmentVictoriaLine extends ListFragment { 

    private VictoriaListAdapter mAdapter; 

    public FragmentVictoriaLine() { 
    } 

    /** 
    * Whether or not the activity is in two-pane mode, i.e. running on a tablet 
    * device. 
    */ 
    public boolean mTwoPane; 

    public static FragmentVictoriaLine newInstance() { 
     return new FragmentVictoriaLine(); 
    } 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_victoria_line, container, false); 
     initialize(); 
     return view; 
    } 

    List<Victoria> list = new ArrayList<>(); 
    private void initialize() { 
     String[] items = getActivity().getResources().getStringArray(R.array.victoria_stations); 
     String[] itemDescriptions = getActivity().getResources().getStringArray(R.array.victoria_zones); 
     for (int n = 0; n < items.length; n++){ 
      Victoria victoria = new Victoria(); 
      victoria.setID(); 
      victoria.setStation(items[n]); 
      victoria.setZone(itemDescriptions[n]); 
      list.add(victoria); 
     } 

     mAdapter = new VictoriaListAdapter(list, getActivity()); 
     setListAdapter(mAdapter); 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     View v = getView(); 

     mTwoPane = getActivity().findViewById(R.id.detail_container) != null; 

     assert v != null; 
     ListView lv = (ListView)v.findViewById(android.R.id.list); 
     lv.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      private Victoria selectedMain; 
      private View selectedView; 

      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       VictoriaListAdapter adapter = (VictoriaListAdapter) parent.getAdapter(); 
       String station = adapter.getItem(position); 

       if (mTwoPane) { 
        setItemNormal(); 
        View rowView = view; 
        setItemSelected(rowView); 

        Fragment newFragment; 
        if (station.equals(view.getResources().getString(R.string.bho))) { 
         newFragment = new FragmentVictoriaBHO(); 
        } else if (station.equals(view.getResources().getString(R.string.brx))) { 
         newFragment = new FragmentVictoriaBRX(); 
        } else if (station.equals(view.getResources().getString(R.string.eus))) { 
         newFragment = new FragmentVictoriaEUS(); 
        } else if (station.equals(view.getResources().getString(R.string.fpk))) { 
         newFragment = new FragmentVictoriaFPK(); 
        } else if (station.equals(view.getResources().getString(R.string.green_park))) { 
         newFragment = new FragmentVictoriaGreenPark(); 
        } else if (station.equals(view.getResources().getString(R.string.hhy))) { 
         newFragment = new FragmentVictoriaHHY(); 
        } else if (station.equals(view.getResources().getString(R.string.kxsp))) { 
         newFragment = new FragmentVictoriaKXSP(); 
        } else { 
         newFragment = new FragmentVictoriaBHO(); 
        } 
        VictoriaLineActivity activity = (VictoriaLineActivity) view.getContext(); 
        FragmentTransaction transaction = activity.getSupportFragmentManager().beginTransaction(); 
        transaction.setCustomAnimations(R.anim.fade_out, R.anim.fade_in); 
        transaction.replace(R.id.detail_container, newFragment); 
        transaction.commit(); 
       } else { 
        Intent intent; 
        if (station.equals(view.getResources().getString(R.string.bho))) { 
         intent = new Intent(getActivity(), VictoriaBHOActivity.class); 
        } else if (station.equals(view.getResources().getString(R.string.brx))) { 
         intent = new Intent(getActivity(), VictoriaBRXActivity.class); 
        } else if (station.equals(view.getResources().getString(R.string.eus))) { 
         intent = new Intent(getActivity(), VictoriaEUSActivity.class); 
        } else if (station.equals(view.getResources().getString(R.string.fpk))) { 
         intent = new Intent(getActivity(), VictoriaFPKActivity.class); 
        } else if (station.equals(view.getResources().getString(R.string.green_park))) { 
         intent = new Intent(getActivity(), VictoriaGreenParkActivity.class); 
        } else if (station.equals(view.getResources().getString(R.string.hhy))) { 
         intent = new Intent(getActivity(), VictoriaHHYActivity.class); 
        } else if (station.equals(view.getResources().getString(R.string.kxsp))) { 
         intent = new Intent(getActivity(), VictoriaKXSPActivity.class); 
        } else { 
         intent = new Intent(getActivity(), VictoriaBHOActivity.class); 
        } 
        startActivity(intent); 
       } 
      } 

      public void setItemSelected(View view) { 
       View rowView = view; 
       view.setBackgroundColor(Color.parseColor("#868F98")); 

       TextView tv0 = (TextView) rowView.findViewById(R.id.item_station); 
       tv0.setTextColor(Color.WHITE); 

       TextView tv1 = (TextView) rowView.findViewById(R.id.item_zone); 
       tv1.setTextColor(Color.WHITE); 
      } 

      public void setItemNormal() { 
       for (int i = 0; i < getListView().getChildCount(); i++) { 
        View v = getListView().getChildAt(i); 
        v.setBackgroundColor(Color.TRANSPARENT); 

        TextView tv0 = ((TextView) v.findViewById(R.id.item_station)); 
        tv0.setTextColor(Color.WHITE); 

        TextView tv1 = ((TextView) v.findViewById(R.id.item_zone)); 
        tv1.setTextColor(Color.parseColor("#B5B5B5")); 
       } 
      } 
     }); 

     super.onActivityCreated(savedInstanceState); 
    } 
} 

データクラス

public class Victoria { 
    public Victoria(){} 

    private String station; 
    private String zone; 
    private boolean selected; 

    public String getStation(){ 
     return station; 
    } 

    public void setStation(String item){ 
     this.station = item; 
    } 

    public String getZone(){ 
     return zone; 
    } 

    public void setZone(String zone){ 
     this.zone = zone; 
    } 

    private int _id; 
    public void getID(int _id){ 
     this._id = _id; 
    } 

    public int setID(){ 
     return _id; 
    } 

    public boolean isSelected() { 
     return selected; 
    } 

    public void setSelected(boolean selected) { 
     this.selected = selected; 
    } 
} 
+2

ViewHolderパターンを使用しているため、ViewHolderパターンは新しいものを作成せずに既存の行構造を再利用するデザイナーです。選択した行の色を明示的に設定する必要があります。 –

答えて

4

あなたはをスクロールリストでは、ListViewのアイテム/ビューがメモリを最適化するために再利用されます。選択した状態をリストアイテムに設定すると、スクロールするときに複数のリストアイテムで選択状態が表示されます。これを防ぐ最善の方法は、データモデルに状態を保存し、getViewの状態をAdapterに設定することです。ここで

はあなたが何ができるかである -

@Override 
public void onItemClick(AdapterView<?> parent, View view, int position,long id) { 
    VictoriaListAdapter adapter = (VictoriaListAdapter) parent.getAdapter(); 

    //reverse the selected state in data model 
    for (int i = 0; i < adapter.getCount(); i++) { 
    Victoria victoria = (Victoria)adapter.getItem(i); 
    victoria.setSelected(i == position ? true : false); 
    } 
    Victoria victoria = (Victoria)adapter.getItem(position); 

    --- 
    --- 

とアダプタで -

@Override 
public Object getItem(int position) { 
    //Return full object, coz we need to access other 
    //member variables too 
    return mData.get(position); 
} 

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

    ViewHolder holder; 

    if (convertView == null) { 
     convertView = mInflater.inflate(R.layout.list_item_dualline, parent, false); 
     holder = new ViewHolder(); 

     holder.title = (TextView) convertView.findViewById(R.id.item_station); 
     holder.description = (TextView) convertView.findViewById(R.id.item_zone); 

     convertView.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    Victoria victoria = (Victoria)getItem(position); 
    holder.title.setText(victoria.getStation()); 
    holder.description.setText(victoria.getZone()); 
    if (victoria.isSelected()) { 
     setItemSelected(convertView); 
    } else { 
     setItemNormal(convertView); 
    } 

    return convertView; 
} 

public void setItemSelected(View view) { 
    View rowView = view; 
    view.setBackgroundColor(Color.parseColor("#868F98")); 

    TextView tv0 = (TextView) rowView.findViewById(R.id.item_station); 
    tv0.setTextColor(Color.WHITE); 

    TextView tv1 = (TextView) rowView.findViewById(R.id.item_zone); 
    tv1.setTextColor(Color.WHITE); 
} 

public void setItemNormal(View v) { 

    v.setBackgroundColor(Color.TRANSPARENT); 

    TextView tv0 = ((TextView) v.findViewById(R.id.item_station)); 
    tv0.setTextColor(Color.WHITE); 

    TextView tv1 = ((TextView) v.findViewById(R.id.item_zone)); 
    tv1.setTextColor(Color.parseColor("#B5B5B5")); 

} 

はそれが役に立てば幸い!

+0

フラグメントクラス 'Victoria victoria = adapter.getItem(position);'は、赤い下線を取得し、このエラーが返されます: '必須:com.packagename.data.Victoria Found:java.lang.Object'。ビクトリアvictoria = adapter.getItem(position);のアダプタ 'adapter'では、赤い下線が表示され、このエラーが返されます:'シンボル 'アダプタ'を解決できません。 [スクリーンショット1](http://picpaste.com/w54VUMiV.png)[screenshot 2](http://picpaste.com/zGbiKJov.png) – MacaronLover

+0

選択した状態がまだ再利用されているため、ソリューションが機能しません。 [スクリーンショット1(最初にアイテムを選択した後)](http://picpaste.com/5QdtaaDB.png); [スクリーンショット2(リストをスクロールダウンした後)](http://picpaste.com/kGfwkRYr.png) – MacaronLover

+0

回答を編集しました。 ( 'onItemClick'関数) –

関連する問題