【发布时间】:2016-08-25 05:08:39
【问题描述】:
我有一个包含文本和图像的网格视图。当用户触摸网格中的单元格时,它会更改颜色以显示它已被选中,当再次选择时,它会返回默认颜色以显示它不再被选中。可以选择任意数量的单元格。问题是当用户必须滚动网格以查看所有图标时,所选图标有时会变为未选择并选择“随机”其他单元格。 我怀疑这与被回收的网格视图有关,但我不确定如何解决这个问题。
public class Onboarding extends Activity {
GridView grid;
ArrayList selectedCategories = new ArrayList<>();
CustomGrid adapter;
String[] dummyString = {
"item 1",
"item 2",
"item 3",
"item 4",
"item 5",
"item 6",
"item 7",
"item 8",
"item 9",
"item 10",
"item 11",
"item 12",
"item 13",
"item 14",
"item 15",
"item 16",
"item 17",
"item 18",
"item 19"
};
int[] imageId = {
R.drawable.1,
R.drawable.2,
R.drawable.3,
R.drawable.4,
R.drawable.5,
R.drawable.6,
R.drawable.7,
R.drawable.8,
R.drawable.9,
R.drawable.10,
R.drawable.11,
R.drawable.12,
R.drawable.13,
R.drawable.14,
R.drawable.15,
R.drawable.16,
R.drawable.17,
R.drawable.18,
R.drawable.19
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_onboarding);
getWindow().setSoftInputMode(
WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN
); //makes sure keyboard is hidden on this view as it is not needed
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);
grid = (GridView) findViewById(R.id.grid);
//deals with settings the number of Columns
DisplayMetrics displayMetrics = this.getResources().getDisplayMetrics();
double dpWidth = displayMetrics.widthPixels / displayMetrics.density;
if (dpWidth <= 400) {
grid.setNumColumns(2);
} else if (dpWidth > 400 && dpWidth < 500) {
grid.setNumColumns(3);
} else if (dpWidth >= 500 && dpWidth < 550) {
grid.setNumColumns(4);
} else {
grid.setNumColumns(5);
}
adapter = new CustomGrid(Onboarding.this, dummyString, imageId);
grid.setAdapter(adapter);
grid.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
//the position is the actual position that is pressed. but the getChildAt returns gets the relative position, ie what's being drawn
//on the grid.
//to fix this, the first visible position is obtained and the difference is subtracted
int firstPos = grid.getFirstVisiblePosition();
View tv = grid.getChildAt(position - firstPos);
Toast.makeText(Onboarding.this, "You Clicked at position" + position + " " + dummyString[+position] + "firstPos " + firstPos, Toast.LENGTH_SHORT).show(); //debug
if (tv == null) { //this shouldn't/doesn't happen
Log.e("OnBoarding.java", "Issue with null view at line " + Thread.currentThread().getStackTrace()[2].getLineNumber() +
"grid is having a problem");
return;
}
if (selectedCategories.contains(dummyString[+position]) == false) {//add the item if it doesn't exist
selectedCategories.add(dummyString[+position]);
tv.setBackgroundColor(Color.parseColor("#FFE5CD"));
} else { //remove the item if it already exists, as the user is removing it by touching it again
selectedCategories.remove(dummyString[+position]);
tv.setBackgroundColor(Color.parseColor("#EEEEEE"));
}
}
});
}
}
public class CustomGrid extends BaseAdapter {
private Context mContext;
private final String[] genreString;
private final int[] Imageid;
public CustomGrid(Context c, String[] genreString, int[] Imageid) {
mContext = c;
this.Imageid = Imageid;
this.genreString = genreString;
}
@Override
public int getCount() {
return genreString.length;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View grid;
LayoutInflater inflater = (LayoutInflater) mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
TextView textView;
ImageView imageView;
if (convertView == null) {
grid = inflater.inflate(R.layout.grid_single, null);
} else {
grid = convertView;
}
textView = (TextView) grid.findViewById(R.id.grid_text);
imageView = (ImageView) grid.findViewById(R.id.grid_image);
textView.setText(genreString[position]);
imageView.setImageResource(Imageid[position]);
return grid;
}
}
【问题讨论】:
标签: java android android-layout gridview