【发布时间】:2017-01-30 09:02:05
【问题描述】:
我有两个 ListView 在屏幕上分开。我想实现以下目标: 单击顶部列表项会更改其背景颜色,以及底部列表中相同位置的项的背景颜色。
我有以下问题: 底部列表项的背景仅在我将其从屏幕上滚动并将其滚动回屏幕后才会发生变化。如何立即更改颜色?
另外,如何更改单个项目的背景颜色?现在,当我单击一个项目时,它会改变它的颜色,当我单击另一个列表项时,前一个项目保持彩色。我想一次为 1 个列表项着色。我该怎么做?
这是我的代码...
MainActivity.java:
public class MainActivity extends AppCompatActivity {
ListView listViewTop, listViewBottom;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listViewTop = (ListView) findViewById(R.id.list1);
listViewBottom = (ListView) findViewById(R.id.list2);
CustomAdapter customAdapter = new CustomAdapter(this, addUsersToList());
listViewTop.setAdapter(customAdapter);
listViewBottom.setAdapter(customAdapter);
}
private ArrayList<Model> addUsersToList() {
ArrayList<Model> modelList = new ArrayList<>();
modelList.add(new Model("John"));
modelList.add(new Model("Mary"));
modelList.add(new Model("Bob"));
modelList.add(new Model("Tom"));
modelList.add(new Model("Danny"));
modelList.add(new Model("Mike"));
modelList.add(new Model("Ron"));
modelList.add(new Model("Harry"));
modelList.add(new Model("Dan"));
return modelList;
}
}
CustomAdapter.java:
public class CustomAdapter extends ArrayAdapter<Model> {
private static class ViewHolder {
TextView userTextView;
}
public CustomAdapter(Context context, ArrayList<Model> usersArray) {
super(context, 0, usersArray);
}
@NonNull
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final Model currentUser = getItem(position);
View userRowView = convertView;
final ViewHolder viewHolder;
if (userRowView == null) {
viewHolder = new ViewHolder();
userRowView = LayoutInflater.from(getContext()).inflate(
R.layout.user_layout, parent, false);
viewHolder.userTextView = (TextView) userRowView.findViewById(R.id.userTextView);
final View finalUserRowView = userRowView;
viewHolder.userTextView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
currentUser.setClicked(true);
finalUserRowView.setBackgroundColor(Color.YELLOW);
}
});
userRowView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) userRowView.getTag();
}
viewHolder.userTextView.setText(currentUser.getUserName());
if (currentUser.isClicked())
userRowView.setBackgroundColor(Color.YELLOW);
else
userRowView.setBackgroundColor(Color.WHITE);
return userRowView;
}
}
模型.java:
public class Model {
private String userName;
private boolean isClicked;
public Model(String userName) {
this.userName = userName;
}
public String getUserName() {
return userName;
}
public boolean isClicked() {
return isClicked;
}
public void setClicked(boolean clicked) {
isClicked = clicked;
}
}
编辑:解决了我的问题,感谢您的帮助。这是我的适配器:
private static Model mSelectedUser = null;
private static class ViewHolder {
TextView userTextView;
}
public CustomAdapter(Context context, ArrayList<Model> usersArray) {
super(context, 0, usersArray);
}
@NonNull
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final Model currentUser = getItem(position);
View userRowView = convertView;
final ViewHolder viewHolder;
if (userRowView == null) {
viewHolder = new ViewHolder();
userRowView = LayoutInflater.from(getContext()).inflate(
R.layout.user_layout, parent, false);
viewHolder.userTextView = (TextView) userRowView.findViewById(R.id.userTextView);
userRowView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) userRowView.getTag();
}
viewHolder.userTextView.setText(currentUser.getUserName());
userRowView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mSelectedUser != null)
mSelectedUser.setClicked(false);
mSelectedUser = currentUser;
mSelectedUser.setClicked(true);
notifyDataSetChanged();
}
});
if (currentUser.isClicked()) {
userRowView.setBackgroundColor(Color.YELLOW);
((ListView) parent).setSelection(position);
parent.requestFocus();
}
else
userRowView.setBackgroundColor(Color.TRANSPARENT);
return userRowView;
}
【问题讨论】:
-
没有适合你的解决方案??
-
不是我真正想要的,我用解决方案编辑了我的原始帖子。
标签: android