nag
nag

Reputation: 667

How to Get Child position for Linear layout

I have a LinearLayout, which contains several child ImageView (Added ImageViews Dynamically to LinearLayout Horizontally). How can I get position of child views of that LinerLayout when doing Long press the child view(ImageView)?

Added setTag:

 image.setImageBitmap(resizedBitmap);
 image.setTag(fullUrl);



imageViewLinearLayout.setOnLongClickListener(new View.OnLongClickListener(){
     @Override
     public boolean onLongClick(View v) {

          Log.d("Mobi","Path :"+v.getTag());

          return false;
       }
 });

Added set Tag as file path but return v.getTag() as null"?

Upvotes: 1

Views: 9095

Answers (5)

Nandhakumar N
Nandhakumar N

Reputation: 91

add this test.xml

<?xml version="1.0" encoding="utf-8"?>
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <Button
        android:id="@+id/btnAddImage"
        style="?android:attr/buttonStyleSmall"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Add Image" />

    <HorizontalScrollView
        android:layout_width="fill_parent"
        android:layout_height="0dp"
        android:layout_weight="1.5"
        android:fadingEdge="none"
        android:orientation="horizontal" >

        <LinearLayout
            android:id="@+id/lnrParent"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >
        </LinearLayout>
    </HorizontalScrollView>

</TableLayout>

and another layout lay_image.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/lnrChild"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

    <Button
        android:id="@+id/btnExample"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />

    <ImageView
        android:id="@+id/imgView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="50sp"
        android:src="@drawable/ic_launcher" />

</LinearLayout>

and here coding

setContentView(R.layout.test);

        final LinearLayout LnrLayout = (LinearLayout) findViewById(R.id.lnrParent);

        Button BtnAddImage = (Button) findViewById(R.id.btnAddImage);

        BtnAddImage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final LinearLayout LnrChildLayout = (LinearLayout) getLayoutInflater()
                        .inflate(R.layout.lay_image, null);
                LnrChildLayout.setLayoutParams(new LayoutParams(
                        ViewGroup.LayoutParams.MATCH_PARENT,
                        ViewGroup.LayoutParams.WRAP_CONTENT));

                LnrLayout.addView(LnrChildLayout);

                int indexValue = LnrLayout.indexOfChild(LnrChildLayout);
                LnrChildLayout.setTag(Integer.toString(indexValue));

                final ImageView ImgView = (ImageView) LnrChildLayout
                        .findViewById(R.id.imgView);

                int ImagePosition = LnrChildLayout.indexOfChild(ImgView);
                ImgView.setTag(Integer.toString(ImagePosition));

                ImgView.setOnLongClickListener(new OnLongClickListener() {
                    @Override
                    public boolean onLongClick(View v) {

                        // get Position
                        String strPosition = (String) v.getTag();
                        Toast.makeText(test.this,
                                "ImageView getTag : >" + strPosition,
                                Toast.LENGTH_SHORT).show();
                        // getId
                        int strId = v.getId();
                        Toast.makeText(test.this,
                                "ImageView getId : >" + strId,
                                Toast.LENGTH_SHORT).show();

                        return true;

                    }
                });

                LnrChildLayout
                        .setOnLongClickListener(new OnLongClickListener() {
                            @Override
                            public boolean onLongClick(View v) {

                                String strPosition = (String) v.getTag();
                                Toast.makeText(test.this, "" + strPosition,
                                        Toast.LENGTH_SHORT).show();

                                return true;
                            }
                        });

                Button BtnExample = (Button) LnrChildLayout
                        .findViewById(R.id.btnExample);
                int ButtonPosition = LnrChildLayout.indexOfChild(BtnExample);
                BtnExample.setTag(Integer.toString(ButtonPosition));

                BtnExample.setOnLongClickListener(new OnLongClickListener() {
                    @Override
                    public boolean onLongClick(View v) {

                        String strPosition = (String) v.getTag();
                        Toast.makeText(test.this,
                                "Button getTag : >" + strPosition,
                                Toast.LENGTH_SHORT).show();

                        int strId = v.getId();
                        Toast.makeText(test.this, "Button getId : >" + strId,
                                Toast.LENGTH_SHORT).show();

                        return true;
                    }
                });

            }
        });

Upvotes: 3

Zubair Akber
Zubair Akber

Reputation: 2828

you can set the imageView position by using imageView.setTag(position) command and get it on Long press as position = (Integer)imageView.getTag().

Upvotes: 1

Swagata Acharyya
Swagata Acharyya

Reputation: 657

You can use indexOfChild method of a ViewGroup.

I build a small snippet to check your usecase (similar). I have three buttons dynamically added to a LinearLayout and then clickHandler attached to the buttons. You can make it generic to make it actually useful.

        // Other code
        final LinearLayout layout = (LinearLayout) findViewById(R.id.layout);
        final Button button = new Button(getApplicationContext());
        button.setText("Test");
        final Button button2 = new Button(getApplicationContext());
        button2.setText("Test2");
        final Button button3 = new Button(getApplicationContext());
        button3.setText("Test3");
        layout.addView(button);
        layout.addView(button2);
        layout.addView(button3);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                getIndex(layout, button);
            }
        });
// Other code

And in the method getIndex, here is the code:

private int getIndex(LinearLayout view, View childView) {
    Log.d("ViewIndex", "View index is" + view.indexOfChild(childView));
    return view.indexOfChild(childView);
}

Upvotes: 2

Pirisok
Pirisok

Reputation: 401

try this

list.setOnLongItemClickListener(new OnItemClickListener() {

        @Override
        public void onLongItemClick(AdapterView<?> arg0, View viewRow, int pos,
                long arg3) {
                int wantedPosition = pos; // Whatever position you're looking for
                int firstPosition = list.getFirstVisiblePosition() -   list.getHeaderViewsCount(); // This is the same as child #0
                int wantedChild = wantedPosition - firstPosition;
////////////////the wantedChild value , is your position
        }
    });

Upvotes: 0

denis_lor
denis_lor

Reputation: 6547

Add a Long press listener on your views dynamically, and then inside the interface of your listener use View.getLocationOnScreen() and/or getLocationInWindow().

Upvotes: 0

Related Questions