2014-07-17 45 views
0

我的問題是我的列表視圖中有六個或更多的entrys getView方法開始給我的項目錯誤的位置,因爲我的列表視圖滾動後回收。我的問題是如何在滾動後獲得正確的位置。我在類似的問題中研究了這個問題,但我仍然無法解決它。你能幫助我嗎?返回不正確的位置內部getView()

public class LayoutPreference extends DialogPreference { 
private String mValue = "1";//default 
private int mClickedDialogEntryIndex; 
GridView gridView; 
ArrayList<LayoutConfiguration> gridArray = new ArrayList<LayoutConfiguration>(); 
LayoutPreferenceViewAdapter customGridAdapter; 
private boolean mValueSet; 
private String[] mEntryValues; 
private String[] mEntries; 
Button btnConfirm; 

public LayoutPreference(Context context, AttributeSet attrs) { 
    super(context, attrs); 

    setDialogLayoutResource(R.layout.imglayout_grid); 
    setWidgetLayoutResource(R.layout.imglayout_grid_widget); 
} 

@Override 
protected void onBindView(View view) { 
    super.onBindView(view); 

    final ImageView box = (ImageView) view.findViewById(R.id.pref_widget_box); 

    gridArray.clear(); 
    for (LayoutConfiguration layoutConfiguration : LayoutConfiguration.getLayoutConfigurations()) { 
     gridArray.add(layoutConfiguration); 
    } 

    for (LayoutConfiguration layoutConfiguration : gridArray) { 
     if (mValue != null && mValue.equals(layoutConfiguration.getId())) { 

      box.setImageBitmap(layoutConfiguration.genImage(105, 75)); 
      if(layoutConfiguration.getId()=="conf_2.1"||layoutConfiguration.getId()=="conf_2"){ 
      box.setRotation(0); 
      }else{ 
       box.setRotation(180); 
      } 
     } 
    } 
    box.invalidate(); 
} 

@Override 
protected void onBindDialogView(View view) { 
    setEntryValues(); 

    int index = findIndexOfValue(getSharedPreferences().getString(getKey(), "1")); 

    ViewGroup rootLayout = (ViewGroup) view; 
    gridView = (GridView) rootLayout.findViewById(R.id.gridView); 
    customGridAdapter = new LayoutPreferenceViewAdapter(getContext(), R.layout.imglayout_row_grid, gridArray, index, new ItemSelectedListener()); 


    gridView.setAdapter(customGridAdapter); 
    btnConfirm = (Button) rootLayout.findViewById(R.id.confirmBtn); 
    btnConfirm.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
      save();  
     } 
    }); 


    super.onBindDialogView(view); 
} 

private void setEntryValues() { 
    mEntryValues = new String[gridArray.size()]; 
    for (int i = 0; i < gridArray.size(); i++) 
     mEntryValues[i] = gridArray.get(i).getId(); 
    mEntries = new String[gridArray.size()]; 
    for (int i = 0; i < gridArray.size(); i++) 
     mEntries[i] = gridArray.get(i).getId(); 
} 

public void setValue(String value) { 
    // Always persist/notify the first time. 
    final boolean changed = !TextUtils.equals(mValue, value); 
    if (changed || !mValueSet) { 
     mValue = value; 
     mValueSet = true; 
     persistString(value); 
     if (changed) { 
      notifyChanged(); 
     } 
    } 
} 

@Override 
protected void onSetInitialValue(boolean restoreValue, Object defaultValue) { 
    setValue(restoreValue ? getPersistedString(mValue) : (String) defaultValue); 
} 

public String getValue() { 
    return mValue; 
} 

private int getValueIndex() { 
    return findIndexOfValue(mValue); 
} 

@Override 
protected void onPrepareDialogBuilder(Builder builder) { 
    super.onPrepareDialogBuilder(builder); 

    mClickedDialogEntryIndex = getValueIndex(); 

    builder.setPositiveButton(null, null); 
} 

public int findIndexOfValue(String value) { 
    for (int i = 0; i < gridArray.size(); i++) { 
     if (gridArray.get(i).getId().equals(value)) { 
      return i; 
     } 
    } 
    return -1; 
} 

public class ItemSelectedListener { 

    public void itemSelected(int index) { 
     if (mClickedDialogEntryIndex >= 0) { 
      CheckedTextView chk = (CheckedTextView) ((RelativeLayout) gridView.getChildAt(mClickedDialogEntryIndex)).findViewById(R.id.item_chk); 
      if (chk != null) 
       chk.setChecked(false); 
     } 

     mClickedDialogEntryIndex = index; 
     mValue = mEntryValues[index]; 
     CheckedTextView chk = (CheckedTextView) ((RelativeLayout) gridView.getChildAt(mClickedDialogEntryIndex)).findViewById(R.id.item_chk); 
     if (chk != null) 
      chk.setChecked(true); 
    } 
} 


private void save() { 
    SharedPreferences.Editor editor = getEditor(); 
    editor.putString(Preferences.SETTINGS_LAYOUT, mValue); 
    editor.commit(); 
    callChangeListener(mValue); 

    LayoutPreference.this.onClick(getDialog(), DialogInterface.BUTTON_POSITIVE); 
    getDialog().dismiss(); 
} 

}

public class LayoutPreferenceViewAdapter extends ArrayAdapter<LayoutConfiguration> { 
Context context; 
int layoutResourceId; 
int index; 
ArrayList<LayoutConfiguration> data ; 
ItemSelectedListener listener; 

public LayoutPreferenceViewAdapter(Context context, int layoutResourceId, ArrayList<LayoutConfiguration> data, int index, ItemSelectedListener listener) { 
    super(context, layoutResourceId, data); 
    this.layoutResourceId = layoutResourceId; 
    this.context = context; 
    this.data = data; 
    this.index = index; 
    this.listener = listener; 

} 

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
    View row = convertView; 
    RecordHolder holder; 

    if (row == null) { 
     row = inflater.inflate(layoutResourceId, null); 
     holder = new RecordHolder(); 
     holder.imageItem = (ImageView) row.findViewById(R.id.item_image); 
     holder.chk = (CheckedTextView) row.findViewById(R.id.item_chk); 
     row.setTag(holder); 

    } else { 
     holder = (RecordHolder) row.getTag(); 
    } 

    holder.imageItem.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      listener.itemSelected(position); 
     } 
    }); 
    holder.chk.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      // TODO Auto-generated method stub 
      listener.itemSelected(position); 
     } 
    }); 

    LayoutConfiguration item = data.get(position); 
    holder.imageItem.setImageBitmap(item.genImage(140, 100)); 
    return row; 

} 

static class RecordHolder { 
    CheckedTextView chk; 
    ImageView imageItem; 

} 

http://www.imagehosting.cz/?v=2014071811.png

http://www.imagehosting.cz/?v=201407nin.png

在GetView方法調用登錄後。

Log.i("getView ","Position " + position + " View " + row); 

07-18 11:59:43.694: I/getView(2954): Position 0 View null 
07-18 11:59:43.704: I/getView(2954): Position 0 View [email protected] 
07-18 11:59:43.704: I/getView(2954): Position 0 View [email protected] 
07-18 11:59:43.714: I/getView(2954): Position 0 View [email protected] 
07-18 11:59:43.714: I/getView(2954): Position 0 View [email protected] 
07-18 11:59:43.714: I/getView(2954): Position 0 View [email protected] 
07-18 11:59:43.734: I/getView(2954): Position 0 View [email protected] 
07-18 11:59:43.744: I/getView(2954): Position 1 View null 
07-18 11:59:43.755: I/getView(2954): Position 2 View null 
07-18 11:59:43.785: I/getView(2954): Position 3 View null 
07-18 11:59:43.805: I/getView(2954): Position 4 View null 
07-18 11:59:43.815: I/getView(2954): Position 5 View null 
07-18 11:59:43.875: I/getView(2954): Position 0 View null 
07-18 11:59:43.905: I/getView(2954): Position 0 View [email protected] 
07-18 11:59:43.905: I/getView(2954): Position 0 View [email protected] 
07-18 11:59:43.905: I/getView(2954): Position 0 View [email protected] 
07-18 11:59:43.915: I/getView(2954): Position 0 View [email protected] 
07-18 11:59:43.915: I/getView(2954): Position 0 View [email protected] 

感謝您的任何想法。

回答

0

我認爲你可以這樣做:

@Override 
public View getView(int position, View row, ViewGroup parent) { 
    LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
    RecordHolder holder; 

    if (row == null) { 
     row = inflater.inflate(layoutResourceId, parent, false); 
     holder = new RecordHolder(); 
     holder.imageItem = (ImageView) row.findViewById(R.id.item_image); 
     holder.chk = (CheckedTextView) row.findViewById(R.id.item_chk); 
     holder.imageItem.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       listener.itemSelected((int) v.getTag()); 
      } 
     }); 
     holder.chk.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       listener.itemSelected((int) v.getTag()); 
      } 
     }); 
     row.setTag(holder); 
    } else { 
     holder = (RecordHolder) row.getTag(); 
    } 

    holder.imageItem.setTag(position); 
    holder.chk.setTag(position); 

    LayoutConfiguration item = data.get(position); 
    holder.imageItem.setImageBitmap(item.genImage(140, 100)); 
    return row; 

} 

我看不出有必要把final修飾符的位置變量。另外,您可以更改方法接收的視圖的名稱,並避免創建另一個視圖「View row = convertView;」。使用「.inflate(layoutId,null)」是一種不好的做法,因爲您不告訴系統是視圖的父級,xml中的「layout _...」屬性將不起作用。更多的信息在這裏:http://www.doubleencore.com/2013/05/layout-inflation-as-intended/

隨着我的修改,我相信代碼將正確保存列表視圖中的每個列表項的位置。

+0

感謝您真正快速的回答和信息,但是如果我開始滾動,我會得到位置6和7,如果我點擊位置4,它會選擇位置編號6 – Zdenek

+0

我已經修改了方法,現在再試一次@ Zdenek –

+0

它仍然無法正常工作,我不知道爲什麼它不起作用。 – Zdenek

相關問題