Создание многоколоночного списка (Android Studio) - PullRequest
0 голосов
/ 08 мая 2020

У меня есть файл с именем «musi c .txt» в каталоге res / raw. Он содержит список песен и авторов, разделенных «;», например:

Богемская рапсодия; Queen

Piano man; Billy Joel

Born to run; Bruce Springsteen

Я хочу использовать этот файл для заполнения многоколоночного ListView. В настоящее время он работает с первым столбцом, поэтому он показывает только название песни, и я не знаю, как реализовать второй столбец. Я попытался заменить макет activity_list_item из ArrayAdapater на собственный макет, чтобы я мог разместить два элемента в одной строке внутри TextViews, но, похоже, это не работает (он не может найти созданный мной макет).

Вот код:

publi c class Main2Activity extends 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);
}

}

My custom LinearLayout:

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

Спасибо!

Ответы [ 3 ]

0 голосов
/ 08 мая 2020

Вы правы, что вам нужно будет определить свой собственный макет элемента списка. Доступ к нему будет осуществляться в вашем классе через R. не android.R..

Вам также необходимо будет определить свой собственный адаптер, расширив класс ArrayAdapter. В этом новом адаптере вы определите, как разделить свои строки и представить их в 2 различных TextView представлениях в вашем настраиваемом макете.

0 голосов
/ 08 мая 2020

Создайте musi c объект:

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);
0 голосов
/ 08 мая 2020

Возможно, вы можете использовать RecyclerView с GridLayoutManager

GridLayoutManager layoutManager = new GridLayoutManager(getActivity(), 4); // change number of columns as you want
layoutManager.setOrientation(RecyclerView.HORIZONTAL);
recyclerView.setLayoutManager(layoutManager);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...