35

Dưới đây là mã thử nghiệm của tôi để tạo chế độ xem danh sách, chế độ xem danh sách hiển thị thành công, tuy nhiên, có lỗi trong sự kiện nhấp chuột. Tôi muốn tạo một ý định để gửi một thông điệp hardcode đến một hoạt động mới. Tuy nhiên, lỗi này hiển thị lỗi cho dòngLàm cách nào để xử lý sự kiện nhấp trong Listview trong Android?

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

Vì vậy, vấn đề là, tôi nên cung cấp gì cho lớp học này?

Ngoài ra, thay vì mã cứng thông báo đầu ra, cách chụp dữ liệu trong hàng chế độ xem danh sách và chuyển đến hoạt động mới? ví dụ. BBB,AAA,R.drawable.tab1_hdpi cho hàng đầu tiên.

Cảm ơn.

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

Trả lời

77

Tôi không thể nhìn thấy nơi bạn khai báo context. Vì mục đích của việc tạo ra ý định, bạn có thể sử dụng 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); 
      } 
     }); 

Để lấy các đối tượng khi bạn đã nhấp bạn có thể sử dụng AdapterView:

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

Cảm ơn, ngữ cảnh có nghĩa là gì? – user782104

+1

bạn có thể thuật lại không? – Blackbelt

+0

Điều đó có nghĩa, tham số đầu tiên trong lớp Intent thực sự đại diện là gì? MainActivity.điều này có nghĩa là gì? cảm ơn – user782104

12

ListView có callback mục nhấp chuột nghe. Bạn nên đặt onItemClickListener trong ListView. Gọi lại có chứa AdapterViewposition làm thông số. Có thể cung cấp cho bạn 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

Cảm ơn. Nếu đối tượng nhập có 3 mục? hai chuỗi và một số nguyên (một hình ảnh được lưu trữ), Làm thế nào để lộ nó và chuyển sang hoạt động mới (là nó cần thiết để)? – user782104

+0

Bạn có thể thực hiện Parceble hoặc Serializable trong ListEntry và có thể chuyển toàn bộ đối tượng đến hoạt động mới của bạn. –

6

Lỗi đang đến trong mã của bạn từ tuyên bố này như bạn nói

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

Điều này là do bạn đang cung cấp bối cảnh OnItemClickListener lớp nặc danh vào constructor Ý định nhưng theo constructor của Ý định

android.content.Intent.Intent(Context packageContext, Class<?> cls) 

Bạn phải cung cấp ngữ cảnh hoạt động của mình mà bạn đang sử dụng ý định là ngữ cảnh lớp MainActivity. nên tuyên bố của bạn mà là cho lỗi sẽ được chuyển đổi sang

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

Cũng để gửi thông điệp của bạn từ MainActivity này đến lớp SendMessage xin vui lòng xem dưới đây đang

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

Xin vui lòng cho tôi biết nếu điều này giúp bạn

EDIT: - Nếu bạn đang tìm kiếm một số vấn đề để có được giá trị của danh sách, hãy làm một điều từ danh sách mảng của bạn

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

toàn cầu tức làtrước onCreate và thay đổi người nghe của bạn như sau

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

Vì vậy, toàn bộ mã của bạn sẽ trông như

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

đâu getMessage() sẽ là một phương thức getter quy định tại lớp ListEntry mà bạn đang sử dụng để nhận được tin nhắn đã được đặt trước đó.

+0

Phương thức getMessage() không được định nghĩa cho kiểu ListEntry? – user782104

+0

nó có lỗi tại entry.getMessage(), xin lỗi quên đề cập đến – user782104

+1

@ user782104 vui lòng kiểm tra mã đã chỉnh sửa của tôi –

4

Thứ nhất, lớp phải thực hiện các listenener nhấp chuột:

implements OnItemClickListener 

Sau đó thiết lập một người nghe đến ListView

yourList.setOnItemclickListener(this); 

Và cuối cùng, tạo ra các phương pháp 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

Theo thử nghiệm của tôi,

  1. cụ OnItemClickListener -> hoạt động.

  2. setOnItemClickListener -> works.

  3. ListView là nhấp chuột được theo mặc định (API 19)

Điều quan trọng là, "click" chỉ hoạt động để TextView (nếu bạn chọn simple_list_item_1.xml như mục). Điều đó có nghĩa là nếu bạn cung cấp dữ liệu văn bản cho ListView, "nhấp" sẽ hoạt động khi bạn nhấp vào vùng văn bản. Nhấp vào vùng trống sẽ không kích hoạt "sự kiện nhấp chuột".

Các vấn đề liên quan