2012-12-04 56 views
-1

正如我的状态后,我似乎无法让我的ArrayAdapter尽管呼叫"adapter.notifyDataSetChanged();"只有最后一个元素列表中的更新,更新整个列表。ArrayAdapter没有刷新自身(只有最后一个元素被更新)

人莫比可看到我做错了什么?下面

这里是我的自定义适配器

import android.app.Activity; 
import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.TextView; 

public class WeatherAdapter extends ArrayAdapter<Weather>{ 

    Context context; 
    int layoutResourceId;  
    Weather data[] = null; 
    private WeatherHolder holder; 
    private Weather weather; 


    public WeatherAdapter(Context context, int layoutResourceId, Weather[] data) { 
     super(context, layoutResourceId, data); 
     this.layoutResourceId = layoutResourceId; 
     this.context = context; 
     this.data = data; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View row = convertView; 
     holder = null; 

     if(row == null) 
     { 
      LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
      row = inflater.inflate(layoutResourceId, parent, false); 

      holder = new WeatherHolder(); 
      holder.imgIcon = (TextView)row.findViewById(R.id.imgen); 
      holder.txtTitle = (TextView)row.findViewById(R.id.txtTitle); 

      row.setTag(holder); 
     } 
     else 
     { 
      holder = (WeatherHolder)row.getTag(); 
     } 

     weather = data[position]; 
     holder.txtTitle.setText(weather.getName()); 
     //holder.imgIcon.setText(Double.toString(weather.getBuyingRate())); 
     return row; 
    } 

    public void update(String buttonPressed){ 
     if(buttonPressed == "Köp Kurs"){ 
          holder.imgIcon.setText(Double.toString(weather.getBuyingRate()));//This updates only the last element in list but I want to update every element in the list 



     } 
     else if(buttonPressed == "Antal"){    holder.imgIcon.setText(Double.toString(weather.getNrOfSharesInPortfolio()));//This updates only the last element in list but I want to update every element in the list 


     } 
    } 

    static class WeatherHolder 
    { 
     TextView imgIcon; 
     TextView txtTitle; 
    } 
} 

这里是我的主类,当我打电话“更新()”方法仅在列表的最后一个元素被更新,但没有其他人。我如何更新整个列表而不是列表中的最后一个元素?

import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.ListView; 

public class MainActivity extends Activity { 

    private ListView listView1; 
    private Button goButton; 
    private String[] listheader = {"Köp Kurs","Antal"}; 
    private WeatherAdapter adapter; 
    private int totalElemInlist = listheader.length; 
    private int currentelemInList=0; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Weather weather_data[] = new Weather[] 
     { 
      new Weather("ABB", 56.0, 300), 
      new Weather("Volvo", 89.0,500), 
      new Weather("Astra Zeneca", 98.55, 50) 
     }; 

     adapter = new WeatherAdapter(this, 
       R.layout.listview_item_row, weather_data); 


     listView1 = (ListView)findViewById(R.id.listView1); 

     View header = (View)getLayoutInflater().inflate(R.layout.listview_header_row, null); 
     listView1.addHeaderView(header); 
     goButton = (Button) findViewById(R.id.testButton); 
     goButton.setText(listheader[currentelemInList]); 

     listView1.setAdapter(adapter); 


     goButton.setOnClickListener(new OnClickListener() { 
      public void onClick(View view) { 
       String buttonPressed = (String) ((Button) view).getText(); 

       goThroughList(buttonPressed); 
       System.out.println("Button Clicked" + buttonPressed); 
      } 
      }); 
    } 

    private void goThroughList(String buttonPressed){ 
     currentelemInList++; 
     if(currentelemInList>=totalElemInlist){ 
      currentelemInList=0; 
     } 
     goButton.setText(listheader[currentelemInList]); 

     if(buttonPressed == "Köp Kurs"){ 
      System.out.println("Köp kurs"); 
      adapter.update(buttonPressed); 
      adapter.notifyDataSetChanged();//This only updates the last element in list 
     } 
     else if(buttonPressed == "Antal"){ 
      System.out.println("Antal"); 
      adapter.update(buttonPressed); 
      adapter.notifyDataSetChanged();//This only updates the last element in list 
     } 
     System.out.println(currentelemInList); 
    } 
} 
+5

使用equals()来比较'Strings'! – Luksprog

+0

Luksprog得到正确的......但在这里无关紧要......现场'holder'存储getView设置好的(通过'持有人=新WeatherHolder()最后持有人;'或'架=(WeatherHolder)row.getTag();' ...只是使用我的答案从你的prev问题...(你会错误的方式......最好不要触摸行视图以外的适配器) – Selvin

回答

0

如何更新整个列表,而不是只在列表中最后一个元素?

您必须使您的更改发生在getView()getView()每当用户滚动ListView或调用notifyDataSetChanged()时,都会重新绘制每一行。所以变化必须在那里发生,否则它们将被擦除。

首先在适配器中创建一个新的字段变量:

private String currentImage; 

第二个变化update()来控制imgIcon内容:

public void update(String buttonPressed){ 
    currentImage = buttonPressed; 
    notifyDataSetChanged(); 
} 

末变化getView()显示每行的当前图像:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    ... 

    weather = data[position]; 
    holder.txtTitle.setText(weather.getName()); 

    if(currentImage.equals("Köp Kurs")){ 
     holder.imgIcon.setText(Double.toString(weather.getBuyingRate())); 
    } 
    else if(currentImage.equals("Antal")){ 
     holder.imgIcon.setText(Double.toString(weather.getNrOfSharesInPortfolio())); 
    } 
    return row; 
} 

(Y你也可以简化goThroughList(),因为if-else包含完全相同的代码。)

0

你应该比较这样的字符串。

buttonPressed.equals("Köp Kurs") 
+1

**这不是对这个问题的答案** .. .are你免费信誉得分计算?(因为你是**只是reapeating后**高投票Luksprog评论) – Selvin

+0

我只想让答案更加清晰。 –

+0

在这个特殊的例子,我敢肯定,字符串因此实际上你可以使用==操作符......但是它是非常不推荐的(因为它取决于虚拟机中哪些字符串被实现)...... – Selvin

0

我可能是错的,但我认为问题是因为你只持有持有者中的最后一个元素。在适配器的成员变量“持有人”应该是数组或列表,你应该持有的所有元素,并在更新的方法,你应该通过夹具阵列迭代和修改文本

public void update(String buttonPressed){ 
    for(int index =0 ; index < holder.size();index++){ 
     if(buttonPressed == "Köp Kurs"){ 
          holder[index].imgIcon.setText(Double.toString(weather.getBuyingRate()));//This updates only the last element in list but I want to update every element in the list 



     } 
     else if(buttonPressed == "Antal"){    holder[index].imgIcon.setText(Double.toString(weather.getNrOfSharesInPortfolio()));//This updates only the last element in list but I want to update every element in the list 


     } 

这应该解决您的问题

+0

以这种方式搞乱了适配器的行视图是一个坏主意。 .. – Selvin