2012-11-11 36 views
5

Tôi muốn cập nhật một hàng trong danh sách xem của mình với nội dung khác nhau khi tôi nhấn một nút. Tôi biết tôi có thể sử dụng notifydatasetchanged() nhưng điều đó sẽ cập nhật toàn bộ listView.ListView Đang cập nhật một hàng

Tôi đã đọc số này answer và nó phù hợp hoàn hảo với những gì tôi muốn làm.

Tôi đã thực hiện chế độ xem danh sách với 5 hàng và khi tôi nhấn nút, tôi muốn cập nhật hàng thứ 4 bằng một văn bản khác. Tôi không muốn thiết lập các văn bản programatically vì đây chỉ là một dự án giả chỉ để xem nếu làm mới một hàng duy nhất là có thể và dự án thực sự của tôi là phức tạp hơn nhiều so với chỉ là một textview.

Vì vậy, câu hỏi của tôi là: tôi có thể sử dụng getView() để cập nhật một hàng trong một listview không?

Đây là mã của tôi:

Hoạt động của tôi:

public class MainActivity extends Activity { 

    public ListView list1; 
    public listAdapter adapter; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     list1 = (ListView) findViewById(R.id.my_list); 
     adapter = new listAdapter(this); 
     list1.setAdapter(adapter); 

     Button button1 = (Button) findViewById(R.id.my_button); 
     button1.setOnClickListener(new OnClickListener() { 

      public void onClick(View v) { 
       adapter.setText("Different text"); 
       View row2Update = list1.getChildAt(3); 
       list1.getAdapter().getView(3, row2Update, list1); 

      } 
     }); 

    } 

} 

bộ chuyển đổi của tôi:

public class listAdapter extends BaseAdapter{ 

    public Activity activity; 
    public String text="Normal Text"; 

    public listAdapter(Activity activity){ 

     this.activity = activity; 
    } 

    public void setText(String text){ 
     this.text = text; 
    } 

    public int getCount() { 
     return 5; 
    } 

    public Object getItem(int position) { 

     return null; 
    } 

    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = activity.getLayoutInflater(); 
     LinearLayout rowView = (LinearLayout) inflater.inflate(R.layout.row_layout, null); 
     TextView textView = (TextView) rowView.findViewById(R.id.row_text); 
     textView.setText(text); 
     return rowView; 
    } 

} 

Đây là những gì hoạt động trông giống như:

Activity snapshot

Nhưng khi tôi nhấn nút của tôi có gì thay đổi

Trả lời

3

Bạn không thể gọi các getView() phương pháp của bộ chuyển đổi chính mình. Phương pháp này của bộ chuyển đổi getView() được chỉ gọi, khi

  • các listview là tạo
  • khi người dùng cuộn danh sách xem
  • khi notifysetdatachanged() được gọi.
    Tất cả những điều này được thực hiện bởi hệ điều hành. GetView() được gọi cho tất cả các hàng trong listview. Nó không được gọi cho chỉ một hàng duy nhất.Vì vậy, nếu bạn muốn thay đổi các hàng, bạn phải cung cấp lại dữ liệu trong một String[], ArrayList<> vv
    Nếu bạn muốn văn bản khác xuất hiện cho một hàng, onClick() của một nút - bạn có thể làm điều này

    public class listAdapter kéo dài BaseAdapter {

    public Activity activity; 
    public ArrayList<String> text; 
    
    public listAdapter(Activity activity){ 
    
        this.activity = activity; 
    } 
    
    public void setText(ArrayList<String> text){ 
        this.text = text; 
    } 
    
    public int getCount() { 
        return 5; 
    } 
    
    public Object getItem(int position) { 
    
        return null; 
    } 
    
    public long getItemId(int position) { 
        // TODO Auto-generated method stub 
        return 0; 
    } 
    
    public View getView(int position, View convertView, ViewGroup parent) { 
        LayoutInflater inflater = activity.getLayoutInflater(); 
        LinearLayout rowView = (LinearLayout) inflater.inflate(R.layout.row_layout, null); 
        TextView textView = (TextView) rowView.findViewById(R.id.row_text); 
        textView.setText(text[position]); 
        return rowView; 
    } 
    

    }
    Và trong hoạt động của bạn:

    list1 = (ListView) findViewById(R.id.my_list); 
    adapter = new listAdapter(this); 
    String[] entries={"Normal Text","Normal Text","Normal Text","Normal text","Normal text"}; 
    ArrayList<String> text=Arrays.asList(entries); 
    adapter.setText(text); 
    list1.setAdapter(adapter); 
    
    Button button1 = (Button) findViewById(R.id.my_button); 
    button1.setOnClickListener(new OnClickListener() { 
    
        public void onClick(View v) { 
         text.set(3,"Different Text"); 
         adapter.setText(text); 
         list1.setAdapter(adapter); 
    
        } 
    }); 
    


    Có một cách khác để làm việc đó cũng như @Andy đề xuất trong một trong những nhận xét:

    listViewPeople.setOnItemClickListener(new ListView.OnItemClickListener() { 
         @Override 
        public void onItemClick(AdapterView<?> a, View v, int position, long l) { 
          //IF YOU WANT TO CHANGE THE CONTENT OF THE ROW CLICKED 
         if(position == someNumber) { 
           text.set(position,"different Text"); 
           list1.setAdapter(text); 
         } 
        } 
    }); 
    

Xin lỗi vì văn bản in đậm. Vì một lý do nào đó, CTRL + K không hoạt động đối với mã trên.

+0

Câu trả lời hay. Tôi đồng ý với bạn. Một điều khác anh ta có thể làm là chỉ cần đặt onItemClickListener vào chính ListView, và nếu vị trí là bất cứ điều gì (giả sử bạn không sử dụng một nút), bạn chỉ cần cập nhật danh sách trong bộ điều hợp. Tất nhiên cuối cùng anh ta cần phải tìm ra tùy chọn nào là tốt nhất cho anh ta. – Andy

+0

@Andy: Bạn nói đúng. Trên thực tế đó sẽ là ý tưởng tốt hơn. Nhưng kể từ đó, ông đặc biệt yêu cầu thay đổi nội dung hàng trên một nút bấm, tôi đã đi cho điều này. – Ashwin

+0

:) Ồ không, bạn đúng về mặt kỹ thuật @Ashwin chỉ vì nó hiệu quả hơn. Không có bất kỳ công việc không cần thiết nào đang được thực hiện. Vì anh ấy chỉ muốn cập nhật một dòng. Nhưng anh ấy đề cập rằng đây chỉ là một bài kiểm tra, vì vậy tôi nghĩ anh ấy cũng nên có một phương pháp khác trong trường hợp anh ấy muốn nhiều hơn để được cập nhật. – Andy

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