【问题标题】:Multiple listviews in one layout android一个布局中的多个列表视图android
【发布时间】:2013-01-17 11:37:37
【问题描述】:

我想在一个活动中填充两个列表视图。为此,我在一个布局中放置了两个列表视图。我的问题是两个列表视图都已填充,但只有一个列表视图可见。现在,当我使一个布局不可见时,它将显示另一个列表视图。

我在这里发布我的 xml 文件。我的布局有什么问题吗?请提出解决方案。

<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>

填充列表视图“列表”的代码。 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);

            }
        });

现在,当我单击项目时,它会启动另一个活动 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;
    }

在专辑歌曲列表活动中,如果我点击它不会调用的项目..

【问题讨论】:

  • 在第一个列表视图中只有 3 个项目存在,然后它也不会显示另一个列表视图。要查看另一个列表视图,我必须隐藏一个布局。之后,如果我单击第二个列表视图项目,那么它将启动另一个也包含列表视图的活动,但此列表视图项目没有响应。这意味着当我点击任何项目时......它不会触发 onItemClick() 事件......
  • 您是否使用 setOnItemClickListener 将侦听器设置为 listview?
  • 是的...我已经设置了监听器。
  • 您是否通过在 onItemClickListener 方法中添加日志消息进行检查?
  • 我在 onItemClickListener 的每一行都设置了断点,但调试器并没有去那里。所以把日志信息放在里面是没有用的。

标签: android android-layout android-listview


【解决方案1】:

这是问题所在,因为您在第一个布局下方设置了另一个布局,而第一个布局将高度设置为 fill_parent。

您应该使用线性布局并将两个列表视图放在其中并使用 layout_weight 属性使两个列表视图具有相同的高度。

例如,您可以遵循以下层次结构。它不是原始代码,它只是一个结构,您可以使用它来开发您的布局

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

【讨论】:

  • 好的..但是现在,如果我单击 secondlistview 项目,它会启动另一个具有其他布局的活动,该布局具有列表视图并且它会自动填充。当我点击这个新的 listviews 项目时,它不会触发 onItemCLick 事件。 logcat 显示“无法保存...的 id”。那么问题出在哪里?
【解决方案2】:

您已将android:layout_height="fill_parent" 分配给两个相对布局。这就是您无法同时显示两个列表视图的原因。

使用线性布局并通过使用权重,您可以划分屏幕以显示两个列表视图

【讨论】:

    【解决方案3】:

    添加

    android:layout_weight = "1" 
    

    到包含listViewRelativeLayouts

    【讨论】:

      【解决方案4】:

      尝试像这样更新您的代码

      <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】:

        第二个布局是fill_parent,第一个放在它下面。所以是看不到的。

        我假设你想要这样的东西

        <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>
        

        【讨论】:

          【解决方案6】:

          最好的解决方案是创建一个自定义的 ScrollView 并使用它来 将 &lt;ScrollView&gt; 替换为 in.parx.VerticalScrollView>

          对 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;
              }
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2016-05-26
            • 2016-08-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多