我的問題是我的列表視圖中有六個或更多的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]
感謝您的任何想法。
感謝您真正快速的回答和信息,但是如果我開始滾動,我會得到位置6和7,如果我點擊位置4,它會選擇位置編號6 – Zdenek
我已經修改了方法,現在再試一次@ Zdenek –
它仍然無法正常工作,我不知道爲什麼它不起作用。 – Zdenek