1

わかった。だから私は小さな電子ブック ストア アプリを作っています。本のリストを含むstrings.xmlに文字列配列があります。各配列項目には、カバー画像へのパス、タイトル、作成者、およびジャンルを含む 4 つのデータが含まれています。以下のコードでは、配列内の書籍ごとに View オブジェクトを作成し、それらを画面に出力しています。現在、タブ + スワイプ レイアウトを使用しており、タイトル、作成者、ジャンルの 3 つのタブがあります。私がやりたいのは、ビューの配列を、選択されているタブに応じて、タイトル、作成者、またはジャンルのいずれかで並べ替えることです。私がこれを行うことができる方法を知っている人はいますか?

public static class SectionFragment extends Fragment {
    private static ScrollView outerLayout;
    private static LinearLayout innerLayout;
    private static LayoutParams params;
    private static ArrayList <String []> bookData = new ArrayList <String []> ();
    private static String [] bookList;

    public SectionFragment () { }

    @Override
    public View onCreateView (LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        params = new LayoutParams (LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
        outerLayout = new ScrollView (context);
        outerLayout.setLayoutParams(params);
        innerLayout = new LinearLayout (context);
        innerLayout.setLayoutParams(params);
        innerLayout.setOrientation(LinearLayout.VERTICAL);

        bookList = res.getStringArray(R.array.bookList);

        for (int i = 0; i < bookList.length; i++) {
            View bookView = new View (context);
            bookView = inflater.inflate(R.layout.grid_cell, null);

            ImageView bookCover = (ImageView) bookView.findViewById(R.id.bookCover);
            TextView bookTitle = (TextView) bookView.findViewById(R.id.bookTitle);
            TextView bookAuthor = (TextView) bookView.findViewById(R.id.bookAuthor);
            TextView bookGenre = (TextView) bookView.findViewById(R.id.bookGenre);

            bookData.add(bookList[i].split("\\|"));
            try {
                bookCover.setImageDrawable(Drawable.createFromStream(
                        context.getAssets().open(bookData.get(i)[0]), null));
            } catch (IOException e) {
                e.printStackTrace();
            }
            bookTitle.setText(bookData.get(i)[1]); 
            bookAuthor.setText("by " + bookData.get(i)[2]);
            bookGenre.setText(bookData.get(i)[3]);

            innerLayout.addView(bookView);
        }

        outerLayout.addView(innerLayout);
        return outerLayout;
    }
}
4

3 に答える 3

0
  1. 実行時にプログラムで文字列配列を変更する必要があります。で完全な配列を取得しますbookList = res.getStringArray(R.array.bookList);
  2. 簡単な文字列操作を実行し、文字列を最大3つの配列に分割します。1つはタイトル、作成者、ジャンル用で、Arrays.sort()を使用してアルファベット順に並べ替えることができます。もちろん、ここではループとプログラミングロジックを使用する必要があるため、タイトルで並べ替える場合は、たとえば、bookTitleByTitle[0]がbookAuthorByTitle[0]とbookGenreByTitle[0]に対応している必要があります。ちなみに、Arrays.sort()を使用すると元の配列が破棄されるため、配列のコピーを作成してください。(クローンではありません!)。
  3. 著者とジャンルごとに繰り返します。

これが私のアプローチです。

于 2012-07-30T19:49:58.707 に答える
0

bookList にはデータ全体が含まれているため、著者が著者名に基づいてブックリスト配列を再配置することを選択した場合は、基準に基づいてソート方法を作成するだけです。

于 2012-07-30T19:11:05.930 に答える
0

したがって、imageFilename、タイトル、著者、およびジャンルをカプセル化する Book クラスを作成することをお勧めします (これにより、並べ替えがはるかに簡単になります)。

public class Book{
private String imageName;
private String title;
private String author;
private String genre;

public Book(String image, String title1, String author1, String genre1)
{
  imageName = image;
  title = title1;
  author = author1;
  genre = genre1;
}
public String getImageName()
{
 return this.imageName;
}
public String getTitle()
{
 return this.title;
}
public String getAuthor()
{
return this.author;
}
public String getGenre()
{
 return this.genre;
}
}

次に、SectionFragment クラスで次のコードを使用します。これは、私が考えることができる限り機能するはずです。ソートロジックなどは、私が考える限り正しいです。発生する可能性がある唯一の問題は、おそらく switch ステートメント ( getArguments.getInt(SectionFragment.ARG_SECTION_NUMBER)) の引数が原因です。また、 getItem(i) のコードを投稿したときに、これを投稿しました:

public class SectionsPagerAdapter extends FragmentPagerAdapter 
{ 
@Override 
public Fragment getItem(int i) { 
Fragment fragment = new SectionFragment(); 
// Bundle args = new Bundle(); 
// args.putInt(SectionFragment.ARG_SECTION_NUMBER, i + 1); 
// fragment.setArguments(args); 
return fragment; 
} 

最後の 3 行のコメントを外してください。これは、以下に示すコードの次の switch ステートメントで重要になるためです (どのフラグメントを扱っているかを把握するためです)。

public static class SectionFragment extends Fragment {
private static ScrollView outerLayout;
private static LinearLayout innerLayout;
private static LayoutParams params;
private static ArrayList <String []> bookData = new ArrayList <String []> ();
private static String [] bookList;
private static ArrayList<Book> bookList = new ArrayList<Book>();

public SectionFragment () { }

@Override
public View onCreateView (LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    params = new LayoutParams (LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
    outerLayout = new ScrollView (context);
    outerLayout.setLayoutParams(params);
    innerLayout = new LinearLayout (context);
    innerLayout.setLayoutParams(params);
    innerLayout.setOrientation(LinearLayout.VERTICAL);

    bookList = res.getStringArray(R.array.bookList);
    for(int i = 0; i < bookList.length; i++)
    {
     String filename = bookList[i].split("\\|")[0];
     String title = bookList[i].split("\\|")[1];
     String author = bookList[i].split("\\|")[2];
     String genre = bookList[i].split("\\|")[3];
     Book book = new Book(filename, title, author, genre);
     bookList.add(book);
    }

    switch(getArguments.getInt(SectionFragment.ARG_SECTION_NUMBER))
    {
    // I am assuming the first fragment is Title
    case(1): Collections.sort(bookList, new Comparator<Book> {
    public int compare(Book a, Book b)
    {
     return a.getTitle().compareTo(b.getTitle());
    }
    });
    break;

    case(2): Collections.sort(bookList, new Comparator<Book> {
    public int compare(Book a, Book b)
    {
     return a.getAuthor().compareTo(b.getAuthor());
    }
    });
    break;

    case(3): Collections.sort(bookList, new Comparator<Book> {
    public int compare(Book a, Book b)
    {
     return a.getGenre().compareTo(b.getGenre());
    }
    });
    break;
    }       

    for (int i = 0; i < bookList.length; i++) {
        View bookView = new View (context);
        bookView = inflater.inflate(R.layout.grid_cell, null);

        ImageView bookCover = (ImageView) bookView.findViewById(R.id.bookCover);
        TextView bookTitle = (TextView) bookView.findViewById(R.id.bookTitle);
        TextView bookAuthor = (TextView) bookView.findViewById(R.id.bookAuthor);
        TextView bookGenre = (TextView) bookView.findViewById(R.id.bookGenre);

        try {
            bookCover.setImageDrawable(Drawable.createFromStream(
                    context.getAssets().open(bookList.get(i).getImageName()), null));
        } catch (IOException e) {
            e.printStackTrace();
        }
        bookTitle.setText(bookList.get(i).getTitle()); 
        bookAuthor.setText("by " + bookList.get(i).getAuthor());
        bookGenre.setText(bookList.get(i).getGenre());

        innerLayout.addView(bookView);
    }

    outerLayout.addView(innerLayout);
    return outerLayout;
}
}
于 2012-07-30T21:20:58.117 に答える