我想在一次按下按鈕時用不同的內容在列表視圖中更新單行。我知道我可以使用notifydatasetchanged(
),但會更新整個listView
。ListView更新單行
我已閱讀此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;
}
}
這就是活動的樣子:
但是,當我按下按鈕,沒有什麼變化
很棒的回答。我贊同你。他可以做的另一件事就是設置ListView本身的ItemClickListener,如果位置是什麼(假設你不使用按鈕),那麼你只需更新適配器中的列表。當然,最終他需要找出哪種選擇最適合他。 – Andy
@安迪:你說得對。事實上,這將是更好的主意。但是,既然他特意要求通過點擊一個按鈕來改變行內容,我就這麼做了。 – Ashwin
:)哦,不,你在技術上正確@Ashwin只是因爲它更高效。沒有任何不必要的工作正在完成。因爲他只想更新一行。但他確實提到這只是一個測試,所以我認爲他應該有另一種方法,以便他希望更新。 – Andy