我希望手动重新排列ListView的顺序。我(想要)实现这一目的的方法是点击要移动的项目,将该项目的背景设置为不同的颜色,存储其位置(oldPosition),然后点击下面显示的项目,最后重置原始项目位置的背景。
我用来做的代码是: -
List<String> catarray; // string array declared in main activity
ArrayAdapter<String> catadapter; // adapter for Spinner declared in main activity
ListView cats; // listview declared in list activity
ArrayAdapter<String> adapter; // adapter for listview declared in list activity
int oldPosition = -1;
cats.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (oldPosition < 0) {
oldPosition = position;
try {
dr = parent.getChildAt(position).getBackground();
parent.getChildAt(position).setBackgroundColor(Color.argb(255, 0, 153, 204));
}
catch (Exception e) {
}
}
else {
String item = PhotoActivity.catarray.remove(oldPosition);
PhotoActivity.catarray.add(position,item);
try {
parent.getChildAt(oldPosition).setBackground(dr);
}
catch (Exception e) {
}
oldPosition = -1;
changed = true;
PhotoActivity.catadapter.notifyDataSetChanged();
adapter.notifyDataSetChanged();
}
}
});
我遇到的问题是,如果列表大于显示的视图,那么我点击的项目都会改变背景,但是在可见范围之下的其他项目也会改变。
因此,例如,如果完整列表是12个项目,其中前8个正在显示,如果我点击第二个项目,那么该项目以及项目11(即第二个项目加一个突出显示在可见范围之下。
为什么会这样?
如何停止它,或者,如果我不能这样做,重置错误突出显示的项目,因为它不可见,因此无法通过parent.getChildAt ...
答案 0 :(得分:0)
我找到的唯一答案是为适配器添加getView方法,调用super.getView然后更改那里的背景颜色。
此外,您需要在OnItemClickListener事件中调用view.setBackgroundColor,以确保在单击时更改背景。
所以,我的代码最终是: -
cats.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (oldPosition < 0) {
oldPosition = position;
try {
view.setBackgroundColor(Color.argb(255, 0, 153, 204));
}
catch (Exception e) {
}
}
else {
String item = PhotoActivity.catarray.remove(oldPosition);
PhotoActivity.catarray.add(position,item);
oldPosition = -1;
changed = true;
PhotoActivity.catadapter.notifyDataSetChanged();
adapter.notifyDataSetChanged();
}
}
});
adapter = new ArrayAdapter<String>(c, android.R.layout.simple_list_item_1, PhotoActivity.catarray) {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
TextView textView = (TextView) super.getView(position, convertView, parent);
if (oldPosition> -1 && oldPosition==position) {
textView.setBackgroundColor(Color.argb(255, 0, 153, 204));
}
else {
textView.setBackgroundColor(Color.argb(0, 0, 0, 0));
}
return textView;
}
};
cats.setAdapter(adapter);
感谢Cameron Saul在回答here时指出我正确的方向。