2013-07-19 37 views
0

我目前正在設計我的android應用程序的消息選項卡,並且我收到了消息活動以在列表視圖中顯示所有用戶的消息。每個listitem顯示發送消息的人的名稱和消息的主題。在兩個隱藏的文本框中,我附加了發件人的ID和郵件的ID。它可以正常工作,因爲我可以看到它。但是,我試圖在長時間按下後刪除消息。但是會發生什麼呢,當我得到後臺進程的運行時,基本上會向服務器發送要刪除的消息的ID,我意識到對於每個列表項我只發送第一個消息的ID。如果我點擊任何其他項目,它仍然顯示第一個消息ID。我真的不知道我做錯了什麼。這就是我所做的。取回創建每個listitem上創建的每個項目的ID

public class MyMessages extends ListActivity { 
    ArrayList<HashMap<String, String>> messages = new ArrayList<HashMap<String, String>>(); 
    JSONParser jsonParser=new JSONParser(); 
    public static String url_messages="..."; 
    public static String url_delete_message="..."; 
    public String theMessage; 
    public String mid; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_my_messages); 

     new readMessages().execute(); 

      ListView lv= getListView(); 

      registerForContextMenu(lv); 
      lv.setOnItemClickListener(new OnItemClickListener() { 

       @Override 
       public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 
         long arg3) { 
        String message=((TextView) arg1.findViewById(R.id.rMessage)).getText().toString(); 
        String name=((TextView) arg1.findViewById(R.id.sentName)).getText().toString(); 
        String theirId=((TextView) arg1.findViewById(R.id.pid)).getText().toString(); 
        Intent in= new Intent(getApplicationContext(), ReadMessage.class); 
        Bundle extras=new Bundle(); 
        extras.putString("name",name); 
        extras.putString("message", message); 
        extras.putString("pid", theirId); 
        in.putExtras(extras); 
        //in.putExtra("picture", picture); 
        startActivityForResult(in, 100); 

       } 

      }); 
    } 

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

    @Override 
    public void onCreateContextMenu(ContextMenu menu, View v, 
            ContextMenuInfo menuInfo) { 
     super.onCreateContextMenu(menu, v, menuInfo); 
     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.my_messages, menu); 

    } 

    public boolean onContextItemSelected(MenuItem item) { 
     switch (item.getItemId()) { 
      case R.id.delete_message: 
       // app icon in action bar clicked; go home 
       //SaveSharedPreference.setUserName(TabExercise.this,""); 
       new deleteMessage().execute(); 
       // Intent intent = new Intent(this, TabExercise.class); 
       // intent.putExtra("tab_index","2"); 
       // intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
       // startActivity(intent); 

       return true; 
      default: 
       return super.onOptionsItemSelected(item); 
     } 
    } 

    class readMessages extends AsyncTask<String, String, String>{ 

     @Override 
     protected String doInBackground(String... params) { 
      // TODO Auto-generatNameValuePairb 
      List<NameValuePair>param=new ArrayList<NameValuePair>(); 
      param.add(new BasicNameValuePair("id","4")); //SaveSharedPreference.getUserId(MyMessages.this) 

      JSONObject json=jsonParser.makeHttpRequest(url_messages, "POST", param); 
      Log.d("My messages", json.toString()); 

      try { 

       JSONArray array = json.getJSONArray("messages"); 
       Log.d("Messages length",Integer.toString(array.length())); 
       //if(array.length()==0) 
        //Log.d("Messages?","No Messages"); 
       //if(array.length()>0){ 
       for (int i = 0; i < array.length(); i++) { 
        // Log.i("name", array.getJSONObject(i).getString("name")); 
        JSONObject c = array.getJSONObject(i); 

        // Storing each json item in variable 
        String id = c.getString("sender_id"); 
        String name = c.getString("sender_name"); 
        String subject=c.getString("subject"); 
        theMessage=c.getString("message"); 
        mid=c.getString("message_id"); 
        //Log.i("Message Ids", mid); 
        // creating new HashMap 
        HashMap<String, String> map = new HashMap<String, String>(); 

        // adding each child node to HashMap key => value 
        map.put("contact_id", id); 
        map.put("sender_name", name); 
        map.put("subject", subject); 
        map.put("message", theMessage); 
        map.put("message_id", mid); 

        // adding HashList to ArrayList 
        messages.add(map); 
       } 
      /* }else{ 
        runOnUiThread(new Runnable() { 
          public void run() { 
        TextView tx=(TextView)findViewById(R.id.nocontacts); 
        tx.setVisibility(0); 
          } 
        }); 

       }*/ 
      }catch (Exception e) { 
       e.printStackTrace(); 
      } 
       return null; 
      } 
     protected void onPostExecute(String file_url) { 
      // dismiss the dialog after getting all products 

      // updating UI from Background Thread 
      runOnUiThread(new Runnable() { 
       public void run() { 

        ListAdapter adapter = new SimpleAdapter(
          MyMessages.this, messages, 
          R.layout.list_all_messages, new String[] { "contact_id","sender_name", "subject", "message", "message_id"}, 
          new int[] { R.id.pid, R.id.sentName, R.id.recMessage, R.id.rMessage, R.id.mid }); 
        // updating listview 
        setListAdapter(adapter); 

       } 
      }); 

     } 

    } 
    class deleteMessage extends AsyncTask<String, String, String>{ 
     String theirName=((TextView) findViewById(R.id.sentName)).getText().toString(); 
     String messageId=((TextView) findViewById(R.id.mid)).getText().toString(); 
     String theirId=((TextView) findViewById(R.id.pid)).getText().toString(); 
     @Override 
     protected String doInBackground(String... params) { 
      // TODO Auto-generatNameValuePairb 
      //List<NameValuePair>param=new ArrayList<NameValuePair>(); 
      //param.add(new BasicNameValuePair("id","4")); //SaveSharedPreference.getUserId(MyMessages.this) 
      //param.add(new BasicNameValuePair("mid",messageId)); 
      //JSONObject json=jsonParser.makeHttpRequest(url_delete_message, "POST", param); 
      Log.d("Message Id", messageId); 
      Log.d("Their name", theirName); 
      Log.d("Their Id", theirId); 
      //Log.d("Message status", json.toString()); 


       return null; 
      } 
     protected void onPostExecute(String file_url) { 
      // dismiss the dialog after getting all products 

      // updating UI from Background Thread 
      runOnUiThread(new Runnable() { 
       public void run() { 
      //new readNotifications().execute(); 
       } 
      }); 

     } 

    } 
} 

這是我用來獲取每個消息的ID上缺失的的AsyncTask

String messageId=((TextView) findViewById(R.id.mid)).getText().toString(); 

我覺得,這可能是問題,因爲也許它只返回ID的聲明的第一份名單。

回答

0

你說得對,問題出在哪裏,並且預計會得到此代碼的第一項。

在文檔,你可以閱讀how to implement context menu on listview

總之讓選擇的列表項的ID,您必須調用方法

AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); 

內的onContextItemSelected(MenuItem item)方法

info.id 

包含的ID選擇的項目,你可以傳遞給你的異類。

相關問題