Android 使用标签在 ListView 中搜索栏
Android SeekBar in ListView using tags
好吧,我在自定义列表视图中有一个 seekBar,并且我在我的 onChangeClickListener 上使用了 setTag/getTag 方法,正如所建议的 here in this question 并且工作正常。但是当我向 listView 添加一个新元素 时,新元素的搜索栏会采用之前位于其位置的元素的进度。
请注意,我的 SeekBar sbAnalog
更新了我的 EditText etAnalogPosition
,反之亦然
这是我的 getView()
代码:
public View getView(final int position, View convertView, ViewGroup parent) {
view = convertView;
if (view == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.my_custom_list_layout, null);
holder = new ViewHolder();
holder.sbAnalog = (SeekBar) view.findViewById(R.id.sbAnalog);
holder.etAnalogPosition = (EditText) view.findViewById(R.id.tvAnalogPosition);
view.setTag(holder);
}else{
holder = (ViewHolder) view.getTag();
}
holder.sbAnalog.setTag(holder.etAnalogPosition);
holder.etAnalogPosition.setTag(holder.sbAnalog);
holder.sbAnalog.setMax(list.get(position).getMax());
holder.sbAnalog.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
EditText et = (EditText) seekBar.getTag();
et.setText(String.valueOf(i));
list.get(position).setPosition(i);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
}
holder.etAnalogPosition.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) {
if (i == EditorInfo.IME_ACTION_DONE) {
int value = 0;
try {
value = Integer.parseInt(textView.getText().toString());
} catch (NumberFormatException e) {
SeekBar sb = (SeekBar )textView.getTag();
value = sb.getProgress();
}
//if (value > list.get(position).getMax())
//value = list.get(position).getMax();
SeekBar sb = (SeekBar) textView.getTag();
sb.setProgress(value);
textView.clearFocus();
if (view != null) {
InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
textView.setText(String.valueOf(sb.getProgress()));
}
return false;
}
});}
需要帮助,谢谢。
我刚刚意识到最好的解决方法是将这两行添加到代码中:
holder.sbAnalog.setProgress(list.get(position).getPosition());
holder.etAnalogPosition.setText(String.valueOf(list.get(position).getPosition()));
请注意,我列表中的每个元素都是我创建的自定义对象,其中一个有一个 getPosition()
方法,基本上 returns 元素的 seekBar 位置,由 setPosition()
方法。
因此,如果您遇到同样的问题,我建议您这样做,或者简单地创建一个 arrayAdapter 来存储每个元素的位置,这样您就可以 set
和 get
就像我在我的 getView()
代码中所做的那样。
希望对您有所帮助!
好吧,我在自定义列表视图中有一个 seekBar,并且我在我的 onChangeClickListener 上使用了 setTag/getTag 方法,正如所建议的 here in this question 并且工作正常。但是当我向 listView 添加一个新元素 时,新元素的搜索栏会采用之前位于其位置的元素的进度。
请注意,我的 SeekBar sbAnalog
更新了我的 EditText etAnalogPosition
,反之亦然
这是我的 getView()
代码:
public View getView(final int position, View convertView, ViewGroup parent) {
view = convertView;
if (view == null) {
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.my_custom_list_layout, null);
holder = new ViewHolder();
holder.sbAnalog = (SeekBar) view.findViewById(R.id.sbAnalog);
holder.etAnalogPosition = (EditText) view.findViewById(R.id.tvAnalogPosition);
view.setTag(holder);
}else{
holder = (ViewHolder) view.getTag();
}
holder.sbAnalog.setTag(holder.etAnalogPosition);
holder.etAnalogPosition.setTag(holder.sbAnalog);
holder.sbAnalog.setMax(list.get(position).getMax());
holder.sbAnalog.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
EditText et = (EditText) seekBar.getTag();
et.setText(String.valueOf(i));
list.get(position).setPosition(i);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
}
holder.etAnalogPosition.setOnEditorActionListener(new TextView.OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView textView, int i, KeyEvent keyEvent) {
if (i == EditorInfo.IME_ACTION_DONE) {
int value = 0;
try {
value = Integer.parseInt(textView.getText().toString());
} catch (NumberFormatException e) {
SeekBar sb = (SeekBar )textView.getTag();
value = sb.getProgress();
}
//if (value > list.get(position).getMax())
//value = list.get(position).getMax();
SeekBar sb = (SeekBar) textView.getTag();
sb.setProgress(value);
textView.clearFocus();
if (view != null) {
InputMethodManager imm = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
textView.setText(String.valueOf(sb.getProgress()));
}
return false;
}
});}
需要帮助,谢谢。
我刚刚意识到最好的解决方法是将这两行添加到代码中:
holder.sbAnalog.setProgress(list.get(position).getPosition());
holder.etAnalogPosition.setText(String.valueOf(list.get(position).getPosition()));
请注意,我列表中的每个元素都是我创建的自定义对象,其中一个有一个 getPosition()
方法,基本上 returns 元素的 seekBar 位置,由 setPosition()
方法。
因此,如果您遇到同样的问题,我建议您这样做,或者简单地创建一个 arrayAdapter 来存储每个元素的位置,这样您就可以 set
和 get
就像我在我的 getView()
代码中所做的那样。
希望对您有所帮助!