簡體   English   中英

在列表視圖項上按ID打開新活動,請點擊

[英]Open New Activity by id on Listview Item Click

我的ListView正在打開,一切正常。 我不知道如何將參數從onPostExecute()傳遞給onItemClick(),以按ID打開新活動(SingleItem.java)。 我嘗試過的所有方法均無濟於事。

ListItems.java

public class ListItems extends Activity {

private ListView listV;
TextView estado, cidade, noItem;

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

    listV = (ListView) findViewById(R.id.listV);

    estado = (TextView) findViewById(R.id.Estado);
    cidade = (TextView) findViewById(R.id.Cidade);
    noItem = (TextView) findViewById(R.id.noItem);

    estado.setText(getIntent().getExtras().getString("state"));     
    cidade.setText(getIntent().getExtras().getString("city"));

    Task task = new Task();
    task.execute();

    listV.setOnItemClickListener(new OnItemClickListener() {

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

            Intent intent = new Intent(getApplicationContext(), SingleItem.class);

            startActivity(intent);
        }
    });
}

public class Task extends AsyncTask<String, String, Void>{

    private ProgressDialog progressDialog = new ProgressDialog(ListItems.this);

    InputStream is = null;
    String result = "";

    protected void onPreExecute() {
        progressDialog.setMessage("Listing Items...");
        progressDialog.show();
        progressDialog.setOnCancelListener(new OnCancelListener() {

            @Override
            public void onCancel(DialogInterface dialog) {
                Task.this.cancel(true);
            }
        });
    };

    @Override
    protected Void doInBackground(String... params) {

        String url = "http://myip/webviews/jsonlistItems.php";

        HttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url);

        ArrayList<NameValuePair> param = new ArrayList<NameValuePair>();

        try {
            httpPost.setEntity(new UrlEncodedFormEntity(param));

            HttpResponse httpResponse = httpClient.execute(httpPost);
            HttpEntity httpEntity = httpResponse.getEntity();

            is = httpEntity.getContent();

        } catch (Exception e) {
            Log.e("log_tag", "Error connecting to database " + e.toString());
            Toast.makeText(ListItems.this, "Try again.", Toast.LENGTH_LONG).show();
        }

        try
        {
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            StringBuilder sb = new StringBuilder();
            String line = "";

            while((line = br.readLine()) != null){
                sb.append(line+"\n");
            }
                is.close();
                result = sb.toString();

        }catch(Exception e){
            Log.e("log_tag", "Error converting result " + e.toString());
        }
        return null;
    }

    protected void onPostExecute(Void v){

        try {
            JSONArray Jarray = new JSONArray(result);
            for (int i = 0; i < Jarray.length(); i++) {
                JSONObject jsonObject = null;
                jsonObject = Jarray.getJSONObject(i);

                // output
                String item_id = jsonObject.getString("item_id");

                String item_name = jsonObject.getString("item_name");
                String item_color = jsonObject.getString("item_color");
                String city = jsonObject.getString("city");
                String statee = jsonObject.getString("state");

                if(estado.getText().toString().equalsIgnoreCase(statee) && 
                        cidade.getText().toString().equalsIgnoreCase(city)){

                    String[] values = new String[] {item_name, item_color};

                    ArrayAdapter<String> adapter = new ArrayAdapter<String>(ListItems.this, android.R.layout.simple_list_item_1, values);

                    listV.setAdapter(adapter);
                    break;
                }
                else{
                    noItem.setText("No Item to show");
                }
            }
            this.progressDialog.dismiss();
        } catch (Exception e) {
            Log.e("log_tag", "Error parsing data "+e.toString());
        }
    }

}


public class ItemById{

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.list_events, 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();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}
}

SingleItem.java

public class SingleItem extends Activity {

TextView item_name, item_color;

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

    item_name = (TextView) findViewById(R.id.item_name);
    item_color = (TextView) findViewById(R.id.item_color);


}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.event, 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();
    if (id == R.id.action_settings) {
        return true;
    }
    return super.onOptionsItemSelected(item);
}
}

如何將參數從onPostExecute()傳遞給onItemClick()以通過ID打開新活動(SingleItem.java)?

適配器看起來只由JSON對象的每個屬性填充(item_name的一行,item_color的一行)。 如果這是您想要的,自然就不會得到item_id,因為它不存在。

如果希望每一行都對應於每個JSON對象,則應修改適配器。

首先像這樣使自己的課

class Wrap{
    String itemId, itemName, city, statee;
}

然后創建擴展ArrayAdapter<Wrap>自己的Adapter類。

這樣,每次單擊一行時,您都可以獲得包含所有內容(包括ID)的Wrap對象。 然后,您可以將這些值傳遞給下一個活動。

這完全取決於您的SingleItem Activity打開時應顯示的內容。 如果只需要選定項目的名稱,則只需在onItemClick方法中檢索項目名稱,然后將其作為參數傳遞給SingleItem:

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    Intent intent = new Intent(getApplicationContext(), SingleItem.class);
    String name = adapter.getItem(position);
    intent.putExtra("yourItem", name);
    startActivity(intent);
}

為了使它起作用,適配器需要是Activity中的變量:

public class ListItems extends Activity {
    private ArrayAdapter<String> adapter;

和這個:

ArrayAdapter<String> adapter = new ArrayAdapter<String>(ListItems.this, android.R.layout.simple_list_item_1, values);

變成這個:

adapter = new ArrayAdapter<String>(ListItems.this, android.R.layout.simple_list_item_1, values);

如果您在SingleItem Activity中需要的不僅僅是信息名稱,還需要創建一個Item類來保存該信息:

public static class Item implements Serializable {
    String mName;
    String mColor;
    // more data

    @Override
    public String toString() {
        return mName;
    }
}

您的onItemClick變為:

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    Intent intent = new Intent(getApplicationContext(), SingleItem.class);
    Item item = adapter.getItem(position);
    intent.putExtra("yourItem", name);
    startActivity(intent);
}

您的適配器為:

ArrayAdapter<Item> adapter;
adapter = new ArrayAdapter<Item>(ListItems.this, android.R.layout.simple_list_item_1, itemArray);

當然,在解析json流時,您需要創建itemArray。

該活動可以輕松地從意圖中讀取所選項目,如下所示:

getIntent().getSerializableExtra("yourItem");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM