coolcat
coolcat

Reputation: 79

Listview On Multiple Button Clicks

I have 10 image buttons in one activity.Each button when clicked will start a new activity in this layout i want to have a list view that doesn't fill the full layout.So am guessing it would have to be a custom one.

  package com.baha.beallhasall;

  import android.app.Activity;
  import android.content.Intent;
  import android.os.Bundle;
  import android.view.View;
  import android.view.View.OnClickListener;
  import android.widget.ArrayAdapter;
  import android.widget.ImageButton;
    import android.widget.ListView;

    public class FirstActivityPage extends Activity implements OnClickListener{

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.act_one);
    ImageButton btn1 = (ImageButton)findViewById(R.id.imageButton1);
    ImageButton btn2 = (ImageButton)findViewById(R.id.imageButton2);
    ImageButton btn3 = (ImageButton)findViewById(R.id.imageButton3);
    ImageButton btn4 = (ImageButton)findViewById(R.id.imageButton4);
    ImageButton btn5 = (ImageButton)findViewById(R.id.imageButton5);
    ImageButton btn6 = (ImageButton)findViewById(R.id.imageButton6);
    btn1.setOnClickListener(this);
    btn2.setOnClickListener(this);
    btn3.setOnClickListener(this);
    btn4.setOnClickListener(this);
    btn5.setOnClickListener(this);
    btn6.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
         switch(v.getId()){
        case R.id.imageButton1:
            Intent intent0 = new Intent(FirstActivityPage.this, FourActivityPage.class);
            startActivity(intent0);
            break;
        case R.id.imageButton2:
            Intent intent1 = new Intent(FirstActivityPage.this, FourActivityPage.class);
            startActivity(intent1);
            break;
        case R.id.imageButton3:
            Intent intent2 = new Intent(FirstActivityPage.this, FiveActivityPage.class);
            startActivity(intent2);
            break;
        case R.id.imageButton4:
            Intent intent3 = new Intent(FirstActivityPage.this, SixActivityPage.class);
            startActivity(intent3);
            break;
        case R.id.imageButton5:
            Intent intent4 = new Intent(FirstActivityPage.this, SevenActivityPage.class);
            startActivity(intent4);
            break;
        case R.id.imageButton6:
            Intent intent5 = new Intent(FirstActivityPage.this, ThirdActivityPage.class);
            startActivity(intent5);
            break;
    }
   }

private void setListAdapter(ArrayAdapter<String> arrayAdapter) {
    // TODO Auto-generated method stub

}

private ListView getListView() {
    // TODO Auto-generated method stub
    return null;
}
     }

This is my first activity that has the on clicks for my buttons.Is it possible to have my list view for all my image button activity's in there own class and not in this case statement.Because am thinking this what i have here with all the code for buttons is fine but i don't really think that one class should handle all this code.So which is the best way round this.

http://img17.imageshack.us/img17/4936/0b8o.jpg This image is just my project layout.

http://img594.imageshack.us/img594/9373/a7l8.png This image is what am trying to put in words but as i am new in this code world its easier to show you guys this way.

Thanks

NEW CODE

      package com.example.testtest;

 import android.app.Activity;
 import android.content.Intent;
 import android.os.Bundle;
 import android.view.View;
 import android.view.View.OnClickListener;
 import android.widget.ArrayAdapter;
 import android.widget.ImageButton;
 import android.widget.ListView;

  public class MainActivity extends Activity implements OnClickListener{

  @Override
   protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.layout_of_button);
  ImageButton btn1 = (ImageButton)findViewById(R.id.imageButton1);
  ImageButton btn2 = (ImageButton)findViewById(R.id.imageButton2);
  ImageButton btn3 = (ImageButton)findViewById(R.id.imageButton3);
  ImageButton btn4 = (ImageButton)findViewById(R.id.imageButton4);
  ImageButton btn5 = (ImageButton)findViewById(R.id.imageButton5);
  ImageButton btn6 = (ImageButton)findViewById(R.id.imageButton6);
  btn1.setOnClickListener(this);
  btn2.setOnClickListener(this);
  btn3.setOnClickListener(this);
  btn4.setOnClickListener(this);
  btn5.setOnClickListener(this);
  btn6.setOnClickListener(this);
   }

   @Override
   public void onClick(View v) {
    switch(v.getId()) {
    // if one of the image buttons is pressed...
    case R.id.imageButton1:
    case R.id.imageButton2:
    case R.id.imageButton3:
    case R.id.imageButton4:
    case R.id.imageButton5:
    case R.id.imageButton6:   
        Intent intent = new Intent(this, Listviewact.class);
        // pass ID of pressed button to listview-activity
        intent.putExtra("buttonId", v.getId());  
        startActivity(intent);
        break;
    // here you could place handling of other clicks if necessary...        
    }
    }

    private void setListAdapter(ArrayAdapter<String> arrayAdapter) {
      // TODO Auto-generated method stub

   }

    private ListView getListView() {
     // TODO Auto-generated method stub
     return null;
 }
      }

listviewact

        package com.example.testtest;

  import android.app.Activity;
  import android.os.Bundle;
  import android.widget.ArrayAdapter;
  import android.widget.ImageView;
  import android.widget.ListView;

   public class Listviewact extends Activity {

public void onCreate(Bundle b) {
    super.onCreate(b);
    setContentView(R.layout.listview_layout);
  }

  public void onResume() {
    super.onResume();
    int buttonId = getIntent().getIntExtra("buttonId", 0);
    int buttonIdx = getButtonIdx(buttonId);

    // find and set image according to buttonId
    int imageId = IMAGE_IDS[buttonIdx];        // image to show for given button
    ImageView imageView = (ImageView)findViewById(R.id.imageView1);
    imageView.setImageResource(imageId);

    // find and set listview imtes according to buttonId
    String[] items = LISTVIEW_DATA[buttonIdx]; // listview items to show for given button
    ListView listView = (ListView)findViewById(R.id.listView1);
    ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, items);
    setListAdapter(adapter);
   }

    private void setListAdapter(ArrayAdapter adapter) {
    // TODO Auto-generated method stub

}

// a little helper to map ids to array indices 
   // to be able to fetch the correct image and listview data later
   private final static int[] BUTTON_IDS = new int[] {
    R.id.imageButton1, 
    R.id.imageButton2, 
    R.id.imageButton3, 
    R.id.imageButton4, 
    R.id.imageButton5, 
    R.id.imageButton6
  };

  // 6 images
  private final static int[] IMAGE_IDS = new int[] {
    R.drawable.ic_launcher,
    R.drawable.ic_launcher,
    R.drawable.ic_launcher,
    R.drawable.ic_launcher,
    R.drawable.ic_launcher,
    R.drawable.ic_launcher
  };

  // 6 different sets of strings for the listviews
   private final static String[][] LISTVIEW_DATA = new String[][] {
    {"First A", "First B", "First C"},
    {"Second A", "Second B", "Second C"},
    {"Third A", "Third B", "Third C"},
    {"Forth A", "Forth B", "Forth C"},
    {"Fifth A", "Fifth B", "Fifth C"},
    {"Sixth A", "Sixth B", "Sixth C"},
   };

   // map button id to array index
  static private int getButtonIdx(int id) {
    for(int i = 0; i<BUTTON_IDS.length; i++) {
        if (BUTTON_IDS[i] == id) return i;
    }
    return 0;    // should not happen
   }
   }

Listview xml

         <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >

<ImageView
    android:id="@+id/imageView1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="55dp"
    android:src="@drawable/ic_launcher" />

<ListView
    android:id="@+id/listView1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_below="@+id/imageView1"
    android:layout_centerHorizontal="true"
    android:layout_marginTop="125dp" >
  </ListView>

  </RelativeLayout>

I started this new project cos i didn't want to mess up my other project.I hope am close but when i click on the first image button nothing happens.

http://img836.imageshack.us/img836/1549/jo81.jpg LOGCAT

Upvotes: 0

Views: 760

Answers (1)

Ridcully
Ridcully

Reputation: 23655

The image of what you want to achieve is a good idea.

I suggest you have only one second activity for showing your layout with the image on top and the listview at the bottom. You can pass information on which image to show and which data to show in the listview to that activity from your first (image-button) activity. This is done by putting the information into the Intent object using the putExtra() methods.

Then in the second activity, you read that information from the Intent and act accordingly by setting the image and initializing the Adapter of the Listview.

Btw., you do not need a custom ListView for that layout, just use a LinearLayout and put a ImageView and a ListView into it.

Example Code

I added some example code, that should explain how to do it. It's not tested, so there might well be typos or ommisions in there, but it should at least give you a start and an idea how to do it.

Main Activity

In your main-activity do this, to pass the ID of the pressed button along to the listview-activity.

public void onClick(View v) {
    switch(v.getId()) {
    // if one of the image buttons is pressed...
    case R.id.imageButton1:
    case R.id.imageButton2:
    case R.id.imageButton3:
    case R.id.imageButton4:
    case R.id.imageButton5:
    case R.id.imageButton6:   
        Intent intent = new Intent(this, MyListViewActivity.class);
        // pass ID of pressed button to listview-activity
        intent.putExtra("buttonId", v.getId());  
        startActivity(intent);
        break;
    // here you could place handling of other clicks if necessary...        
    }
}

MyListViewActivity

This will be your second activity, which I called ListViewActivity here. In onResume() we check for the extra data in the intent (any Activity has an Intent by which it got started).

public MyListViewActivity extends Activity {

    public void onCreate(Bundle b) {
        super.onCreate(b);
        setContentView(R.layout.activity_mylistview);
    }

    public void onResume() {
        super.onResume();
        int buttonId = getIntent().getIntExtra("buttonId", 0);
        int buttonIdx = getButtonIdx(buttonId);

        // find and set image according to buttonId
        int imageId = IMAGE_IDS[buttonIdx];        // image to show for given button
        ImageView imageView = (ImageView)findViewById(R.id.imageView);
        imageView.setImageResource(imageId);

        // find and set listview imtes according to buttonId
        String[] items = LISTVIEW_DATA[buttonIdx]; // listview items to show for given button
        ListView listView = (ListView)findViewById(R.id.listView);
        ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, items);
        listView.setListAdapter(adapter);
    }

    // a little helper to map ids to array indices 
    // to be able to fetch the correct image and listview data later
    private final static int[] BUTTON_IDS = new int[] {
        R.id.imageButton1, 
        R.id.imageButton2, 
        R.id.imageButton3, 
        R.id.imageButton4, 
        R.id.imageButton5, 
        R.id.imageButton6
    };

    // 6 images
    private final static int[] IMAGE_IDS = new int[] {
        R.drawable.image1,
        R.drawable.image2,
        R.drawable.image3,
        R.drawable.image4,
        R.drawable.image5,
        R.drawable.image6
    };

    // 6 different sets of strings for the listviews
    private final static String[][] LISTVIEW_DATA = new String[][] {
        {"First A", "First B", "First C"},
        {"Second A, "Second B", Second C"},
        {"Third A, "Third B", Third C"},
        {"Forth A, "Forth B", Forth C"},
        {"Fifth A, "Fifth B", Fifth C"},
        {"Sixth A, "Sixth B", Sixth  C"},
    };

    // map button id to array index
    static private int getButtonIdx(int id) {
        for(int i = 0; i<BUTTON_IDS.length; i++) {
            if (BUTTON_IDS[i] == id) return i;
        }
        return 0;    // should not happen
    }
}

*activity_mylistview.xml*

A simple example for the layout you wanted in your second picture, you'll want to improve this.

<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
>
    <ImageView
       android:id="imageView"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
    />
    <ListView
       android:id="listView"
       android:layout_width="fill_parent"
       android:layout_height="0dp"
       android:layout_weight="1"
    />
</LinearLayout>

Upvotes: 0

Related Questions