2011-11-25 27 views
6

Tôi có một ứng dụng có tab. Trong một tab, tôi cần đặt dữ liệu (chuỗi) vào hàng. Để làm như vậy tôi đã chọn tableLayout nhưng khi tôi muốn sử dụng một contextmenu trên các hàng của nó, nó không hoạt động.Android cách sử dụng bộ điều hợp cho listView mà không mở rộng listActivity

Tôi có thể hiển thị contextmenuonLongClick nhưng vấn đề là tôi không thể lấy thông tin về hàng đã chọn để chỉnh sửa hoặc xóa hàng đã chọn. Sau đó, tôi đọc trong một cuộc thảo luận rằng việc sử dụng listView là tốt hơn tablelayout nếu chúng tôi có nhiều hàng. Nhưng các ví dụ tôi thấy mở rộng listactivity nhưng tôi không muốn làm điều này.

Vì vậy, khi tôi cố gắng làm việc trên một listView mà không cần mở rộng listactivity Tôi không biết làm thế nào để làm điều đó là những gì tôi có nghĩa là tôi chưa từng sử dụng listView trước vì vậy tôi cố gắng ví dụ khác nhau tôi tìm thấy trên internet để hiểu nó nhưng nó không hoạt động. Đây là những gì tôi đã làm cho đến nay cho listView:

String [] items=getRessources().getStringArray(R.arra.resolution); 
//Resolution is an array of strings 
ListView lv=(ListeView) findViewById(R.id.listView); 
v.setAdapter(new ArrayAdapter<string>(this, android.R.layout.simple_list_item_1, items); 

Khi tôi biên dịch nó tôi nhận được một danh sách với các yếu tố của mảng của tôi trong nó nhưng trước tiên, tôi muốn thay đổi màu sắc của văn bản mà tôi không thể. Và thứ hai tôi muốn thêm hàng động vào danh sách mà tôi không biết cách làm. Tôi nghĩ rằng tôi phải sử dụng một adapter để làm điều đó nhưng tôi không biết làm thế nào. Ai đó có thể hướng dẫn tôi qua điều này. Tôi chỉ muốn biết làm thế nào để đính kèm danh sách của tôi đến một adapter which'll cho phép tôi để tự động thêm hàng, thêm contextMenu, vv

+0

Tại sao bạn không muốn gia hạn ListActivity? – kaspermoerch

+0

@KasperMoerch thực sự tôi mới đến android dev và tôi đã gặp rắc rối với một số yếu tố tôi nghĩ rằng nó sẽ tạo ra một số khó khăn hơn. – Anila

+0

Nếu bạn đang sử dụng 'TabActivity', mỗi' Tab' sẽ giữ một 'Hoạt động'. Nếu 'Activity' chứa danh sách mà bạn đề cập có điều này là mục đích chính của nó thì sẽ dễ dàng hơn để mở rộng' ListActivity'. Nếu bạn không muốn làm điều đó, bạn cần phải thực hiện tùy chỉnh của riêng bạn 'Adapter' để đạt được các chức năng được đề cập (bạn sẽ phải làm điều này anyway, nếu bạn muốn để có thể thêm các mục vào danh sách trên bay). – kaspermoerch

Trả lời

6

chính Hoạt động lớp:

import java.util.ArrayList; 
import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.Button; 
import android.widget.ListView; 

public class SelectedActivity extends Activity { 

private SelectedAdapter selectedAdapter; 
private ArrayList<String> list; 

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

    // populate the model - a simple a list 
    list = new ArrayList<String>(); 
    list.add("Apple"); 
    list.add("Orange"); 
    list.add("Grape"); 
    list.add("Grape1"); 
    list.add("Grape2"); 
    list.add("Grape3"); 
    list.add("Grape4"); 
    list.add("Grape5"); 
    list.add("Grape6"); 

    // create our SelectedAdapter 
    selectedAdapter = new SelectedAdapter(this,0,list); 
    selectedAdapter.setNotifyOnChange(true); 

    ListView listview = (ListView) findViewById(R.id.listExample); 
    listview.setAdapter(selectedAdapter); 

    listview.setOnItemClickListener(new OnItemClickListener() { 
     //@Override 
     public void onItemClick(AdapterView arg0, View view, 
             int position, long id) { 
      // user clicked a list item, make it "selected" 
      selectedAdapter.setSelectedPosition(position); 
     } 
    }); 
} 

lớp Adapter:

import java.util.List; 
    import android.content.Context; 
    import android.graphics.Color; 
    import android.view.LayoutInflater; 
    import android.view.View; 
    import android.view.ViewGroup; 
    import android.widget.ArrayAdapter; 
    import android.widget.Button; 
    import android.widget.TextView; 

    public class SelectedAdapter extends ArrayAdapter{ 

     // used to keep selected position in ListView 
     private int selectedPos = -1; // init value for not-selected 

     public SelectedAdapter(Context context, int textViewResourceId, 
         List objects) { 
      super(context, textViewResourceId, objects); 
     } 
     public void setSelectedPosition(int pos){ 
     selectedPos = pos; 
      // inform the view of this change 
      notifyDataSetChanged(); 
     } 
     public int getSelectedPosition(){ 
      return selectedPos; 
     } 
     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
       View v = convertView; 
       // only inflate the view if it's null 
       // if (v == null) { 
         LayoutInflater vi = (LayoutInflater)this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
         v = vi.inflate(R.layout.selected_row, null); 
       // } 

       // get text view 
        TextView label = (TextView)v.findViewById(R.id.txtExample); 
        Button btn=(Button)v.findViewById(R.id.btn1); 

        // change the row color based on selected state 
        if(selectedPos == position){ 
         label.setBackgroundColor(Color.CYAN); 
         btn.setBackgroundResource(R.drawable.next); 
        } 
        else{ 
         label.setBackgroundColor(Color.WHITE); 
        } 

        label.setText(this.getItem(position).toString());  
        return(v); 
     } 
} 
+0

Cảm ơn bạn rất nhiều vì câu trả lời chỉ là một câu hỏi mà selected_Row đề cập đến trong vi.inflate (R.layout.selected_row, null). – Anila

+0

Câu hỏi tương tự cho selected_example. Đây có phải là các bố cục bạn đã tạo không? Nếu có, chúng chứa những gì? – Anila

+0

Ok Tôi đã tạo hai bố cục: một với listView và một với nút và testView và tôi không nhận được lỗi biên dịch nhưng không có gì xảy ra khi tôi nhấp vào một hàng. :S – Anila

0

main.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="@drawable/bg8" 
    android:id="@+id/RootView" 
    > 
     <LinearLayout android:id="@+id/myLayout" 
      android:layout_width="wrap_content" 
      android:layout_height="fill_parent"> 
     </LinearLayout> 

</LinearLayout> 

Bạn cần phải xác định một xml mà sẽ được sử dụng để lưu trữ dữ liệu của mỗi hàng:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="horizontal" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" android:weightSum="1"> 

    <TableRow 
     android:id="@+id/tableRow1" 
     android:layout_width="793dp" 
     android:layout_height="wrap_content" 
     android:layout_weight="0.23" > 

     <TextView android:id="@+id/col1" 
      android:layout_height="fill_parent" 
      android:layout_width="wrap_content" 
      android:width="50dp" 
      android:textSize="18sp" 

     /> 
     <TextView android:id="@+id/col2" 
      android:layout_height="fill_parent" 
      android:layout_width="wrap_content" 
      android:width="150dp" 
      android:textSize="18sp" 
     /> 
     <ImageView android:id="@+id/editimage" 
      android:background="@drawable/edit" 
      android:clickable="true" 
      android:onClick="ClickHandlerForEditImage" 
      android:layout_width="35dp" 
     android:layout_height="35dp"/> 

    </TableRow> 

</LinearLayout> 

Trong xml trên tôi cũng đã bao gồm các ImageView, nó không phải là thực sự cần thiết nhưng điều này chỉ là để cập nhật cho bạn chúng tôi cũng có thể bao gồm các điều khiển khác.

& tại cuối cùng bạn nên có một chức năng trong lớp học liên quan của bạn:

private void LoadData() 
{ 

    DBAdapter db = new DBAdapter(this); 
    db.open(); 
    Cursor cur = db.GetData(); 
    private ListView lv = (ListView)findViewById(R.id.myLayout); 
    lv.setAdapter(null); 
    if(cur.moveToFirst()) 
    { 
      String[] from = new String[] {"_id","column1"}; 
      int[] to = new int[] {R.id.col1, R.id.col2}; 
      SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,R.layout.grid_item, cur, from, to); 
      lv.setAdapter(adapter); 

    } 
     db.close(); 
     } 
} 
0

Dường như không ai đã trả lời bạn ContextMenu câu hỏi. Để có được một menu ngữ cảnh để làm việc với danh sách của bạn, sau khi bạn gọi ListView yourList = getListView(); bạn phải gọi registerForContextMenu(yourList);

Và để xử lý việc tạo menu, bạn phải thực hiện các phương pháp

@Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo){ 
super.onCreateContextMenu(context, v,menuInfo); 
MenuInflater inflater = getMenuInflater(); 
menu.setHeaderTitle("YOUR TITLE"); 
menu.setHeaderIcon(R.drawable.YOUR DRAWABLE); 
inflater.inflate(R.menu.YOUR_MENU_RESOURCE, menu); 
} 

Sau đó, bạn có thể đáp ứng với nhấp chuột bằng cách implenting sự phương pháp

@Override public boolean onContextItemSelected(MenuItem item){ 
switch(item.getItemId()){ 
case R.id.YOUR_MENU_ITEM: // do stuff if the item is selected 
return true; 
case R.id.YOUR_MENU_ITEM: // do stuff if the item is selected 
return true; 
case R.id.YOUR_MENU_ITEM: // do stuff if the item is selected 
return true; 
} 
return false; // nothing selected 
} 
Các vấn đề liên quan