5

按下按钮后,我想用不同的内容更新列表视图中的单行。我知道我可以使用notifydatasetchanged(),但这会更新整个listView

我已经阅读了这个答案,它非常适合我想做的事情。

我已经完成了 5 行的列表视图,当我按下按钮时,我想用不同的文本更新第 4 行。我不想以编程方式设置文本,因为这只是一个虚拟项目,只是为了查看是否可以刷新单行,而我的真实项目比textview.

所以我的问题是:我可以getView()用来更新 a 中的单行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;
    }

}

这是活动的样子:

活动快照

但是当我按下按钮时,什么都没有改变

4

1 回答 1

3

不能自己调用​​适配器的getView()方法。适配器的 getView() 方法仅在以下情况下被调用

  • 列表视图已创建
  • 当用户滚动列表视图时
  • 当 notifysetdatachanged() 被调用时。
    所有这些都是由操作系统完成的。为列表视图中的所有行调用 GetView()。它不只是单行调用。因此,如果您想更改行,则必须在 a 等中再次提供数据String[]如果 您希望为单行显示不同的文本,onClick() 按钮 - 您可以这样ArrayList<>

    公共类 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不适用于上述代码。

于 2012-11-11T02:40:13.077 回答