要解决Android GridView滚动后不保持选中状态的问题,可以使用以下方法:
public class GridViewAdapter extends BaseAdapter {
private Context mContext;
private List mData;
private int mSelectedPosition;
public GridViewAdapter(Context context, List data) {
mContext = context;
mData = data;
mSelectedPosition = -1;
}
public void setSelectedPosition(int position) {
mSelectedPosition = position;
notifyDataSetChanged();
}
@Override
public int getCount() {
return mData.size();
}
@Override
public Object getItem(int position) {
return mData.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = LayoutInflater.from(mContext).inflate(R.layout.grid_item, parent, false);
holder = new ViewHolder();
holder.textView = convertView.findViewById(R.id.text_view);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.textView.setText(mData.get(position));
// 设置选中状态
if (position == mSelectedPosition) {
holder.textView.setBackgroundColor(Color.RED);
} else {
holder.textView.setBackgroundColor(Color.WHITE);
}
return convertView;
}
private static class ViewHolder {
TextView textView;
}
}
public class MainActivity extends AppCompatActivity {
private GridView mGridView;
private GridViewAdapter mAdapter;
private int mLastVisiblePosition = -1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mGridView = findViewById(R.id.grid_view);
List data = new ArrayList<>();
for (int i = 0; i < 100; i++) {
data.add("Item " + i);
}
mAdapter = new GridViewAdapter(this, data);
mGridView.setAdapter(mAdapter);
mGridView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// Do nothing
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
// 记录最后一次可见的位置
mLastVisiblePosition = firstVisibleItem + visibleItemCount - 1;
}
});
mGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView> parent, View view, int position, long id) {
mAdapter.setSelectedPosition(position);
}
});
}
@Override
protected void onResume() {
super.onResume();
// 恢复选中状态
if (mLastVisiblePosition >= 0) {
mAdapter.setSelectedPosition(mLastVisiblePosition);
}
}
}
通过以上方法,当GridView滚动后,选中的项会保持选中状态。