2013-01-17 16 views
5

Chcę wypełnić dwa widoki listy w jednym działaniu. W tym celu umieściłem dwa listy odsłon w jednym układzie. Mój problem polega na tym, że oba widoki list są wypełnione, ale widoczny jest tylko jeden widok listy. Teraz, gdy wykonam jeden układ INVISIBLE, wyświetli on inny widok listy.Wiele listview w jednym układzie android

Tutaj zamieszczam mój plik xml. Czy jest jakiś problem w moim układzie? Proszę zaproponować rozwiązanie.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    android:paddingTop="10dp" 
    android:id="@+id/playlist_lyt" 
    > 

    <Button 
     android:id="@+id/btnAlbumwise" 
     android:text="View Albumwise" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"   
     /> 

    <RelativeLayout 
     android:id="@+id/layout_songlist" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:orientation="vertical" 
     android:paddingTop="10dp" 
     android:layout_below="@+id/layout_albumlist" 
     > 

     <EditText android:id="@+id/inputSearch" 
      android:layout_width="fill_parent" 
      android:layout_height="33dp" 
      android:hint="Search.." 
      android:inputType="textVisiblePassword" 
      android:cursorVisible="false" 
      android:background="@drawable/rounded_edittext" 
      android:layout_marginLeft="5dp" 
      android:layout_marginRight="5dp"    
     /> 

     <ListView 
      android:id="@android:id/list" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:divider="#000000" 
      android:dividerHeight="4dp" 
      android:listSelector="@drawable/list_selector" 
      android:layout_below="@+id/inputSearch" 
      android:paddingTop="8dp"/> 

    </RelativeLayout> 

    <RelativeLayout 
     android:id="@+id/layout_albumlist" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:orientation="vertical" 
     android:paddingTop="10dp" 
     android:layout_below="@+id/btnAlbumwise"   
     > 

     <ListView 
      android:id="@+id/liist" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:divider="#242424" 
      android:dividerHeight="1dp" 
      android:listSelector="@drawable/list_selector" 
     /> 
    </RelativeLayout> 
</RelativeLayout> 

Kod do wypełnienia listview "liist". PlaylistActivity.java

 Cursor cursor1 = managedQuery(MediaStore.Audio.Albums.EXTERNAL_CONTENT_URI, null,null, null, null); 
     if (cursor1 == null) 
     { 
      //Query Failed , Handle error. 
     } 
     else if (!cursor1.moveToFirst()) 
     { 
     //No media on the device. 
     } 
     else 
     { 
     // int albumName = cursor.getColumnIndex(MediaStore.Audio.Albums.ALBUM); 
      int id = cursor1.getColumnIndex(MediaStore.Audio.Albums._ID); 
      int albumartist = cursor1.getColumnIndex(MediaStore.Audio.Albums.ARTIST); 

      for(int i=0;i<cursor1.getCount();i++) 
      { 
       String Name = cursor1.getString(cursor1.getColumnIndex(MediaStore.Audio.Albums.ALBUM)); 
       Integer albumid = cursor1.getInt(id);      
       String artist = cursor1.getString(albumartist); 

       Bitmap bitmap = null; 
       bitmap = getArtwork(context, albumid); 
        lstImage.add(bitmap); 
        lstName.add(Name); 
        lstArtist.add(artist); 

       cursor1.moveToNext(); 
      } 
     } 
     cursor1.close();      

     rowItems = new ArrayList<RowItem>(); 
     for (int i = 0; i < lstName.size(); i++) { 
      RowItem item = new RowItem(lstImage.get(i), lstName.get(i) , lstArtist.get(i)); 
      rowItems.add(item); 
     }   
     CustomListViewAdapter adapter = new CustomListViewAdapter(PlayListActivity.this, 
       R.layout.list_item, rowItems); 
     lv1.setAdapter(adapter); 
     lv1.setOnItemClickListener(new OnItemClickListener() { 

      public void onItemClick(AdapterView<?> parent, View view, 
        int position, long id) { 
       // TODO Auto-generated method stub 
       RowItem item = rowItems.get(position); 
       String title = item.getTitle(); 
       Intent in = new Intent(PlayListActivity.this,AlbumsongListActivity.class); 

       // Sending songIndex to PlayerActivity 
       in.putExtra("albumTitle", title); 
       in.putExtra("list", 0); 
       in.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
       startActivity(in); 

      } 
     }); 

Teraz po kliknięciu na pozycji zaczyna inną aktywność Albumsonglistactivity.java

public class AlbumsongListActivity extends ListActivity { 
@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
String[] from = { "songTitle", "artist" }; 
     int[] to = { R.id.album_songTitle, R.id.album_songArtist }; 
     adapter = new SimpleAdapter(this, getAlbumSongList(context), 
       R.layout.albumsonglist_item, from, to) 
     { 
      public long getItemId(int position) 
      { 
       return songsListData.indexOf(getItem(position)); 
      } 
     }; 

     setListAdapter(adapter); 
     ListView lv = getListView(); 
     lv.setOnItemClickListener(new OnItemClickListener() 
     { 
      public void onItemClick(AdapterView<?> parent, View view, 
        int position, long id) 
      { 
       // getting listitem index 
       int songIndex = (int) id; 

       // Starting new intent 
       Intent in = new Intent(getApplicationContext(),MusicPlayertemp.class); 
       in.putExtra("songIndex", songIndex); 
       in.putExtra("albumtitle", albumName); 
       in.putExtra("listFlag", 3); 
       startActivity(in);    
      } 
     }); 
    } 

    public ArrayList<HashMap<String, String>> getAlbumSongList(Context c) 
    { 
     String whereClause = MediaStore.Audio.Media.ALBUM + " = ? "; 
     String s[] = new String[] { albumName }; 
     Cursor cursor = c.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, null, whereClause,s, MediaStore.Audio.Media.TITLE); 
     if (cursor == null) 
     { 
      // Query Failed , Handle error. 
     } 
     else if (!cursor.moveToFirst()) 
     { 
      // No media on the device. 
     } 
     else 
     { 
      int titleColumn = cursor.getColumnIndex(android.provider.MediaStore.Audio.Media.TITLE); 
      int idColumn = cursor.getColumnIndexOrThrow(android.provider.MediaStore.Audio.Media.DATA); 
      int artistcolumn = cursor.getColumnIndex(android.provider.MediaStore.Audio.Media.ARTIST); 
      albumid = cursor.getInt(cursor.getColumnIndex(android.provider.MediaStore.Audio.Media.ALBUM_ID)); 
      int id = cursor.getColumnIndex(android.provider.MediaStore.Audio.Media._ID); 
      for (int i = 0; i < cursor.getCount(); i++) 
      { 
       String thisTitle = cursor.getString(titleColumn); 
       String path = cursor.getString(idColumn); 
       String artist = cursor.getString(artistcolumn);   
       String ID = cursor.getString(id); 
       HashMap<String, String> song = new HashMap<String, String>(); 
       song.put("songTitle", thisTitle); 
       song.put("songPath", path); 
       song.put("artist", artist); 
       song.put("id", ID); 
       // Adding each song to SongList 
       songsList.add(song); 
       cursor.moveToNext(); 
      } 
     } 
     // looping through playlist 
     for (int i = 0; i < songsList.size(); i++) 
     { 
      // creating new HashMap 
      HashMap<String, String> song = songsList.get(i); 
      // adding HashList to ArrayList 
      songsListData.add(song); 
     } 
     return songsListData; 
    } 

W albumsonglistActivity, jeśli kliknięciu na pozycji nie powoływać ..

+0

w pierwszym widoku listy tylko 3 elementy są obecne, a także nie pokazują innego istview. Aby wyświetlić inny widok listy, muszę ukryć jeden układ. Następnie, po kliknięciu na drugi element listy, uruchomi on kolejną aktywność, która również zawiera listę, ale elementy listy nie reagują. Oznacza to, gdy klikam na dowolny element ... nie uruchamia zdarzenia onItemClick() ... – zanky

+0

Ustawiłeś słuchacza na viewview za pomocą setOnItemClickListener? – Dharmendra

+0

tak ... ustawiłem słuchacza. – zanky

Odpowiedz

3

ty nadały android:layout_height="fill_parent" obu układom względnym. dlatego nie możesz wyświetlić obu widoków list.

układ użycie liniowy i Używając wagi można podzielić ekran do wyświetlania zarówno listviews

2

spróbuj zaktualizować swój kod jak ten

<RelativeLayout 
    android:id="@+id/layout_songlist" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    android:paddingTop="10dp" 
    android:layout_below="@+id/layout_albumlist" 
    > 

    <EditText android:id="@+id/inputSearch" 
     android:layout_width="fill_parent" 
     android:layout_height="33dp" 
     android:hint="Search.." 
     android:inputType="textVisiblePassword" 
     android:cursorVisible="false" 
     android:background="@drawable/rounded_edittext" 
     android:layout_marginLeft="5dp" 
     android:layout_marginRight="5dp"    
    /> 

    <ListView 
     android:id="@android:id/list" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:divider="#000000" 
     android:dividerHeight="4dp" 
     android:listSelector="@drawable/list_selector" 
     android:layout_below="@+id/inputSearch" 
     android:paddingTop="8dp"/> 

</RelativeLayout> 

<RelativeLayout 
    android:id="@+id/layout_albumlist" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    android:paddingTop="10dp" 
    android:layout_below="@+id/btnAlbumwise"   
    > 

    <ListView 
     android:id="@+id/liist" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:divider="#242424" 
     android:dividerHeight="1dp" 
     android:listSelector="@drawable/list_selector" 
    /> 
</RelativeLayout> 
5

To jest problem, bo ustawiasz inny układ poniżej pierwszego jeden i pierwszy przyjmuje wysokość do fill_parent.

Powinieneś użyć Linear Layout i umieścić oba widoki list w środku i użyć właściwości layout_weight, aby wyświetlić obydwie listy w tej samej wysokości.

Na przykład można postępować zgodnie z poniższą hierarchią. Nie jest oryginalny kod ale to tylko struktura, które można wykorzystać do opracowania Twój układ

<LinearLayout orientation="verical"> 
    <ListView layout_weight=1></ListView> 
    <ListView layout_weight=1></ListView> 
</LinearLayout> 
+0

ok..but teraz, jeśli kliknę na element secondlistview, rozpoczyna on kolejną aktywność, która ma inny układ z listview i jest automatycznie populatd. Kiedy klikam na ten nowy element odsłon, nie uruchamia zdarzenia onItemCLick. Logcat pokazuje "nie można zapisać id of ...". Więc jaki jest problem ? – zanky

+0

@Zanky Wklej kod, aby lepiej zrozumieć swój problem. – Dharmendra

+0

Edytowałem moje pytanie .. mogę polecić mój kod ... – zanky

3

Dodaj

android:layout_weight = "1" 

zarówno RelativeLayouts zawierającego listView

2

Drugi układ jest fill_parent i pierwszy znajduje się pod nim. Więc nie można tego zobaczyć.

Zakładam, że chcesz coś takiego

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/playlist_lyt" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    android:paddingTop="10dp" > 

    <Button 
     android:id="@+id/btnAlbumwise" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="View Albumwise" /> 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:orientation="vertical" 
     android:paddingTop="10dp" 
     android:weightSum="1" > 

     <RelativeLayout 
      android:id="@+id/layout_albumlist" 
      android:layout_width="fill_parent" 
      android:layout_height="0dp" 
      android:layout_weight="0.5" > 

      <ListView 
       android:id="@+id/liist" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       android:divider="#242424" 
       android:dividerHeight="1dp" 
       android:listSelector="@drawable/list_selector" /> 
     </RelativeLayout> 

     <RelativeLayout 
      android:id="@+id/layout_songlist" 
      android:layout_width="fill_parent" 
      android:layout_height="0dp" 
      android:layout_weight="0.5" > 

      <EditText 
       android:id="@+id/inputSearch" 
       android:layout_width="fill_parent" 
       android:layout_height="33dp" 
       android:layout_marginLeft="5dp" 
       android:layout_marginRight="5dp" 
       android:background="@drawable/rounded_edittext" 
       android:cursorVisible="false" 
       android:hint="Search.." 
       android:inputType="textVisiblePassword" /> 

      <ListView 
       android:id="@android:id/list" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       android:layout_below="@+id/inputSearch" 
       android:divider="#000000" 
       android:dividerHeight="4dp" 
       android:listSelector="@drawable/list_selector" 
       android:paddingTop="8dp" /> 
     </RelativeLayout> 

    <RelativeLayout> 
</RelativeLayout> 
0

najlepszym rozwiązaniem jest to, aby utworzyć niestandardowy Scrollview i użyć go do zastąpić <ScrollView> z < in.parx.VerticalScrollView>

używać następujących dla VerticalScrollView.java

import android.content.Context; 
import android.util.AttributeSet; 
import android.util.Log; 
import android.view.MotionEvent; 
import android.widget.ScrollView; 

public class VerticalScrollView extends ScrollView{ 

    public VerticalScrollView(Context context) { 
     super(context); 
    } 

    public VerticalScrollView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public VerticalScrollView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    @Override 
    public boolean onInterceptTouchEvent(MotionEvent ev) { 
     final int action = ev.getAction(); 
     switch (action) 
     { 
      case MotionEvent.ACTION_DOWN: 
       Log.i("VerticalScrollview", "onInterceptTouchEvent: DOWN super false"); 
       super.onTouchEvent(ev); 
       break; 

      case MotionEvent.ACTION_MOVE: 
       return false; // redirect MotionEvents to ourself 

      case MotionEvent.ACTION_CANCEL: 
       Log.i("VerticalScrollview", "onInterceptTouchEvent: CANCEL super false"); 
       super.onTouchEvent(ev); 
       break; 

      case MotionEvent.ACTION_UP: 
       Log.i("VerticalScrollview", "onInterceptTouchEvent: UP super false"); 
       return false; 

      default: Log.i("VerticalScrollview", "onInterceptTouchEvent: " + action); break; 
     } 

     return false; 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent ev) { 
     super.onTouchEvent(ev); 
     Log.i("VerticalScrollview", "onTouchEvent. action: " +ev.getAction()); 
     return true; 
    } 
}