35

以下是我的測試代碼創建列表視圖,列表視圖顯示成功,但是,點擊事件中有錯誤。我想創建一個發送硬編碼消息到新活動的意圖。然而,它顯示錯誤的線如何在Android的Listview中處理點擊事件?

Intent intent = new Intent(context, SendMessage.class); 

所以,問題是,我應該爲這個類提供什麼?

此外,而不是硬編碼輸出消息,如何捕獲列表視圖行中的數據並傳遞給新的活動?例如第一行爲BBB,AAA,R.drawable.tab1_hdpi

謝謝。

public class MainActivity extends Activity { 
    public final static String EXTRA_MESSAGE = "com.example.ListViewTest.MESSAGE"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     ArrayList<ListEntry> members = new ArrayList<ListEntry>(); 
     members.add(new ListEntry("BBB","AAA",R.drawable.tab1_hdpi)); 
     members.add(new ListEntry("ccc","ddd",R.drawable.tab2_hdpi)); 
     members.add(new ListEntry("assa","cxv",R.drawable.tab3_hdpi)); 
     members.add(new ListEntry("BcxsadvBB","AcxdxvAA")); 
     members.add(new ListEntry("BcxvadsBB","AcxzvAA")); 
     members.add(new ListEntry("BcxvBB","AcxvAA")); 
     members.add(new ListEntry("BvBB","AcxsvAA")); 
     members.add(new ListEntry("BcxvBB","AcxsvzAA")); 
     members.add(new ListEntry("Bcxadv","AcsxvAA")); 
     members.add(new ListEntry("BcxcxB","AcxsvAA")); 
     ListView lv = (ListView)findViewById(R.id.listView1); 
     Log.i("testTag","before start adapter"); 
     StringArrayAdapter ad = new StringArrayAdapter (members,this); 
     Log.i("testTag","after start adapter"); 
     Log.i("testTag","set adapter"); 
     lv.setAdapter(ad); 
     lv.setOnItemClickListener(new OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, 
        long id) { 
       Intent intent = new Intent(context, SendMessage.class); 
       String message = "abc"; 
       intent.putExtra(EXTRA_MESSAGE, message); 
       startActivity(intent); 
      } 
     }); 
    } 

回答

77

我看不到你在哪裏聲明context。在意向創作的目的,你可以使用MainActivity.this

lv.setOnItemClickListener(new OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, 
        long id) { 
       Intent intent = new Intent(MainActivity.this, SendMessage.class); 
       String message = "abc"; 
       intent.putExtra(EXTRA_MESSAGE, message); 
       startActivity(intent); 
      } 
     }); 

檢索對象在你點擊就可以使用AdapterView

ListEntry entry = (ListEntry) parent.getItemAtPosition(position); 
+0

謝謝,無論如何,背景是什麼意思? – user782104

+1

你能改說嗎? – Blackbelt

+0

這意味着,Intent類中的第一個參數實際表示什麼? MainActivity.this是什麼意思?感謝文檔 – user782104

12

ListView中有項目點擊偵聽器回調。您應該在ListView中設置onItemClickListener。回叫包含AdapterViewposition作爲參數。哪個可以給你ListEntry

lv.setOnItemClickListener(new OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, 
        long id) { 
       ListEntry entry= (ListEntry) parent.getAdapter().getItem(position); 
       Intent intent = new Intent(MainActivity.this, SendMessage.class); 
       String message = entry.getMessage(); 
       intent.putExtra(EXTRA_MESSAGE, message); 
       startActivity(intent); 
      } 
     }); 
+1

謝謝。如果入口對象有3個項目?兩個字符串和一個整數(存儲的照片),如何將其暴露並傳遞給新活動(是否有必要)? – user782104

+0

您可以在ListEntry中實現Parceble或Serializable,並可以將整個對象傳遞給您的新活動。 –

6

錯誤是在你的代碼如你所說

Intent intent = new Intent(context, SendMessage.class); 

這是因爲你是根據意向

的構造提供OnItemClickListener匿名類的情況下進入意向構造函數,但未來從這句話
android.content.Intent.Intent(Context packageContext, Class<?> cls) 

您必須提供您正在使用意圖的MainActivity類上下文的活動的上下文。所以你的說法這是給錯誤將被轉換爲

Intent intent = new Intent(MainActivity.this, SendMessage.class); 

而且從這個MainActivity到SendMessage函數類的傳送信息,請參見下面的代碼

lv.setOnItemClickListener(new OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, 
        long id) { 
       ListEntry entry= (ListEntry) parent.getAdapter().getItem(position); 
       Intent intent = new Intent(MainActivity.this, SendMessage.class); 
       intent.putExtra(EXTRA_MESSAGE, entry.getMessage()); 
       startActivity(intent); 
      } 
     }); 

請讓我知道如果這有助於你

編輯: - 如果你發現一些問題,以獲得列表的價值做一件事情declear你的數組列表

ArrayList<ListEntry> members = new ArrayList<ListEntry>(); 

全局即之前的OnCreate,改變你的聽衆如下

lv.setOnItemClickListener(new OnItemClickListener() { 
       @Override 
       public void onItemClick(AdapterView<?> parent, View view, int position, 
         long id) { 
        Intent intent = new Intent(MainActivity.this, SendMessage.class); 
        intent.putExtra(EXTRA_MESSAGE, members.get(position)); 
        startActivity(intent); 
       } 
      }); 

所以你的整個代碼看起來

public class MainActivity extends Activity { 
    public final static String EXTRA_MESSAGE = "com.example.ListViewTest.MESSAGE"; 
ArrayList<ListEntry> members = new ArrayList<ListEntry>(); 

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

     members.add(new ListEntry("BBB","AAA",R.drawable.tab1_hdpi)); 
     members.add(new ListEntry("ccc","ddd",R.drawable.tab2_hdpi)); 
     members.add(new ListEntry("assa","cxv",R.drawable.tab3_hdpi)); 
     members.add(new ListEntry("BcxsadvBB","AcxdxvAA")); 
     members.add(new ListEntry("BcxvadsBB","AcxzvAA")); 
     members.add(new ListEntry("BcxvBB","AcxvAA")); 
     members.add(new ListEntry("BvBB","AcxsvAA")); 
     members.add(new ListEntry("BcxvBB","AcxsvzAA")); 
     members.add(new ListEntry("Bcxadv","AcsxvAA")); 
     members.add(new ListEntry("BcxcxB","AcxsvAA")); 
     ListView lv = (ListView)findViewById(R.id.listView1); 
     Log.i("testTag","before start adapter"); 
     StringArrayAdapter ad = new StringArrayAdapter (members,this); 
     Log.i("testTag","after start adapter"); 
     Log.i("testTag","set adapter"); 
     lv.setAdapter(ad); 
     lv.setOnItemClickListener(new OnItemClickListener() { 
        @Override 
        public void onItemClick(AdapterView<?> parent, View view, int position, 
          long id) { 
         Intent intent = new Intent(MainActivity.this, SendMessage.class); 
         intent.putExtra(EXTRA_MESSAGE, members.get(position).getMessage()); 
         startActivity(intent); 
        } 
       }); 
    } 

其中的getMessage()會在你的一個ListEntry類中指定一個getter方法,它使用的是得到消息這是之前設置的。

+0

對於ListEntry類型,getMessage()方法未定義? – user782104

+0

它在entry.getMessage()有錯誤,對不起忘了提 – user782104

+1

@ user782104請檢查我編輯的代碼 –

4

首先,類必須實現點擊listenener:

implements OnItemClickListener 

然後設置一個監聽到ListView

yourList.setOnItemclickListener(this); 

最後,創建CLIC方法:

@Override 
public void onItemClick(AdapterView<?> parent, View view, int position, 
long id) { 
Toast.makeText(MainActivity.this, "You Clicked at ", 
Toast.LENGTH_SHORT).show(); 
} 
2
//get main activity 
    final Activity main_activity=getActivity(); 

    //list view click listener 
    final ListView listView = (ListView) inflatedView.findViewById(R.id.listView_id); 
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      String stringText; 

      //in normal case 
      stringText= ((TextView)view).getText().toString();     

      //in case if listview has separate item layout 
      TextView textview=(TextView)view.findViewById(R.id.textview_id_of_listview_Item); 
      stringText=textview.getText().toString();     

      //show selected 
      Toast.makeText(main_activity, stringText, Toast.LENGTH_LONG).show(); 
     } 
    }); 

    //populate listview 
2

根據我的測試,

  1. implements OnItemClickListener - > works。

  2. setOnItemClickListener - > works。

  3. ListView控件默認情況下點擊(API 19)

重要的是, 「點擊」 僅適用於TextView的(如果你選擇simple_list_item_1.xml的項目)。這意味着,如果您爲ListView提供文本數據,則單擊文本區域時「單擊」將起作用。點擊空白區域不會觸發「點擊事件」。

相關問題