选择列表视图项

时间:2015-05-11 06:29:24

标签: java android

我是android编程的新手,我不确定代码有什么问题。请查看并提出一些意见或建议!提前谢谢!

ExerciseFragment:

public class ExerciseFragment<MainActivity> extends Fragment {
// Declare Variables
    JSONObject jsonobject;
    JSONArray jsonarray;
    ListView listview;
    ListViewAdapter adapter;
    ProgressDialog mProgressDialog;
    ArrayList<HashMap<String, String>> arraylist;
    static String TITLE = "title";
    static String DIFFICULTY = "difficulty";
    static String CATEGORY = "category";
    static String IMAGE = "image";
    static String DESCRIPTION ="description";

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

    View rootView = inflater.inflate(R.layout.fragment_exercise, container, false);
 // Execute DownloadJSON AsyncTask
        new DownloadJSON().execute(); 
        return rootView;    
    }// DownloadJSON AsyncTask

    public class DownloadJSON extends AsyncTask<Void, Void, Void> {
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        // Create a progressdialog
        mProgressDialog = new ProgressDialog(getActivity());
        // Set progressdialog title
        mProgressDialog.setTitle("Exercise Tips!");
        // Set progressdialog message
        mProgressDialog.setMessage("Loading...");
        mProgressDialog.setIndeterminate(false);
        // Show progress dialog
        mProgressDialog.show();
    }
    @Override
    protected Void doInBackground(Void... params) {
        // Create an array
        arraylist = new ArrayList<HashMap<String, String>>();
        // Retrieve JSON Objects from the given URL address
        jsonobject = JSONfunctions.getJSONfromURL("http://beta.json-generator.com/api/json/get/MZZHIfy");

        try {
            // Locate the array name in JSON
            jsonarray = jsonobject.getJSONArray("exercisecategory");

            for (int i = 0; i < jsonarray.length(); i++) {
                HashMap<String, String> map = new HashMap<String, String>();
                jsonobject = jsonarray.getJSONObject(i);
                // Retrieve JSON Objects
                map.put("title", jsonobject.getString("title"));
                map.put("difficulty", jsonobject.getString("difficulty"));
                map.put("category", jsonobject.getString("category"));
                map.put("description", jsonobject.getString("description"));
                map.put("image", jsonobject.getString("image"));
                // Set the JSON Objects into the array
                arraylist.add(map);
            }
        } catch (JSONException e) {
            Log.e("Error", e.getMessage());
            e.printStackTrace();
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void args) {
        // Locate the listview in fragment_exercise.xml
        listview = (ListView) getView().findViewById(R.id.listview);
        // Pass the results into ListViewAdapter.java
        adapter = new ListViewAdapter(getActivity().getApplicationContext(), arraylist);
        // Set the adapter to the ListView
        listview.setAdapter(adapter);
        // Close the progressdialog
        mProgressDialog.dismiss();
    }
}

ListViewAdapter:

@SuppressLint("ViewHolder")
public class ListViewAdapter extends BaseAdapter {
// Declare Variables
Context context;
LayoutInflater inflater;
ArrayList<HashMap<String, String>> data;
ImageLoader imageLoader;
HashMap<String, String> resultp = new HashMap<String, String>();

public ListViewAdapter (Context context, ArrayList<HashMap<String, String>> arraylist) {
    this.context = context;
    data = arraylist;
    imageLoader = new ImageLoader(context);
}

@Override
public int getCount() {
    return data.size();
}
@Override
public Object getItem(int position) {
    return null;
}
@Override
public long getItemId(int position) {
    return 0;
}
public View getView(final int position, View convertView, ViewGroup parent) {
    // Declare Variables
    TextView title;
    TextView difficulty;
    TextView category;
    TextView description;
    ImageView image;
    inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View itemView = inflater.inflate(R.layout.exe_list, parent, false);
    // Get the position
    resultp = data.get(position);

    // Locate the TextViews in exe_list.xml
    title = (TextView) itemView.findViewById(R.id.title);
    difficulty = (TextView) itemView.findViewById(R.id.difficulty);
    category = (TextView) itemView.findViewById(R.id.category);
    description = (TextView) itemView.findViewById(R.id.description);

    // Locate the ImageView in exe_list.xml
    image = (ImageView) itemView.findViewById(R.id.image);

    // Capture position and set results to the TextViews
    title.setText(resultp.get(ExerciseFragment.TITLE));
    difficulty.setText(resultp.get(ExerciseFragment.DIFFICULTY));
    category.setText(resultp.get(ExerciseFragment.CATEGORY));
    description.setText(resultp.get(ExerciseFragment.DESCRIPTION));

    // Capture position and set results to the ImageView
    // Passes images URL into ImageLoader.class
    imageLoader.DisplayImage(resultp.get(ExerciseFragment.IMAGE), image);
    Log.e("TEST","message here1");

    // Capture ListView item click
    itemView.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View arg0) {
            Log.e("TEST","message here2");
            // Get the position
            resultp = data.get(position);
            Intent intent = new Intent(context, SingleItemView.class);
            Log.e("TEST","message here3");
            // Pass all data title
            intent.putExtra("title", resultp.get(ExerciseFragment.TITLE));
            Log.e("TEST","message here4");
            // Pass all data difficulty
            intent.putExtra("difficulty", resultp.get(ExerciseFragment.DIFFICULTY));
            Log.e("TEST","message here5");
            // Pass all data category
            intent.putExtra("category",resultp.get(ExerciseFragment.CATEGORY));
            Log.e("TEST","message here6");
            // Pass all data description
            intent.putExtra("description", resultp.get(ExerciseFragment.DESCRIPTION));
            Log.e("TEST","message here7");
            // Pass all data image
            intent.putExtra("image", resultp.get(ExerciseFragment.IMAGE));
            Log.e("TEST","message here8");
            // Start SingleItemView Class
            context.startActivity(intent);

        }
    });
    return itemView;
}

SingleItemView:

public class SingleItemView extends Activity {
// Declare Variables
String title;
String difficulty;
String category;
String description;
String image;
String position;
ImageLoader imageLoader = new ImageLoader(this);

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // Get the view from exe_single.xml
    setContentView(R.layout.exe_single);

    Intent i = getIntent();
    // Get the result of title
    title = i.getStringExtra("title");
    // Get the result of difficulty
    difficulty = i.getStringExtra("difficulty");
    // Get the result of category
    category = i.getStringExtra("category");
    // Get the result of description
    description = i.getStringExtra("description");
    // Get the result of image
    image = i.getStringExtra("image");

    // Locate the TextViews in exe_single.xml
    TextView txttitle = (TextView) findViewById(R.id.title);
    TextView txtdifficulty = (TextView) findViewById(R.id.difficulty);
    TextView txtcategory = (TextView) findViewById(R.id.category);
    TextView txtdescription = (TextView) findViewById(R.id.description);

    // Locate the ImageView in exe_single.xml
    ImageView imgimage = (ImageView) findViewById(R.id.image);

    // Set results to the TextViews
    txttitle.setText(title);
    txtdifficulty.setText(difficulty);
    txtcategory.setText(category);
    txtdescription.setText(description);

    // Capture position and set results to the ImageView
    // Passes image images URL into ImageLoader.class
    imageLoader.DisplayImage(image, imgimage);
}

Logcat:

05-11 14:30:26.400: I/PGA(4771): Attempting to create new SOCKET connectionn pid = 4771, tid = 4771
05-11 14:30:26.410: I/PGA(4771): New SOCKET connection: com.fwong.eatright (pid 4771, tid 4771)
05-11 14:30:31.620: I/MemoryCache(4771): MemoryCache will use up to 48.0MB
05-11 14:30:31.640: D/dalvikvm(4771): GC_FOR_ALLOC freed 397K, 13% free 3511K/4004K, paused 10ms, total 10ms
05-11 14:30:31.650: E/TEST(4771): message here1
05-11 14:30:31.670: E/TEST(4771): message here1
05-11 14:30:31.680: E/TEST(4771): message here1
05-11 14:30:31.680: I/MemoryCache(4771): cache size=50784 length=1
05-11 14:30:31.820: I/MemoryCache(4771): cache size=108384 length=2
05-11 14:30:32.000: I/MemoryCache(4771): cache size=147104 length=3
05-11 14:30:33.580: E/TEST(4771): message here2
05-11 14:30:33.580: E/TEST(4771): message here3
05-11 14:30:33.580: E/TEST(4771): message here4
05-11 14:30:33.580: E/TEST(4771): message here5
05-11 14:30:33.580: E/TEST(4771): message here6
05-11 14:30:33.580: E/TEST(4771): message here7
05-11 14:30:33.580: E/TEST(4771): message here8
05-11 14:30:33.580: D/AndroidRuntime(4771): Shutting down VM
05-11 14:30:33.580: W/dalvikvm(4771): threadid=1: thread exiting with uncaught exception (group=0x55d4fb20)
05-11 14:30:33.580: I/Process(4771): Sending signal. PID: 4771 SIG: 9
05-11 14:30:33.580: D/AndroidRuntime(4771): procName from cmdline: com.fwong.eatright
05-11 14:30:33.580: E/AndroidRuntime(4771): in writeCrashedAppName, pkgName :com.fwong.eatright
05-11 14:30:33.580: D/AndroidRuntime(4771): file written successfully with content: com.fwong.eatright StringBuffer : ;com.fwong.eatright
05-11 14:30:33.580: E/AndroidRuntime(4771): FATAL EXCEPTION: main
05-11 14:30:33.580: E/AndroidRuntime(4771): Process: com.fwong.eatright, PID: 4771
05-11 14:30:33.580: E/AndroidRuntime(4771): android.util.AndroidRuntimeException: Calling startActivity() from outside of an Activity  context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
05-11 14:30:33.580: E/AndroidRuntime(4771):     at android.app.ContextImpl.startActivity(ContextImpl.java:1034)
05-11 14:30:33.580: E/AndroidRuntime(4771):     at android.app.ContextImpl.startActivity(ContextImpl.java:1021)
05-11 14:30:33.580: E/AndroidRuntime(4771):     at android.content.ContextWrapper.startActivity(ContextWrapper.java:311)
05-11 14:30:33.580: E/AndroidRuntime(4771):     at com.fwong.eatright.exercise.ListViewAdapter$1.onClick(ListViewAdapter.java:107)
05-11 14:30:33.580: E/AndroidRuntime(4771):     at android.view.View.performClick(View.java:4443)
05-11 14:30:33.580: E/AndroidRuntime(4771):     at android.view.View$PerformClick.run(View.java:18442)
05-11 14:30:33.580: E/AndroidRuntime(4771):     at android.os.Handler.handleCallback(Handler.java:733)
05-11 14:30:33.580: E/AndroidRuntime(4771):     at android.os.Handler.dispatchMessage(Handler.java:95)
05-11 14:30:33.580: E/AndroidRuntime(4771):     at android.os.Looper.loop(Looper.java:136)
05-11 14:30:33.580: E/AndroidRuntime(4771):     at   android.app.ActivityThread.main(ActivityThread.java:5021)
05-11 14:30:33.580: E/AndroidRuntime(4771):     at java.lang.reflect.Method.invokeNative(Native Method)
05-11 14:30:33.580: E/AndroidRuntime(4771):     at java.lang.reflect.Method.invoke(Method.java:515)
05-11 14:30:33.580: E/AndroidRuntime(4771):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:827)
05-11 14:30:33.580: E/AndroidRuntime(4771):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:643)
05-11 14:30:33.580: E/AndroidRuntime(4771):     at dalvik.system.NativeStart.main(Native Method)

2 个答案:

答案 0 :(得分:2)

您正在使用ApplicationContext启动活动。您需要使用ActivityContext。

在练习片段中,初始化适配器更改:

adapter = new ListViewAdapter(getActivity().getApplicationContext(), arraylist);

要:

adapter = new ListViewAdapter(getActivity(), arraylist);

如果这不起作用,您还可以尝试在OnItemClickListener上设置ListView而不是OnClickListener上的ItemView。因此,请删除您在适配器的OnClickListener方法中设置的getView()。但是,当您初始化适配器并将其设置为ListView时,也请调用ListView.setOnItemClickListener(new AdapterView.OnItemClickListener)并将功能粘贴到那里。此监听器用作处理列表项选择的最佳实践。

当你按照我上面描述的方式进行操作时会发生的情况是,每次加载View时(由于你使用的是ListView,很多次)应用程序需要分配内存来设置OnClickListener。现在你只需要分配一次。

答案 1 :(得分:0)

将Fragment中的setOnItemClickListener添加到listView

listview = (ListView) rootView .findViewById(R.id.listview);
 new DownloadJSON().execute(); 
 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
             TextView t=(TextView)view.findViewById(R.id.title);
             Log.e("title",t.getText().toString());
         }
    });

删除此行

listview = (ListView) getView().findViewById(R.id.listview);

从适配器中删除侦听器。