0

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.タッチしたグリッドを空のグリッドプレースホルダーに配置するにはどうすればよいですか?

私が提供したコードを参照してください。誰かがこのアイデアを実装し、独自のコードまたはアイデアや提案を持っている場合は、それを提供してください。

4

1 に答える 1

1
  1. グリッドビューで空のグリッドプレースホルダーを特定する方法は?

その位置を特定する必要はありません。単にその位置を監視することができます。たとえば、アダプターはint空のセルの位置を表すフィールドを持つことができます。最初は、このフィールドは次のようになります(最後のセルは開始時の空8のセルであると想定しています)。GridView空のセルの位置が変更された場合 (ドラッグなどによる) は常に、そのintフィールドを新しい位置で更新します。空のセルの位置を知る必要がある場合は、その int フィールドを見てください。

  1. タッチされたグリッドを空のグリッド プレースホルダーに配置する方法は?

ユーザーが空のセルにタッチしたビューをドラッグしたときに、これを行いたいと思います。ドラッグを開始すると、ビューが受信されますDragEvents(そのために を設定していることがわかりますOnDragListener)。空のセルの位置 (および でのそのビュー) がわかれば、 のアクションでGridView空のセルのビューを監視できます。その場合、ドラッグされたビューのデータを空のセル データと交換し、 を呼び出します。DragEventACTION_DROPnotifyDataSetChanged()

また、それを裏付ける配列に8つの数字があるため(空のセルを何らかの方法で表す必要があるため、おそらく最良の選択ではない)、アダプターには現在空のセルがないことに注意してください。空のセルを交換する余地があるように、9 つの値が必要です。

于 2013-01-25T17:41:34.367 に答える