2012-11-11 29 views
5

我想在一次按下按鈕時用不同的內容在列表視圖中更新單行。我知道我可以使用notifydatasetchanged(),但會更新整個listViewListView更新單行

我已閱讀此answer,它完全符合我想要做的。

我做了5行的列表視圖,當我按下按鈕時,我想用不同的文本更新第4行。我不想以編程方式設置文本,因爲這只是一個虛擬項目,以查看是否可以刷新單行,而我的真實項目比textview複雜得多。

所以我的問題是:我可以使用getView()來更新listview中的單個行嗎?

這裏是我的代碼:

我的活動:

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

      } 
     }); 

    } 

} 

我的適配器:

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

} 

這就是活動的樣子:

Activity snapshot

但是,當我按下按鈕,沒有什麼變化

回答

3

不能呼叫getView()適配器自己的方法。適配器的getView()方法才調用,當

  • ListView控件是創建
  • 當用戶滾動列表視圖
  • notifysetdatachanged時()被調用。
    所有這些都是由操作系統完成的。爲列表視圖中的所有行調用GetView()。它不被稱爲只有一行。所以,如果你想改變行,你必須在String[]ArrayList<>
    再次提供數據如果你想單獨一行顯示不同的文本,onClick()按鈕 - 你可以這樣做

    公共類listAdapter延伸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; 
    } 
    

    }
    而在你的活動:

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


    有這樣做也是另一種方式@Andy在評論的一個建議:

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

對不起,我大膽的文字。由於某些原因,CTRL + K不適用於上述代碼。

+0

很棒的回答。我贊同你。他可以做的另一件事就是設置ListView本身的ItemClickListener,如果位置是什麼(假設你不使用按鈕),那麼你只需更新適配器中的列表。當然,最終他需要找出哪種選擇最適合他。 – Andy

+0

@安迪:你說得對。事實上,這將是更好的主意。但是,既然他特意要求通過點擊一個按鈕來改變行內容,我就這麼做了。 – Ashwin

+0

:)哦,不,你在技術上正確@Ashwin只是因爲它更高效。沒有任何不必要的工作正在完成。因爲他只想更新一行。但他確實提到這只是一個測試,所以我認爲他應該有另一種方法,以便他希望更新。 – Andy