0

私には独特の問題があります。レストランのメニューカードを解析しています。彼らは英語とドイツ語でそれを持っています。クラスFoodItemを次のように持っています:

public class FoodItem {

private int foodClass;
    private String foodType;
    private String foodName;
    private String foodCost;
    private String hauptBeilage;
    private String salat;
}

これで、Jsoup を使用してダウンロードした食料品の配列リストができました。を使ってドイツ語と英語のメニューを分けていますString foodType

ドイツ語のメニューを最初に挙げたいと思います。しかし、リストに英語のメニューも追加されます。これにどのように対処すればよいですか?

私のdownloadThread(Jsoup)は次のとおりです。

public void run()
    {
        Log.i("downloadThread", "Inside run() - Starting getFoodItems");
        getDailyGerman(); 

        getDailyEnglish(); 

//Sending a message through handler here
            }

私の活動では、私は持っています:

handler = new android.os.Handler() {
            @Override
            public void handleMessage(Message msg) {
                foodItemAdapter.notifyDataSetChanged();
            }
        };

getDailyGerman();その後、ハンドラーを介してメッセージを送信するillegalstateexceptionと、アダプターのコンテンツが変更されたというメッセージが表示されますが、リストビューは更新されません。

私のアダプターコード:

public FoodItemAdapter(Context context, int textViewResourceId, ArrayList<FoodItem> FoodItemArg) {
        super(context, textViewResourceId, FoodItemArg);
        FoodItemAdapter.foodItems = FoodItemArg;
        this.setNotifyOnChange(false);
        //      if(FoodItemAdapter.foodItems == null)
        //          Log.i("Adapter", "Problem Inside Adapter Constructor");
    }

    //=========================public methods============================


    public static ArrayList<FoodItem> getDailyEnglishFoodItems()
    {
        ArrayList<FoodItem> returnList = new ArrayList<FoodItem>();
        for(FoodItem eachItem : FoodItemAdapter.foodItems)
        {
            if(eachItem.getFoodClass() == 1)
            {
                Log.i("Adapter" , "Adding English Daily Food : " + eachItem.getFoodName());

                returnList.add(eachItem);
            }
        }

        return returnList;
    }

    public static ArrayList<FoodItem> getDailyGermanFoodItems()
    {
        ArrayList<FoodItem> returnList = new ArrayList<FoodItem>();
        for(FoodItem eachItem : FoodItemAdapter.foodItems)
        {
            if(eachItem.getFoodClass() == 2)
            {
                Log.i("Adapter" , "Adding German Daily Food : " + eachItem.getFoodName());
                returnList.add(eachItem);
            }
        }
        return returnList;
    }
@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        /*
         * Describes each view in the list view.
         * Get the question and find the question text, timestamp and the votes.
         * Show them in the textview which is a part of the listview.
         */

        View v = convertView;
        FoodItem foodItem =(FoodItem) FoodItemAdapter.foodItems.get(position);
        if(foodItem == null)
        {
            Log.i("Adapter", "Null Food Item");
        }
        int colorPos = 0;


        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater)this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = inflater.inflate(R.layout.fooditem_row, null);
            colorPos = position % colors.length;
        }

この時点で 3 日間立ち往生しているため、助けてください。ありがとう。

4

2 に答える 2

0

私があなたの質問について理解していることから、あなたはリストの一番上に英語のアイテムを置き、次にドイツのアイテムを置きたいと思います。これは、Collection.sortメソッドを使用し、手元のタスクに特定のコンパレータを使用して行うことができます。

例えば:

final List<FoodItem> combinedList  = getDailyGermanFoodItems();
combinedList.addAll(getDailyEnglishFoodItems());
Collections.sort(compinedList, new FoodItemComparator());
//then you call the handler to update the adapter and the listView
handler.post(new Runnable(){
        public void run(){
            FoodItemAdapter adapter = new FoodItemAdapter(activity.this, layout, combinedList);
            listView.setAdapter(adapter);   
}});

ここでFoodItemComparator

public class FoodItemComparatorimplements Comparator<FoodItem>{

    public int compare(FoodItem item1, item2) {

        String foodType1    = item1.getFoodType();
        String foodType2    = item2.getFoodType();
                    if (foodType1.equals(foodType2))
                        return 0;
                    if (foodType1.equals("English"))
                        return 1;
                    if (foodType2.equals("English))
                        return -1;
                    return foodType1.compareTo(foodType2);
    }

}

foodType値がドイツ語/英語のみであることが保証されていると仮定します。また、コンパレータがアクセスできるように、FoodItemクラス内にゲッター機能が必要になります。

Class FoodItem
.......
public String getFoodType(){
        return foodType;
}

編集 それぞれを単独で表示する場合は、2つのリストをアクティビティオブジェクト内に保存し、ユーザーが言語(英語/ドイツ語)を選択すると、次のようになります。

FoodItemAdapter adapter = new FoodItemAdapter(activity.this, layout, germanList);
listView.setAdapter(adapter);
于 2013-02-01T11:44:08.623 に答える
0

UIスレッドの問題でアイテムを追加してnotifyDataSetChanged()を呼び出すと、同じ問題が解決しました

于 2013-01-31T16:53:17.730 に答える