Java 创建多列列表视图(Android Studio)

Java 创建多列列表视图(Android Studio),java,android,Java,Android,我在res/raw目录中有一个名为“music.txt”的文件。它包含以“;”分隔的歌曲和作者列表,如下所示: 波西米亚狂想曲;女王 钢琴手;比利·乔尔 生来就是为了跑步;布鲁斯·斯普林斯汀 我想使用该文件填充多列ListView。目前它与第一列一起工作,所以它只显示歌曲的名称,我不知道如何实现第二列。我尝试将ArrayAdapter中的“activity\u list\u item”布局替换为自定义布局,这样我就可以在TextView中的同一行上放置两个元素,但它似乎不起作用(它找不到我创建的

我在res/raw目录中有一个名为“music.txt”的文件。它包含以“;”分隔的歌曲和作者列表,如下所示:

波西米亚狂想曲;女王

钢琴手;比利·乔尔

生来就是为了跑步;布鲁斯·斯普林斯汀


我想使用该文件填充多列ListView。目前它与第一列一起工作,所以它只显示歌曲的名称,我不知道如何实现第二列。我尝试将ArrayAdapter中的“activity\u list\u item”布局替换为自定义布局,这样我就可以在TextView中的同一行上放置两个元素,但它似乎不起作用(它找不到我创建的布局)

代码如下:

公共类Main2活动扩展了AppCompative活动{

ListView list;

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

    list = findViewById(R.id.musicList);

    loadData();

}

public void loadData(){
    List<String> musicArray = new ArrayList<String>();
    String line;

    InputStream is = this.getResources().openRawResource(R.raw.music);
    BufferedReader reader = new BufferedReader(new InputStreamReader(is));

    try {
        if (is != null) {
            while ((line = reader.readLine()) != null) {
                musicArray.add(line.split(";")[0]);
            }
        }
        is.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

    String data[] = musicArray.toArray(new String[musicArray.size()]);
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.activity_list_item, android.R.id.text1, data);
    list.setAdapter(adapter);
}
ListView列表;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
列表=findViewById(R.id.musicList);
loadData();
}
公共void loadData(){
List musicArray=new ArrayList();
弦线;
InputStream is=this.getResources().openRawResource(R.raw.music);
BufferedReader reader=新的BufferedReader(新的InputStreamReader(is));
试一试{
如果(is!=null){
而((line=reader.readLine())!=null){
musicArray.add(line.split(“;”)[0]);
}
}
is.close();
}捕获(IOE异常){
e、 printStackTrace();
}
字符串数据[]=musicArray.toArray(新字符串[musicArray.size()]);
ArrayAdapter=新的ArrayAdapter(这个,android.R.layout.activity\u list\u项目,android.R.id.text1,数据);
list.setAdapter(适配器);
}
}

我的自定义线性布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Main3Activity"
    android:weightSum="100">

    <TextView
        android:id="@+id/textView1"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:layout_weight="50"
        android:text="TextView"/>

    <TextView
        android:id="@+id/textView2"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:layout_weight="50"
        android:text="TextView"/>

</LinearLayout>


谢谢

您可能可以将
RecyclerView
GridLayoutManager

GridLayoutManager layoutManager = new GridLayoutManager(getActivity(), 4); // change number of columns as you want
layoutManager.setOrientation(RecyclerView.HORIZONTAL);
recyclerView.setLayoutManager(layoutManager);

您是对的,您需要定义自己的列表项布局。这将通过
R.
而不是
android.R.
在您的课堂上访问

您还需要通过扩展
ArrayAdapter
类来定义自己的适配器。在这个新适配器中,您将定义如何分割字符串,并在自定义布局中的两个不同的
TextView
视图中显示它们。

创建音乐对象:

class Music {
    String name;
    String song;

    public Music(String name, String song) {
        this.name = name;
        this.song = song;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSong() {
        return song;
    }

    public void setSong(String song) {
        this.song = song;
    }
}
更改您的列表:

ArrayList<Music> musicList = new ArrayList<>();
while ((line = reader.readLine()) != null) {
      String [] array = line.split(";");
      musicList.add(new Music(array[0],array[1]));
}
和您的适配器:

ArrayAdapter adapter = new ArrayAdapter(this, R.layout.your_custom_layout_id, R.id.textView1, musicList) {
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View view = super.getView(position, convertView, parent);
            TextView text1 = (TextView) view.findViewById(R.id.textView1);
            TextView text2 = (TextView) view.findViewById(R.id.textView2);

            text1.setText(musicList.get(position).getName());
            text2.setText(musicList.get(position).getSong());
            return view;
        }
    };

list.setAdapter(adapter);

“它找不到我创建的布局”-尝试清理和重建项目(在“构建”菜单下),如果不起作用,请取消缓存/重新启动(在“文件”下)。在最近的Android版本中,新创建的布局有一个小问题。谢谢,但不起作用。以防万一我做错了什么:我在res/layout中创建了布局作为布局资源文件。看起来是个显而易见的地方,但也许不是,这就是这种布局应该在的地方吗?是的,就是这样。它会和你正在使用的其他布局放在同一个地方;e、 例如,
R.layout.activity\u main2
。首先,您的列表只包含歌手的姓名。创建一个对象并相应地填写列表。然后按照这个。或者我的想法是你应该使用自定义适配器。你说的“它找不到我创建的布局”是什么意思?到底发生了什么?它不工作,它显示为红色,并告诉我创建参数和变量。