2

在下面的代码中,我设置了一个显示 2 个 ListViews 的片段。

当主要活动调用片段方法时:

 prendiListaBest

 prendiListaWorst

他们在适配器上调用 notifyDataSetChanged(),

因此列表应该使用 ArrayLists 的新内容进行更新。

但这不会发生。

请任何帮助和建议超过欢迎

public class WorstBest extends Fragment {
    public ListView lvBest;
public ListView lvWorst;
public MyAdapter myAdap;
public MyAdapter myAdap2;
public ArrayList<Stock> best;
public ArrayList<Stock> worst;
public View v;
   @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
        Bundle savedInstanceState) {
        v= inflater.inflate(R.layout.listaworstbest, container, false);    
        lvBest= (ListView)v.findViewById(R.id.listbest);
        lvWorst=(ListView)v.findViewById(R.id.listworst);;
        myAdap= new MyAdapter(best, getActivity());
        myAdap2= new MyAdapter(worst, getActivity());
        lvBest.setAdapter(myAdap);
        lvWorst.setAdapter(myAdap2);
        return v;              
    }

    public void prendiListaBest(ArrayList<Stock> al){
        Log.e("", "passo per prendilitsa del fragment worstbest");
        best=al;
        Log.e("", "nel fragment best è" + Integer.toString(best.size()));
        myAdap.notifyDataSetChanged();
    }    

    public void prendiListaWorst(ArrayList<Stock> al){
        Log.e("", "passo per prendilitsa del fragment worstbest");
        worst=al;
        Log.e("", "nel fragment worst è" + Integer.toString(worst.size()));
        myAdap2.notifyDataSetChanged();
    }

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
    }
}

这是我的自定义适配器的代码。我按要求发布了,但我很抱歉,因为它真的很乱:

public class MyAdapter extends BaseAdapter   {
    ArrayList<Stock> l; 
    Activity a;

public MyAdapter(ArrayList<Stock> li, Activity ac) {
        // TODO Auto-generated constructor stub
    l = li;
    a=ac;
}

public View getView(int position, View convertView, ViewGroup parent) {
    View row=convertView;

    if (row==null) {
    LayoutInflater inflater=a.getLayoutInflater();
    row=inflater.inflate(R.layout.row, parent, false);
    }   
    TextView tw=(TextView)row.findViewById(R.id.textView1);

    String st=l.get(position).simbolo;
    String st1=st;
    String st2=st;
    String st3=st;
    String st4=st;
    String st5=st;
    String st6=st;
    String st7=st;
    String st8=st;
    st8=st;
        if(st.length()<=7){st1=st.concat("     ");st2=st1;st3=st1;st4=st1;st5=st1;st6=st1;st7=st1;st8=st1;}
    if(st1.length()<=7){st2=st1.concat("     ");st3=st2;st4=st2;st5=st2;st6=st2;st7=st2;st8=st2;}
    if(st2.length()<=7){st3=st2.concat(" ");st4=st3;st5=st3;st6=st3;st7=st3;st8=st3;}
    if(st3.length()<=7){st4=st3.concat(" ");st5=st4;st6=st4;st7=st4;st8=st4;}
    if(st4.length()<=7){st5=st4.concat(" ");st6=st5;st7=st5;st8=st5;}
    if(st5.length()<=7){st6=st5.concat(" ");st7=st6;st8=st6;}
    if(st6.length()<=7){st7=st6.concat(" ");st8=st7;}
    if(st7.length()<=7){st8=st7.concat(" ");}

    tw.setText(st8);
    String allora=(String) tw.getText();    
    TextView tw2=(TextView)row.findViewById(R.id.nome);
    ///aggiungiamo numero minimo caratteri
    tw2.setText((l.get(position).nome));
    ///
    TextView tw3=(TextView)row.findViewById(R.id.prezzo);
    tw3.setText((l.get(position).prezzo));

    TextView tw4=(TextView)row.findViewById(R.id.cambiamento);
    tw4.setText((l.get(position).cambiamento).concat(" %"));

    try {
    double value = Double.parseDouble(l.get(position).cambiamento);
    if(value<0)tw4.setTextColor(Color.RED);
    if(value>0)tw4.setTextColor(Color.GREEN);
    TextView tw5=(TextView)row.findViewById(R.id.freccia);
    if(value<0)tw5.setText("▼");
    if(value>0)tw5.setText("▲");
    if(value<0)tw5.setTextColor(Color.RED);
    if(value>0)tw5.setTextColor(Color.GREEN);
        } catch (Exception exc) {}

    return row; 

 }

 public int getCount() {
    // TODO Auto-generated method stub
    return l .size();

}

 public Object getItem(int position) {
    // TODO Auto-generated method stub
    return l .get(position);

 }

 public long getItemId(int position) {
    // TODO Auto-generated method stub
    return position;
 }
 }

编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑编辑

非常感谢您,答案非常有道理。**

但我不明白为什么同一个适配器适用于以下片段;我解释一下:下面的“listafragment”片段有类似的逻辑,它使用

 prendiLista

获取最新版本的方法

 ListArray lt

与之前的“WorstBest”片段完全相同。但在这种情况下,当

    public void prendiLista(ArrayList<Stock> al){
        lt=al;
         myAdap.notifyDataSetChanged();
    }    

视图更新了!!!

请问有什么区别???:-)

在我的理解中,对 notifyDataSetChanged() 的调用足以更新视图!

总之非常感谢!(明天早上我会接受答案)。

 public class listafragment extends Fragment {
    public ListView lv;
    public MyAdapter myAdap;
    public ArrayList<Stock> lt;
    public View v;
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) {
         // Inflate the layout for this fragment
        View v= inflater.inflate(R.layout.lista, container, false);    
        lv= (ListView) v.findViewById(android.R.id.list);
        if(lv==null){Log.e("","nel fragment la lista è nulla");}
         if(lv!=null){Log.e("","nel fragment la lista NON è nulla");} 
         myAdap= new MyAdapter(lt, getActivity()); 
         lv.setAdapter(myAdap);             
        return v;
    }

    public void prendiLista(ArrayList<Stock> al){
        Log.e("", "passo per prendilitsa del fragment");
        lt=al;
        if(myAdap==null){Log.e("","nel prendilista del fragment myadapt è     nullo");};
        myAdap.notifyDataSetChanged();
    }                 
       public void addToFavorites(int pos){
         Quotes.addToFavorites(pos);

     }

     @Override
    public void onCreate(Bundle savedInstanceState){
        lt=Quotes.dammi();
        super.onCreate(savedInstanceState);
    }
}
4

1 回答 1

1

因此列表应该使用 ArrayLists 的新内容进行更新。

很不幸的是,不行。当您的应用首次运行l并且best两者都引用相同的数据时。你有这个设置。

Fragment:
    best ---\
            |
            |--- <the initial data>
Adapter:    |
    l ------/

但是在你打电话之后best=al,你有:

Fragment:
    best ------- <the new data>

Adapter:    
    l ---------- <the initial data>

因此,您永远不会更新适配器中的引用。l 由于您没有将其l声明为private

public void prendiListaBest(ArrayList<Stock> al){
    myAdap.l=al;
    myAdap.notifyDataSetChanged();
}    
于 2013-01-02T18:12:20.970 回答