【问题标题】:Creating a multicolumn Listview (Android Studio)创建多列 Listview (Android Studio)
【发布时间】:2020-05-08 06:38:53
【问题描述】:

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

波西米亚狂想曲;女王

钢琴人;比利·乔尔

为奔跑而生;布鲁斯·斯普林斯汀

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

代码如下:

公共类 Main2Activity 扩展 AppCompatActivity {

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

}

我的自定义线性布局:

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

谢谢!

【问题讨论】:

  • "它找不到我创建的布局" – 尝试清理和重建项目(在 Build 菜单下),如果这不起作用,则 Invalidate Caches/Restart(在 File 下)。具有新创建布局的最新 Android 版本存在故障。
  • 谢谢,但不起作用。以防万一我做错了什么:我在 res/layout 中创建了布局作为布局资源文件。似乎是显而易见的地方,但也许不是,这是这种布局应该在的地方吗?
  • 是的,就是这样。它与您正在使用的其他布局位于同一位置;例如,R.layout.activity_main2.
  • 首先,您的列表只包含歌手的姓名。创建一个对象并相应地填写您的列表。然后关注这个answer。或者我的想法是你应该使用自定义适配器。
  • “找不到我创建的布局”是什么意思?到底发生了什么?

标签: java android


【解决方案1】:

创建音乐对象:

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

【讨论】:

    【解决方案2】:

    您可以将RecyclerViewGridLayoutManager 一起使用

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

    【讨论】:

    • 它不起作用,它显示为红色并告诉我创建参数和变量。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2021-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-06
      • 1970-01-01
      • 2015-12-28
      相关资源
      最近更新 更多