【问题标题】:How to use onItemclick on a list view parsed from json如何在从 json 解析的列表视图上使用 onItemclick
【发布时间】:2016-07-14 12:42:34
【问题描述】:

我有一个应用程序,它使用列表视图来显示从 JSON 接收的数据。现在,我希望在列表视图中有一个 onItemclick 侦听器,以便在显示列表视图后,用户可以单击任何行来启动新活动。但是 onclicklistener 不起作用。我是新开发人员,所以无法使其工作。请帮助我,以便我可以实现 onclick 侦听器。提前致谢。

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

提前致谢

这是我的 StatementsActivity.java,它显示了列表视图

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>

【问题讨论】:

  • 那么,您在单击列表项时是否遇到任何错误?
  • 如果您只点击第一个项目,您将被转移到第二个活动
  • 将 OnItemClickListener 放在 sendRequest() 之后;
  • 正如@Jas 所说,您是否遇到任何错误或什么也没发生?
  • 为什么要使用switch case?只有当您单击第一项时,它才会移动到新活动

标签: android listview onitemclicklistener


【解决方案1】:

我已经构建了一个以 Listview 样式显示的 android 应用程序,单击它们会显示它们各自的成本。

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

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);
   }
}

【讨论】:

  • 好答案。但是,您需要解释您的代码和 OP 之间的不同之处,以真正帮助 OP 和未来的人们理解这个问题。
  • 参考我的代码可以很容易理解区别。由于他也是一名编码员,因此了解这种差异不是问题
  • 我的问题主要不是对 OP 的理解,而是如果将来有人遇到类似问题但可能不太精通,那么一个好的解释可能会有很长的路要走。跨度>
  • @YashaswiBharadwaj 我的问题有点不同,我什至编辑了它。
【解决方案2】:

在您的onItemClick 中这样做:

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {


        Intent newActivity = new Intent(StatementsActivity.this, MainActivity.class);
        // Adding your variable to intent
        newActivity.putExtra("position",position);
        startActivity(newActivity);
        break;

    }

});

在您的 MainActivity.java 中:

public class MainActivity extends Activity
{
    int position;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        // Receiving your variable in another activity
        position = getIntent().getIntExtra("position",0);

    }
}

请参考:How do I pass data between Activities in Android application?

编辑:

看看这个

  1. OnItemCLickListener not working in listview
  2. ListView OnItemClickListener Not Responding?
  3. OnItemClickListener and OnClickListener not working for ListView
  4. ListView.onItemClick not working
  5. Listview itemclick not work

【讨论】:

  • 感谢您的回答,但 onClick 似乎不起作用。我已经按照你说的做了。
  • 我能看到你的activity_statements的xml代码吗??
  • 是的,我还将为其提供自定义列表布局,我将其添加到我的问题中。
  • 只是为了补充信息,我已经导入了 volley 模块来进行解析。
  • 没有妈妈还没有,不管 onItemClick 似乎不起作用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-30
  • 1970-01-01
  • 2012-10-23
相关资源
最近更新 更多