如何从具有拖放功能的多个Imageview中选择ImageView ID

时间:2017-01-03 08:18:46

标签: java android

我刚开始研究android,而且我对这项技术比较陌生。我制作了3个具有拖放功能的水平卷轴,我想将它们拖放到某个区域,同时保持失败和成功掉落的数量。到目前为止,我完成了一切,但代码并没有那么有效,而且我认为这种方法并不是最好的方法。我想知道更有效的方法来解决这个问题。

我的activity_main.xml的一部分

<HorizontalScrollView
    android:id="@+id/horizontalScrollView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:scrollbars="horizontal">

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:onClick="onTouch">

        <ImageView
            android:id="@+id/b1"
            android:layout_width="200px"
            android:layout_height="200px"
            android:layout_gravity="center"
            android:layout_margin="20dp"
            android:src= "@drawable/a1"/>

        <ImageView
            android:id="@+id/b2"
            android:layout_width="200px"
            android:layout_height="200px"
            android:layout_gravity="center"
            android:layout_margin="20dp"
            android:src= "@drawable/a2"/>

        <ImageView
            android:id="@+id/b3"
            android:layout_width="200px"
            android:layout_height="200px"
            android:layout_gravity="center"
            android:layout_margin="20dp"
            android:src= "@drawable/a3"/>

        <ImageView
            android:id="@+id/b4"
            android:layout_width="200px"
            android:layout_height="200px"
            android:layout_gravity="center"
            android:layout_margin="20dp"
            android:src= "@drawable/a4"/>

        <ImageView
            android:id="@+id/b5"
            android:layout_width="200px"
            android:layout_height="200px"
            android:layout_gravity="center"
            android:layout_margin="20dp"
            android:src= "@drawable/a5"/>

        <ImageView
            android:id="@+id/b6"
            android:layout_width="200px"
            android:layout_height="200px"
            android:layout_gravity="center"
            android:layout_margin="20dp"
            android:src= "@drawable/a6"/>

        <ImageView
            android:id="@+id/b7"
            android:layout_width="200px"
            android:layout_height="200px"
            android:layout_gravity="center"
            android:layout_margin="20dp"
            android:src= "@drawable/a7"/>

        <ImageView
            android:id="@+id/b8"
            android:layout_width="200px"
            android:layout_height="200px"
            android:layout_gravity="center"
            android:layout_margin="20dp"
            android:src= "@drawable/a9"/>

        <ImageView
            android:id="@+id/b9"
            android:layout_width="200px"
            android:layout_height="200px"
            android:layout_gravity="center"
            android:layout_margin="20dp"
            android:src= "@drawable/a10"/>

        <ImageView
            android:id="@+id/b10"
            android:layout_width="200px"
            android:layout_height="200px"
            android:layout_gravity="center"
            android:layout_margin="20dp"
            android:src= "@drawable/a8"/>
    </LinearLayout>

</HorizontalScrollView>

和MainActivity.java

public class MainActivity extends Activity {

    int id;
    ImageView drag;
    LinearLayout drop;
    TextView text, success, fail;
    int total, failure, succ = 0, i;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);




        drag = (ImageView) findViewById(id);

        drag.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent arg1) {
                // TODO Auto-generated method stub
                ClipData data = ClipData.newPlainText("", "");
                View.DragShadowBuilder shadow = new View.DragShadowBuilder(drag);
                v.startDrag(data, shadow, null, 0);
                return false;
            }
        });


        drop = (LinearLayout) findViewById(R.id.bottomlinear);
        text = (TextView) findViewById(R.id.Total);
        success = (TextView) findViewById(R.id.Success);
        fail = (TextView) findViewById(R.id.Fail);

        drop.setOnDragListener(new View.OnDragListener() {

            @Override
            public boolean onDrag(View v, DragEvent event) {
                // TODO Auto-generated method stub
                final int action = event.getAction();
                switch (action) {

                    case DragEvent.ACTION_DRAG_STARTED:
                        break;

                    case DragEvent.ACTION_DRAG_EXITED:
                        break;

                    case DragEvent.ACTION_DRAG_ENTERED:
                        break;

                    case DragEvent.ACTION_DROP:
                        {
                            succ = succ + 1;
                            return (true);
                        }

                    case DragEvent.ACTION_DRAG_ENDED:
                        {
                            total = total + 1;
                            int failure = total - succ;
                            success.setText("Sucessful Drops :" + succ);
                            text.setText("Total Drops: " + total);
                            fail.setText("Failed Drops: " + failure);
                            return (true);

                        }

                    default:
                        break;
                }
                return true;
            }
        });
    }
}

以上代码仅适用于第一个图像视图,我需要一个支持所有这些代码的解决方案。我尝试使用带有for循环的ImageView数组但只返回最后一个ImageView。我真的很感激这方面的一些帮助。

4 个答案:

答案 0 :(得分:2)

为了不完全改变你的实现我将使用方法获得id的参数imageView

void dragAndDropImage(String imageId){

  // get int id from String
  int id = getResources().getIdentifier(imageId, "id", getPackageName());

  //here Your drag and drop functionality code
  ImageView drag = (ImageView) findViewById(id);

  //... rest of code

}

使用它:

for (int i=1; i<=10; i++){

    //loop over every imageView ( from 1 to 10 )
    dragAndDropImage("b"+i);

}

几乎没有重构说明:

  • drop, text, success, fail个视图应存储在某个类属性中,以避免每次都执行findViewById
  • 拖动touchListener应该是一些活动的子类
  • onDragListener也应该是一些活动的子类

答案 1 :(得分:1)

我认为您应该使用Horizontal Recyclerview

此链接有助于纵向回收查看Verticle Reclyclerview drag and drop

然后在

中进行一些修改

在recylerview中将布局管理器设置为水平

 mRecyclerView.setHasFixedSize(true);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(mActivity, LinearLayoutManager.HORIZONTAL, false)); 
带有recylerview的水平列表的

LinearLayoutManager.HORIZONTAL

您将获得演示的SimpleItemTouchHelperCallback课程表格 和修改后的方法getMovementFlags方法如

 @Override
    public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {

            final int dragFlags = ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT;
            final int swipeFlags = 0;
            return makeMovementFlags(dragFlags, swipeFlags);

    }

希望这能帮到你

答案 2 :(得分:1)

我为此使用了一个数组,但主要问题是无论我选择什么,我总是得到最后一个图像视图。使用'final'关键字解决了此问题。

final ImageView drag = (ImageView)findViewById(id);

这导致我获得了关于拖动的不同图像视图。所有回复都表示赞赏。

答案 3 :(得分:1)

在拖动侦听器中,您可以传递传递空值的对象类型。

drag.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent arg1) {

                PassObject object=new PassObject();
                 object.setId("id");
                 // TODO Auto-generated method stub
                ClipData data = ClipData.newPlainText("", "");
                View.DragShadowBuilder shadow = new View.DragShadowBuilder(drag);
                v.startDrag(data, shadow, object, 0);
                return false;
            }
        });

在Listener中你正在实施它们,你可以得到它。

drop.setOnDragListener(new View.OnDragListener(){

        @Override
        public boolean onDrag(View v, DragEvent event) {
            // TODO Auto-generated method stub
            final int action = event.getAction();
            switch (action) {

                case DragEvent.ACTION_DRAG_STARTED:
                    break;

                case DragEvent.ACTION_DRAG_EXITED:
                    break;

                case DragEvent.ACTION_DRAG_ENTERED:
                    break;

                case DragEvent.ACTION_DROP:
                    {
                        //succ = succ + 1;
                        return (true);
                    }

                case DragEvent.ACTION_DRAG_ENDED:
                    {
            PassObject passObject = (PassObject) event.getLocalState();
                String id=passobject.getID();
                        return true;

                    }

                default:
                    break;
            }
            return true;
        }
    });
}