如何在从json解析的列表视图上使用onItemclick

时间:2016-07-14 12:42:35

标签: android listview onitemclicklistener

我有一个使用listview来显示从JSON收到的数据的应用程序。现在,我想在listview中有一个onItemclick监听器,这样在显示listview后,用户可以点击任意一行来开始一个新活动。但onclicklistener无法正常工作。我是一名新开发人员,因此无法使其正常工作。请帮助我,以便我可以实现onclick Listener。提前谢谢。

编辑: - 我面临的另一个问题是切换机箱似乎无法正常工作,因为我不知道有多少ID会被添加到行中,即行不为我所知,它可能是什么。那么我应该使用什么而不是开关盒呢?

提前致谢

这是我的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>

2 个答案:

答案 0 :(得分:2)

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

以下是代码。希望,它可以帮助你...

read(5, "80\0\0\0\00078", 8)            = 8
read(5, "prf-exit\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"..., 80) = 80
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
fstat(1, {st_mode=S_IFIFO|0600, st_size=0, ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2af316b0f000
write(1, "\n", 1)                       = 1
read(5, "\0\0\0\0", 4)                  = 4
write(5, "\0\0\0\0", 4)                 = 4
socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 9
setsockopt(9, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
setsockopt(9, SOL_TCP, TCP_NODELAY, [1], 4) = 0
setsockopt(9, SOL_SOCKET, SO_SNDBUF, [65536], 4) = 0
setsockopt(9, SOL_SOCKET, SO_RCVBUF, [65536], 4) = 0
fcntl(9, F_GETFL)                       = 0x2 (flags O_RDWR)
fcntl(9, F_SETFL, O_RDWR)               = 0
connect(9, {sa_family=AF_INET, sin_port=htons(45323), sin_addr=inet_addr("10.10.10.251")}, 16) = 0
write(9, "12345\0", 6)                  = 6
write(9, "15  NORMAL_EXITING\0", 19)    = 19
read(9, "\0", 1)                        = 1
close(9)                                = 0
futex(0x2af31686d9d0, FUTEX_WAIT, 29590, NULL) = 0
futex(0x2af31666c9d0, FUTEX_WAIT, 29589, NULL) = 0
close(6)                                = 0
close(7)                                = 0
read(5, "\0\0\0\0", 4)                  = 4
write(5, "\0\0\0\0", 4)                 = 4
read(5, "\0\0\0\0", 4)                  = 4
write(5, "\0\0\0\0", 4)                 = 4
close(5)                                = 0
close(5)                                = -1 EBADF (Bad file descriptor)
socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 5
connect(5, {sa_family=AF_INET, sin_port=htons(49986), sin_addr=inet_addr("172.20.54.10")}, 16) = 0
setsockopt(5, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
setsockopt(5, SOL_TCP, TCP_NODELAY, [1], 4) = 0
write(5, "\35\0\0\0\0\0\0\0\1\0\0\0\0\0\0\0\1\0\0\0\1\0\0\0\0\0\0\0\0\0\0\0"..., 64) = 64
close(5)                                = 0
close(4)                                = 0
exit_group(0)                           = ?
Process 29588 detached
[root@compute-0-3 ~]# lsof -p 29588
[root@compute-0-3 ~]#

答案 1 :(得分:0)

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