0

アプリのコードの冗長性を減らし、管理しやすくするために、いくつかのカスタム リスト アダプターを独自のクラスに入れようとしています。

ListFragment 内の条件ステートメントを使用して、さまざまなアダプター クラスを呼び出します。私はもともと ListFragment クラスにアダプターを持っていましたが、これはすべて計画どおりに機能しました。ここで、すべてをクリーンアップして ListFragment からすべてのコードを取得するために、アダプターを独自のクラスに移動しました。それが完了してから、これらのメソッドを呼び出すことができるようにこれらのメソッドを静的にする必要がありますが、これらの新しいクラスには多くのものが含まれるようになりました。

ListFragment 型から非静的メソッド setListAdapter(ListAdapter) への静的参照を作成できません

具体的には、setListAdapter、setListAdapter、getFragmentManager、および getFragmentManager メソッドです。大量の ListView Fragment クラスは必要ありません。多くのコードが再利用されるため、ListFragment を 1 つだけ持ち、条件を使用して正しいアダプターを取得することで、より多くのことができますが、これらの新しいクラスを修正する方法がわかりません。だから私はそれらを使うことができます。

長い説明で申し訳ありません。関連するコードのみを投稿して、私が達成しようとしていることのアイデアを得て、あなたが私を導くようにします.

これは私がやっている方法で行うことができますか?どうすれば修正できますか?

より良い方法がある場合は、アダプタークラス内で変更する必要があるコードまたは説明を含むコードを投稿してください。

私のフラグメントの onActivityCreated で:

. . .

    // Get the string to query from last Fragment and pass it to this
    // Fragment
    Bundle args = this.getArguments();

    boolean rawRes = args.getBoolean(KEY_IS_RAW_RES);
    String url = args.getString(KEY_URL);
    int fileName = args.getInt(KEY_RES_FILE);

    this.getJsonFile(url, rawRes, fileName);

}

public void getJsonFile(String url, boolean rawRes, int fileName) {

    if (rawRes == true) {
        getFromRawRes(fileName);
    } else {
        getFromURL(url);
    }
}

public void getFromRawRes(int fileName) {
        InputStream file = getResources().openRawResource(fileName);
        JSONParser jParser = new JSONParser();
        JSONArray json = jParser.getJSONFromRes(file);
        ListAdapter_SevenItem.callback(json, context);//<--THIS IS A CALL TO THE ADAPTER!!
    }

アダプターの 1 つ:

public class ListAdapter_SevenItem extends ListViewFragment {

. . .

public static void callback(JSONArray json, Context c) {
    if (json != null) {
    // Hashmap for ListView
    . . .
    // create the list item mapping
        String[] from = new String[]{TAG_LABEL, TAG_TITLE, TAG_DISCR, TAG_RES_FILE, TAG_IS_RAW_RES, TAG_CONT_ID};
        int[] to = new int[]{R.id.listLabel, R.id.listTitle, R.id.listDiscription, R.id.listResFile, R.id.listIsRawRes, R.id.listContID};

        // Updating parsed JSON data into ListView
        SimpleAdapter adapter = new SimpleAdapter(c, mList, R.layout.list_item, from, to);
        setListAdapter(adapter);

        // selecting single ListView item
        final ListView lv = setListAdapter();

        // Launching new screen on Selecting Single ListItem
        lv.setOnItemClickListener(new OnItemClickListener() {

            public void onItemClick(AdapterView<?> parent, View view, int pos, long id) {
                MainActivity.mLayout.toggleSidebar();
                setHasOptionsMenu(true);

                FragmentManager fm = getFragmentManager();
                final FragmentTransaction lcFT = fm.beginTransaction();
                lcFT.setCustomAnimations(R.anim.slide_in, R.anim.hyperspace_out, R.anim.hyperspace_in, R.anim.slide_out);

                final Bundle args = new Bundle();

                String resFile = ((TextView) view.findViewById(R.id.listResFile)).getText().toString();
                int passResFile = getFragmentManager().getIdentifier(resFile, "raw", "com.andaero.app");
                args.putInt("KEY_RES_FILE", passResFile);

                boolean isRawRes = true;
                args.putBoolean("KEY_IS_RAW_RES", isRawRes);

                // Delayed to improve animations
                final Handler handler = new Handler();
                handler.postDelayed(new Runnable() {
                    public void run() {
                        ListViewFragment lvf = new ListViewFragment();
                        lcFT.replace(R.id.listContainer, lvf).commit();
                        lvf.setArguments(args);
                    }
                }, 300);
            }
        });
    }
}

}

4

2 に答える 2

0

アプリケーション全体で再利用できる ListView フラグメント クラス。

GitHub でダウンロードできるjgilfelt のユニバーサルJasonArrayAdapterクラスを使用します。以下のクラスは、アプリケーション全体で何度も使用できるため、必要な唯一の ListView クラスです。これは、冗長なコード/クラスの削減を意味します。特に、異なる属性やレイアウトを必要とするリスト ビューがある場合。

この ListViewFragment を別の Fragment からロードする場合:

String uri = "http://www.xxxx/myjsonfile.json";//EXAMPLE IF FROM A URL
String uri = "json/myjsonfile.json";//EXAMPLE GETTING FROM YOUR ASSETS FOLDER
args.putString("KEY_URI", uri);

String adptrID = "#";//USED TO DETERMINE WHICH LAYOUT TO USE
args.putString("KEY_ADPTR_ID", adptrID);

ListViewFragment lvf = new ListViewFragment();
lcFT.replace(R.id.myContainer, lvf).commit();
lvf.setArguments(args);

この ListViewFragment をそれ自体からロードする場合は、JSON ファイルに適切な項目を追加して、setArguments(args) バンドルに取得します。

メソッドに改善点などがある場合は、コメント/回答に自由に追加してください。私はAndroidが初めてで、学習しながら... Thnx

ListViewFragment クラス:

public class ListViewFragment extends ListFragment implements OnItemClickListener {
. . .
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        Bundle getArgs = this.getArguments();
        String URI = getArgs.getString(KEY_URI);
            . . .
        new GetJSONTask().execute(URI);
    }

    class GetJSONTask extends AsyncTask<String, Integer, String> {

        protected String doInBackground(String... arg0) {

            String uri = arg0[0];

            InputStream is = null;

            if (uri.contains("http") == true) {// Get JSON from URL
                try {
                    DefaultHttpClient httpClient = new DefaultHttpClient();
                    HttpPost httpPost = new HttpPost(uri);
                    HttpResponse httpResponse = httpClient.execute(httpPost);
                    HttpEntity httpEntity = httpResponse.getEntity();
                    is = httpEntity.getContent();

                    BufferedReader rd = new BufferedReader(new InputStreamReader(is, "UTF-8"));
                    while ((line = rd.readLine()) != null) {
                        json += line;
                    }
                    rd.close();
                    return json;
                } catch (Exception e) {
                    e.printStackTrace();
                    return null;
                  }
                } else {//Get JSON from Assets

                Writer writer = new StringWriter();
                char[] buffer = new char[1024];

                try {
                    InputStream jsonFile = getActivity().getAssets().open(uri);
                    Reader reader = new BufferedReader(new InputStreamReader(jsonFile, "UTF-8"));
                    int n;
                    while ((n = reader.read(buffer)) != -1) {
                        writer.write(buffer, 0, n);
                    }
                    jsonFile.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                json = writer.toString();
                // return JSON String
                return json;
            }
        }

        @Override
        protected void onPostExecute(String result) {
            try {
                showData(result);
            } catch (JSONException e) {
                e.printStackTrace();
                Toast.makeText(getActivity(), "something went wrong", Toast.LENGTH_SHORT).show();
            }
        }
    }

    private void showData(String json) throws JSONException {
        JSONObject o = new JSONObject(json);
        JSONArray data = o.getJSONArray("results");

        Bundle getArgs = this.getArguments();
        String adptrID = getArgs.getString(KEY_ADPTR_ID);

        if (adptrID == "3") {//Adapter for 3 items
            String[] from = new String[]{"label", "title", "description", "uri", "adapterID", "containerID"};
            int[] to = new int[]{R.id.listLabel, R.id.listTitle, R.id.listDiscription, R.id.listURI, R.id.listAdapterID, R.id.listContID};
            ListAdapter adapter = new JSONArrayAdapter(getActivity(), data, R.layout.list_item, from, to, null);
            getListView().setOnItemClickListener(this);
            getListView().setAdapter(adapter);
        }
        if (adptrID == "4") {//Adapter for 4 items - Get the idea?
        . . .
        } . . .//Additional Adapter can be added....
    }

public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

        final Bundle args = new Bundle();
        Bundle getArgs = this.getArguments();

        String uri = ((TextView) view.findViewById(R.id.listURI)).getText().toString();
        args.putString("KEY_URI", uri);

        String adptrID = ((TextView) view.findViewById(R.id.listAdapterID)).getText().toString();
        args.putString("KEY_ADPTR_ID", adptrID);

        String contID = ((TextView) view.findViewById(R.id.listContID)).getText().toString();
        args.putString("KEY_CONTAINER_ID", contID);

        //Conditional to determine witch container to load the ListViewFragment(this)
         if (containerID == "listContainer") {
         lcFT.replace(R.id.listContainer, lvf).commit();
         lvf.setArguments(args);
         }
         if (containerID == "someOtherContainer") {
         lcFT.replace(R.id.discriptionListContainer, lvf).commit();
         lvf.setArguments(args);
         }. . .
    }
于 2012-06-20T14:44:09.120 に答える
0

あなたは物事を過度に複雑にしています。

使用するような静的メソッド/呼び出しがあってはなりません。それは非常に単純でなければなりません。リスト フラグメント内で、onActivityCreated(Bundle savedInstanceState)リスト アダプターのインスタンスを作成し、setListAdapter().

フラグメントのチュートリアルでTitlesFragment サンプルを確認してください。

于 2012-06-13T19:22:23.870 に答える