2

リスト ビューを表示することだけを目的としたアクティビティがあります。配列内の各要素のビューを提供するカスタム アダプターがあります。

ブレークポイントがいたるところにあり、デバッグすると、何度も「カウント」で停止します-最初の数回は戻り値がゼロになり、その後3に変わります(この場合は正しい値)。次に、"getView" で停止します。すべての適切な処理が行われ、すべてのブレーク ポイントが処理された後、3 つのレコードすべてが画面に表示されます。うん!

そのため、デバッガーの外部でアプリを実行しようとします。「count」にアクセスしたというログメッセージが表示され、ログメッセージに戻り値が表示されるため、正しいことがわかりますが、「getView」は呼び出されません!!

この質問に関連するコードのビットがわかりません。プロジェクト全体で質問を汚染したくありません。役立つ特定のセクションがあれば教えてください。私はすべての「getViewが呼び出されない」という質問を調査しましたが、それらは一貫してgetViewが呼び出されない場合のためのものであり、明らかに私のものである可能性があります…時々:(

編集:アダプターコード

public class DivisionAdapter extends BaseAdapter {

private static final String TAG = "DIV_ADAPT";

private ArrayList<Division> divisionList;
private Context context;

public DivisionAdapter(Context c, ArrayList<Division> divList) {
    divisionList = divList;
    context = c;
}

@Override
public int getCount() {
    Integer count = 0;
    if (divisionList != null) count = divisionList.size();
    Log.v(TAG,count.toString());
    return count;
}

@Override
public Object getItem(int position) {
    Object o = null;
    if (divisionList != null)
        o = divisionList.get(position);
    return o;
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    Log.v(TAG,"getView");
    if (divisionList == null)
        return null;

    LinearLayout divisionView = null;
    Division thisDiv = divisionList.get(position);

    if (convertView == null) {
        divisionView = new LinearLayout(context);
        LayoutInflater li = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        li.inflate(R.layout.division_item, divisionView, true);
    } else {
        divisionView = (LinearLayout) convertView;
    }
    Log.v(TAG,thisDiv.name());
    TextView v = (TextView) divisionView.findViewById(R.id.divisionName);
    v.setText(thisDiv.name());
    v = (TextView) divisionView.findViewById(R.id.divisionRegion);
    v.setText(thisDiv.region());

    return divisionView;
}

public void setList(ArrayList<Division> newList) {
    divisionList = null;
    divisionList = newList;
}

}

役に立つ場合に備えて、アクティビティ クラスのスニペットをいくつか示します。

@Override
public void onResume() {
    super.onResume();
    refreshList();
}

private void refreshList() {

    // use the class static query method to get the list of divisions
    Division.query(Division.class, 
            new StackMobQuery().fieldIsEqualTo("status", "ACTIVE"),
            new StackMobQueryCallback<Division>() {

                @Override
                public void failure(StackMobException arg0) {
                    // TODO Auto-generated method stub
                    Log.v(TAG, "query fail");
                }

                @Override
                public void success(List<Division> arg0) {
                    Log.v(TAG, "query success");
                    divAdapt.setList((ArrayList<Division>) arg0);
                    divAdapt.notifyDataSetChanged();
                }
            });

}

EDIT 2/11: 私はこの質問を見つけました:マーカーがスタックモブ クエリの後にマップ上に表示されず、スタック モブ クエリがバックグラウンド スレッドで実行されるというこれまで知られていなかった事実が明らかになりました。私はスレッドとアダプターの関係を調査し始めており、他の誰かがここで何が起こっているのかを私よりも早く理解するのに役立つ場合に備えて、この手がかりを共有すると思いました. ティア。

4

1 に答える 1

0

idk なぜこれがデバッガーで機能したのか - それは赤いニシンであることが判明しました。

発見されたように、StackMobModel 静的クエリ メソッドはバックグラウンド スレッドで実行され、そこから NotifyDataSetChanged() を呼び出してもまったく効果がありません。

StackMobQueryCallback の success メソッドを次のように置き換えました。

                @Override
                public void success(final List<Division> arg0) {
                    Log.v(TAG, "query success");
                    runOnUiThread(new Runnable() {
                        public void run() {
                            updateList((ArrayList<Division>) arg0);                             
                        }
                    });
                }

そして、この新しいメソッドを追加しました

private void updateList(ArrayList<Division> newList) {
    divAdapt.setList(newList);
    divAdapt.notifyDataSetChanged();

}

これで、クエリが返されると、アダプターの更新が適切なスレッドで実行されるように指示されます。

わあ!

于 2014-02-12T08:32:02.813 に答える