android - 如何在从 json 解析的 ListView 上使用 onItemclick

标签 android listview onitemclicklistener

我有一个应用程序,它使用 ListView 来显示从 JSON 接收的数据。现在,我想要 ListView 中的 onItemclick 监听器,以便在显示 ListView 后用户可以单击任何行以启动新 Activity 。但是 onclicklistener 不工作。我是一名新开发人员,因此无法使其工作。请帮助我,以便我可以实现 onclick 监听器。提前致谢。

已编辑:- 我面临的另一个问题是 switch case 似乎不起作用,因为我不知道有多少 id 将被添加到行中,即这些行对我来说是未知的,它可能是任何东西。那么我应该使用什么来代替 switch case 呢?

提前致谢

这是我的 StatementsActivity.java,它显示 ListView

public class StatementsActivity extends AppCompatActivity {

    SharedPreferences myPrefs = PreferenceManager.getDefaultSharedPreferences(OpeningScreenActivity.getContextOfApplication());
    String token = myPrefs.getString("GCMTOKEN", "");
    String JSON_URL = "http://xyz.in/view_json.php?device_id=" + token;

    private ListView listView;



    private GoogleApiClient client;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_statements);


        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
            R.layout.list_view_layout, ParseJSON.ids);
        listView = (ListView) findViewById(R.id.listView);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                                            @Override
                                            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                                                switch (position) {
                                                    case 0:
                                                        Intent newActivity = new Intent(StatementsActivity.this, MainActivity.class);
                                                        startActivity(newActivity);
                                                        break;
                                            }
                                        }
           @SuppressWarnings("unused")
           public void onClick(View v){
           }
        });
        sendRequest();

        client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build();
}

 private void sendRequest() {
        StringRequest stringRequest = new StringRequest(JSON_URL,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    showJSON(response);
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Toast.makeText(StatementsActivity.this, error.getMessage(), Toast.LENGTH_LONG).show();
                }
            });
    RequestQueue requestQueue = Volley.newRequestQueue(this);
    requestQueue.add(stringRequest);
}



private void showJSON(String json) {
    ParseJSON pj = new ParseJSON(json);
    pj.parseJSON();
    CustomList cl = new CustomList(this, ParseJSON.ids,ParseJSON.mem_codes,ParseJSON.created_ons);
    listView.setAdapter(cl);
    }
}

这是我的 CustomList.java 类

public class CustomList extends ArrayAdapter<String> {
private String[] ids;
private String[] mem_codes;
private String[] created_ons;
private Activity context;



public CustomList(Activity context, String[] ids, String[] mem_codes, String[] created_ons) {
    super(context, R.layout.list_view_layout, ids);
    this.context = context;
    this.ids = ids;
    this.mem_codes = mem_codes;
    this.created_ons = created_ons;


}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    LayoutInflater inflater = context.getLayoutInflater();
    View listViewItem = inflater.inflate(R.layout.list_view_layout, null, true);
    TextView textViewId = (TextView) listViewItem.findViewById(R.id.textViewId);
    TextView textViewMemCode = (TextView) listViewItem.findViewById(R.id.textViewMem_code);
    TextView textViewCreatedOn = (TextView) listViewItem.findViewById(R.id.textViewCreated_on);
    textViewId.setText(ids[position]);
    textViewMemCode.setText(mem_codes[position]);
    textViewCreatedOn.setText(created_ons[position]);
    return listViewItem;
   }
}

这是我的 ParseJSON.java 类

public class ParseJSON {
public static String[] ids;
public static String[] mem_codes;
public static String[] created_ons;

public static final String KEY_ID = "id";
public static final String KEY_MEM_CODE = "mem_code";
public static final String KEY_CREATED_ON = "created_on";
public static final String JSON_ARRAY = "result";

private JSONArray users = null;

private String json;

public ParseJSON(String json){
    this.json = json;
}

protected void parseJSON(){
    JSONObject jsonObject=null;
    try {
        jsonObject = new JSONObject(json);
        users = jsonObject.getJSONArray(JSON_ARRAY);

        ids = new String[users.length()];
        mem_codes = new String[users.length()];
        created_ons = new String[users.length()];

        for(int i=0;i<users.length();i++){
            JSONObject jo = users.getJSONObject(i);
            ids[i] = jo.getString(KEY_ID);
            mem_codes[i] = jo.getString(KEY_MEM_CODE);
            created_ons[i] = jo.getString(KEY_CREATED_ON);
        }
    } catch (JSONException e) {
        e.printStackTrace();
      }
   }
}

这是我的 activity_statements.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/buttonColor" tools:context=".StatementsActivity">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:layout_alignParentTop="true"
    android:layout_marginTop="50dp"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin">

    <ListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/listView1" />
</LinearLayout>


<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <include
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        layout="@layout/toolbar_layout"/>
</LinearLayout>


 </RelativeLayout>

这是我的 list_view_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/buttonColor">

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="New Text"
    android:id="@+id/textViewId"
    android:layout_alignParentStart="true"/>
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="New Text"
    android:id="@+id/textViewMem_code"
    android:layout_centerHorizontal="true"/>
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="New Text"
    android:id="@+id/textViewCreated_on"
    android:layout_alignParentEnd="true"/>

</RelativeLayout>

最佳答案

我构建了一个 Android 应用程序,它以 Listview 样式显示并在单击它们时显示它们各自的成本。

下面是它的代码。希望对你有帮助...

public class ListViewActivity extends AppCompatActivity {

   private static ListView lv;
   private static String[] prod_names = new String[] {"E", "G", "E2", "G2", "X"};
   private static int[] cost = new int[] {6500, 13000, 7500, 16000, 25000};


   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_list_view);
       Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
       setSupportActionBar(toolbar);

       Listener();
  }

public void Listener(){
    lv = (ListView)findViewById(R.id.listView);
    ArrayAdapter <String> adp = new ArrayAdapter<String>(this, R.layout.products_list, prod_names);
    lv.setAdapter(adp);
    lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            String val = (String)lv.getItemAtPosition(position);
            Toast.makeText(ListViewActivity.this, " Release# : "+ (position+1)+"\n Model : "+val+"\n Cost : Rs "+cost[position], Toast.LENGTH_LONG).show();

        }
    });
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_list_view, menu);
    return true;
}

   @Override
   public boolean onOptionsItemSelected(MenuItem item) {
       // Handle action bar item clicks here. The action bar will
       // automatically handle clicks on the Home/Up button, so long
       // as you specify a parent activity in AndroidManifest.xml.
       int id = item.getItemId();

       //noinspection SimplifiableIfStatement
       if (id == R.id.action_settings) {
           return true;
       }

       return super.onOptionsItemSelected(item);
   }
}

关于android - 如何在从 json 解析的 ListView 上使用 onItemclick,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38374544/

相关文章:

java - 如何在android中设置日历中日期的颜色

java - 按钮布局较高

c# - 如何关闭 C# ListView 中的行选择——特别是虚线轮廓!

java - 如何正确使用 setOnItemClickListener?

php - Android JSON 到 PHP 服务器

android - 按下 ListView 项时以动画开始 Activity

android - 实现弹出菜单 ListView

Android ListView 的 OnItemClickListener 不适用于不可聚焦的 PopupWindow

java - 抽屉导航 onClick 在项目中链式 react 丢失

android - Android 中的布局创建