GridViewの実装について質問があります。私のプロジェクトで作成されたGridViewは、3X3グリッドビューです。各グリッドは乱数で構成されています。このグリッドビューは本格的な3X3グリッドではなく、グリッドビューには8つのグリッドしかありません。その理由は、ユーザーが空のグリッドプレースホルダーの横にあるグリッドにタッチし、タッチしたグリッドが空のグリッドプレースホルダーに移動して、現在のグリッドが空になるスライディングゲームパズルを作成しているためです。これにより、タッチしたときに他のグリッドをここに配置できます。スライディングゲーム を参照してください。
以下はこのためのコードです:
アクティビティ
public class SlidingGameActivity extends Activity {
GridView gridView;
GridAdapter adapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sliding_game);
gridView = (GridView)findViewById(R.id.gridView);
adapter = new GridAdapter(this);
gridView.setAdapter(adapter);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_sliding_game, menu);
return true;
} }
アダプタ
public class GridAdapter extends BaseAdapter {
Context context;
LayoutInflater mInflater;
int num ;
Integer[] numbers = {1,2,3,4,5,6,7,8} ;
public GridAdapter(Context context){
this.context = context;
mInflater = LayoutInflater.from(context);
numbers = storeRandomNumbers(8);
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return numbers.length;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
GridDragListener dragListener = new GridDragListener();
GridTouchListener touchListener = new GridTouchListener();
if(convertView == null){
convertView = mInflater.inflate(R.layout.block, null);
holder = new ViewHolder();
holder.block = (RelativeLayout)convertView.findViewById(R.id.block);
holder.img = (ImageView)convertView.findViewById(R.id.blue_rect);
holder.textView = (TextView)convertView.findViewById(R.id.number);
convertView.setTag(holder);
}else{
holder = (ViewHolder)convertView.getTag();
}
holder.block.setOnTouchListener(touchListener);
holder.block.setOnDragListener(dragListener);
holder.img.setImageResource(R.drawable.blue_rectangle);
holder.textView.setText(String.valueOf(numbers[position]));
return convertView;
}
static class ViewHolder{
RelativeLayout block;
ImageView img;
TextView textView;
}
public ArrayList<Integer> randomize(int size){
Random random = new Random();
ArrayList<Integer> generated = new ArrayList<Integer>();
for(int i = 0; i < size; i++){
while(true){
Integer next = random.nextInt(size) + 1;
if(!generated.contains(next)){
generated.add(next);
break;
}
}
}
return generated;
}
public Integer[] storeRandomNumbers(int size){
ArrayList<Integer> list = randomize(size);
Collections.shuffle(list);
Integer[] nums = new Integer[size];
list.toArray(nums);
return nums;
}
}
タッチリスナー
public class GridTouchListener implements View.OnTouchListener{
@Override
public boolean onTouch(View view, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
ClipData data = ClipData.newPlainText("", "");
DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
view.startDrag(data, shadowBuilder, view, 0);
view.setVisibility(View.VISIBLE);
return true;
} else {
view.setVisibility(View.VISIBLE);
return false;
}
}
}
私の質問
1.グリッドビューでその空のグリッドプレースホルダーを決定する方法は?
2.タッチしたグリッドを空のグリッドプレースホルダーに配置するにはどうすればよいですか?
私が提供したコードを参照してください。誰かがこのアイデアを実装し、独自のコードまたはアイデアや提案を持っている場合は、それを提供してください。