【问题标题】:Implement OnclickListener for listview JSON objects为列表视图 JSON 对象实现 OnclickListener
【发布时间】:2017-02-07 12:14:15
【问题描述】:

我正在开发一个应用程序,它在线从 JSON 对象文件中读取数据。我已经成功地将数据输入应用程序并很好地读取到列表视图中。我将如何为列表视图实现 OnclickListener,以便当用户单击标题时,他们将被带到一个新活动,然后在 textViews 中显示该项目的所有数据。我获取数据的代码在我的布局下方。

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.HashMap;

public class MainActivity extends AppCompatActivity {

private String TAG = MainActivity.class.getSimpleName();

private ProgressDialog pDialog;
private ListView lv;

// URL to get Android Version Data JSON
private static String url = "http://codetest.cobi.co.za/androids.json";

ArrayList<HashMap<String, String>> androidversions;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    androidversions = new ArrayList<>();

    lv = (ListView) findViewById(R.id.list);

    new GetVersions().execute();
}

private class GetVersions extends AsyncTask<Void, Void, Void> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        // Showing progress dialog
        pDialog = new ProgressDialog(MainActivity.this);
        pDialog.setMessage("Please wait...");
        pDialog.setCancelable(false);
        pDialog.show();
    }
    @Override
    protected Void doInBackground(Void... arg0) {
        HttpHandler sh = new HttpHandler();

        // Making a request to url and getting response
        String jsonStr = sh.makeServiceCall(url);

        Log.e(TAG, "Response from url: " + jsonStr);

        if (jsonStr != null) {
            try {
                JSONObject jsonObj = new JSONObject(jsonStr);

                // Getting JSON Array node
                JSONArray versions = jsonObj.getJSONArray("versions");

                // looping through All Versions
                for (int i = 0; i < versions.length(); i++) {
                    JSONObject c = versions.getJSONObject(i);

                    String name = c.getString("name");
                    //String version = c.getString("version");
                    //String released = c.getString("released");
                    //String api = c.getString("api");
                    //String image = c.getString("image");

                    // tmp hash map for single version
                    HashMap<String, String> Version = new HashMap<>();

                    // adding each child node to HashMap key => value
                    Version.put("name", name);
                    //Version.put("version", version);
                    //Version.put("released", released);


                    // adding Data to version list
                    androidversions.add(Version);
                }
            } catch (final JSONException e) {
                Log.e(TAG, "Json parsing error: " + e.getMessage());
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(getApplicationContext(),
                                "Json parsing error: " + e.getMessage(),
                                Toast.LENGTH_LONG)
                                .show();
                    }
                });

            }
        } else {
            Log.e(TAG, "Couldn't get json from server.");
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    Toast.makeText(getApplicationContext(),
                            "Couldn't get json from server. Check LogCat for possible errors!",
                            Toast.LENGTH_LONG)
                            .show();
                }
            });

        }

        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        // Dismiss the progress dialog
        if (pDialog.isShowing())
            pDialog.dismiss();
        /**
         * Updating parsed JSON data into ListView
         * */
        ListAdapter adapter = new SimpleAdapter(
                MainActivity.this, androidversions,
                R.layout.list_item, new String[]{"name", "version",
                "released"}, new int[]{R.id.name,
                R.id.version, R.id.released});

        lv.setAdapter(adapter);
      }

   }
}

列表视图

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="www.cobi.co.za.cobiinteractive.MainActivity">

<ListView
    android:id="@+id/list"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" />

</RelativeLayout>

应用看起来像这样

【问题讨论】:

    标签: android json listview


    【解决方案1】:

    onPostExecute 中试试这个,

    @Override
    protected void onPostExecute(Void result) {
    
        ...
        lv.setAdapter(adapter);
    
        lv.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view,int position, long id) {
                HashMap<String, String> selected = androidversions.get(position);
                // pass HashMap using intent
            }
        });
      }
    }
    

    【讨论】:

    • 非常感谢,我现在如何传递 String name = c.getString("name"); 的数据字符串版本 = c.getString("版本");已发布字符串 = c.getString("已发布");字符串 api = c.getString("api");现在显示在这个新活动中。
    • @Pooveshin 你可以使用额外的捆绑包:stackoverflow.com/questions/768969/…
    【解决方案2】:

    使用 listview 的 itemclicklistener 并从 hashmap 列表中获取特定项目的对象,并将此对象 vai 意图传递给下一个活动,并在下一个活动中获取数据 vai 包。

    【讨论】:

      【解决方案3】:

      用这个改变你的 oncreate 方法

      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
          androidversions = new ArrayList<>();
      
          lv = (ListView) findViewById(R.id.list);
          lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
      
          @Override
          public void onItemClick(AdapterView<?> parent, View view,int position, long id) {
              // create intent and start your second activity
          }
      
      });
          new GetVersions().execute();
      }
      

      【讨论】:

        【解决方案4】:

        据我了解,您想在列表视图的整行上设置onClickListener,对吧?

        onPostExecute中设置好适配器后可以进行如下操作:

           lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                @Override
                public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                    //You want here to pass the data to another activity
                    Intent intent = new Intent(YOUR_1ST_ACTIVITY_NAME.this, YOUR_2ND_ACTIVITY_NAME.class);
                    intent.putExtra("name",name);
                    intent.putExtra("version",version);
                    intent.putExtra("released",released);
                    intent.putExtra("api",api);
                    YOUR_1ST_ACTIVITY_NAME.this.startActivity(intent);
                }
            });
        

        然后在 YOUR_2ND_ACTIVITYE 中,onCreate

         Intent intent = getIntent();
            if (intent != null) {
                String name = intent.getStringExtra("name");
                String version = intent.getStringExtra("version");
                String released = intent.getStringExtra("released");
                String api = intent.getStringExtra("api");
                //....
            }
        

        但如果您想为行视图内的组件分配onClickListener,您可能需要阅读ListView 和自定义广告link

        【讨论】:

        • 非常感谢,我现在如何传递 String name = c.getString("name"); 的数据字符串版本 = c.getString("版本");已发布字符串 = c.getString("已发布");字符串 api = c.getString("api");现在显示在这个新活动中。
        • 当我尝试执行此操作时,我想通过的项目名称出现错误。
        • @Pooveshin,用你当前的问题更新问题,并把当前代码和错误日志或错误提示放在一起
        【解决方案5】:

        使用这样的模态类会有所帮助

              public class Version implements Serializable{
        
            public Version(String name, String version, String released) {
                this.name = name;
                this.version = version;
                this.released = released;
            }
        
            private String name;
            private String version;
            private String released;
            private String api;
            private String image;
        
            public String getName() {
                return name;
            }
        
            public void setName(String name) {
                this.name = name;
            }
        
            public String getVersion() {
                return version;
            }
        
            public void setVersion(String version) {
                this.version = version;
            }
        
            public String getReleased() {
                return released;
            }
        
            public void setReleased(String released) {
                this.released = released;
            }
        
            public String getApi() {
                return api;
            }
        
            public void setApi(String api) {
                this.api = api;
            }
        
            public String getImage() {
                return image;
            }
        
            public void setImage(String image) {
                this.image = image;
            }
        
        }
        

        并使用构造函数 as 获取和设置所有值

            lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                        @Override
                        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        
        HashMap<String, String> selected = androidversions.get(position);
                            Version verison = new Version(selected.getString("name"),selected.getString("version"),selected.getString("released"))
                            Intent intent = new Intent(MainActivity.this, DetailActivity.class);
                            intent.putExtra("verisonDetails", verison);
                            startActivity(intent);
                        }
                    });
        

        在Details Activity中你可以得到

                version = (Version) getIntent().getExtras().getSerializable("verisonDetails");
        

        在 oncreate() 中获取每个值作为 version.get..

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-11-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多