2012-11-11 28 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