2015-08-09 78 views
-2

我目前正在研究一個具有MainActivity的Android應用程序,它是一個NavigationDrawer,因此該應用程序的每個屏幕均作爲一個Fragment實現。Android自定義ListView刷新問題

每個片段這裏實例:

public class PlaceholderFragment extends Fragment { 

    private final String TAG = "Dhemage"; 
    public TextView curr_money_txt; 

    public PlaceholderFragment() { 
    } 

    /** 
    * The fragment argument representing the section number for this 
    * fragment. 
    */ 
    private static final String ARG_SECTION_NUMBER = "section_number"; 

    /** 
    * Returns a new instance of this fragment for the given section 
    * number. 
    */ 
    public static PlaceholderFragment newInstance(int sectionNumber) { 
     PlaceholderFragment fragment = new PlaceholderFragment(); 
     Bundle args = new Bundle(); 
     args.putInt(ARG_SECTION_NUMBER, sectionNumber); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     int sectionNumber = this.getArguments().getInt(ARG_SECTION_NUMBER); 
     View rootView; 

     switch (sectionNumber) { 
      case 1: 
       rootView = inflater.inflate(R.layout.home, container, false); 
       break; 
      case 2: 
       rootView = inflater.inflate(R.layout.activity_recursos, container, false); 

       /*CREATE Money TXT*/ 
       curr_money_txt = (TextView) rootView.findViewById(R.id.curr_money_text); 
       curr_money_txt.setText(((navigation_bar) getActivity()).START_MONEY); 

       /*CREATE LIST VIEW*/ 
       List<String> nomes_recursos = Arrays.asList("Iron", "Silver", "Gold", "Painite", "Benitoite", "Deuterium"); 
       ListAdapter recursosAdapter = new Recurso_ListViewItens(getActivity(), R.layout.recurso_box_fragment, nomes_recursos); 
       ListView recursos_ListView = (ListView) rootView.findViewById(R.id.recursos_listview); 
       recursos_ListView.setAdapter(recursosAdapter); 

       break; 
      case 3: 
       rootView = inflater.inflate(R.layout.fragment_navigation_bar, container, false); 
       break; 
      default: 
       rootView = inflater.inflate(R.layout.fragment_navigation_bar, container, false); 
       break; 
     } 


     return rootView; 
    } 


    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     ((navigation_bar) activity).onSectionAttached(getArguments().getInt(ARG_SECTION_NUMBER)); 
    } 
} 

目前我執行的情況下2.由一組聚集在與顯示在頂部貨幣文本字段一個ListView一個資源英寸

與ListView一起使用的apdater代碼如下。我想唯一重要的部分是getView方法。反正我張貼全班

public class Recurso_ListViewItens extends ArrayAdapter<String> { 


private int layout; 
private Context context; 

public Recurso_ListViewItens(Context _context, int resource, List<String> objects) { 
    super(_context, resource, objects); 
    layout = resource; 
    this.context = _context; 

} 


@Override 
public View getView(final int position, View convertView, final ViewGroup parent) { 
    // reuse views 
    if (convertView == null) { 
     //Inflate View 
     LayoutInflater fragmentInflater = LayoutInflater.from(getContext()); 
     convertView = fragmentInflater.inflate(R.layout.recurso_box_fragment, parent, false); 

     //Create the viewHolder 
     final ViewHolder viewHolder = new ViewHolder(); 

     //configure the viewholder 
     viewHolder.textoPreco = (TextView) convertView.findViewById(R.id.countdown); 
     viewHolder.texto_level_recurso = (TextView) convertView.findViewById(R.id.level_of_resource); 
     viewHolder.imageRecurso = (ImageView) convertView.findViewById(R.id.imagem_recurso); 
     viewHolder.getmoneyButton = (Button) convertView.findViewById(R.id.button_recurso_fragment); 
     viewHolder.upgradeButton = (Button) convertView.findViewById(R.id.upg_butt_recurso_fragment); 
     viewHolder.curr_money_link = (TextView) ((navigation_bar) getContext()).findViewById(R.id.curr_money_text); 

     //UPGRADE BUTTON 
     viewHolder.upgradeButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       upg_button_action(viewHolder,position); 

      } 
     }); 

     //GET MONEY 
     viewHolder.getmoneyButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       getmoney_action(viewHolder,position); 

      } 
     }); 

     //set tag 
     convertView.setTag(viewHolder); 

     Log.d("Dhemage","Entered if: position="+position+" tag="+convertView.getTag().toString()+"\n"); 
    } 

    Log.d("Dhemage","Entered if: position="+position+" tag="+convertView.getTag().toString()+"\n"); 

    //fill data 
    final ViewHolder holder = (ViewHolder) convertView.getTag(); 

    holder.initial_variable_set(position); 

     switch (position) { 
      case 0: holder.imageRecurso.setImageResource(R.mipmap.resource_iron);break; 
      case 1: holder.imageRecurso.setImageResource(R.mipmap.resource_silver);break; 
      case 2: holder.imageRecurso.setImageResource(R.mipmap.resource_gold);break; 
      case 3: holder.imageRecurso.setImageResource(R.mipmap.resource_painite);break; 
      case 4: holder.imageRecurso.setImageResource(R.mipmap.resource_benitoite);break; 
      case 5: holder.imageRecurso.setImageResource(R.mipmap.resource_deuterium);break; 
     } 


    return convertView; 
} 


public class ViewHolder { 
    //WIDGETS ON FRAGMENT 
    TextView textoPreco; 
    TextView texto_level_recurso; 
    ImageView imageRecurso; 
    Button getmoneyButton; 
    Button upgradeButton; 
    TextView curr_money_link; 
    boolean initial_set_required = true; 

    public void initial_variable_set(int position) { 
     if(initial_set_required) { 
      //SET initial INFORMATION ON WIDGET 
      this.texto_level_recurso.setId(position); 
      this.upgradeButton.setText("1"); 
      this.getmoneyButton.setText(getItem(position));// getItem(position) = mineral name 
      this.initial_set_required = false; 
     } 
    } 

} 


private void getmoney_action(ViewHolder viewHolder, int position) { 
    //get resource level 
    String niveltxt = viewHolder.texto_level_recurso.getText().toString(); 
    int level = Integer.parseInt(niveltxt); 

    //get money on click 
    int money_to_add = money_per_click(level, position); 

    //get current money 
    int curr_money = getCurrentMoney(viewHolder); 


    //sets money value 
    curr_money+=money_to_add; 
    viewHolder.curr_money_link.setText(String.valueOf(curr_money)); 

} 

private int money_per_click(int level, int position) { 
    int next_price; 
    switch (position) { 
     case 0: 
      next_price = (int) (level + 1); 
      break; 
     case 1: 
      next_price = (int) (level * 1.8 + 1); 
      break; 
     case 2: 
      next_price = (int) (level * 2.5); 
      break; 
     case 3: 
      next_price = (int) (level * 3); 
      break; 
     case 4: 
      next_price = (int) (level * 4.5); 
      break; 
     case 5: 
      next_price = (int) (level * 8); 
      break; 
     default: 
      return 0; 
    } 

    return next_price; 
} 


private boolean upg_button_action(ViewHolder viewHolder,int position){ 
    //gets ugrade price 
    String precotxt = viewHolder.upgradeButton.getText().toString(); 
    int curr_upg_price = Integer.parseInt(precotxt); 

    //get current money 
    int curr_money = getCurrentMoney(viewHolder); 

    //check if got money to pay 
    if (curr_money > curr_upg_price) { 
     //pays the upgrade 
     curr_money = curr_money - curr_upg_price; 
     viewHolder.curr_money_link.setText(String.valueOf(curr_money)); 
     //level icon increments 
     String niveltxt = viewHolder.texto_level_recurso.getText().toString(); 
     int lvl = Integer.parseInt(niveltxt); 
     lvl++; 
     viewHolder.texto_level_recurso.setText(String.valueOf(lvl)); 

     //increses price of upgrade 
     int next_price = next_upgrade_price(position, curr_upg_price); 
     viewHolder.upgradeButton.setText(String.valueOf(next_price)); 

     return true; 
    } 
    return false; 
} 

private int object_text_to_int(Button object){ 
    //gets ugrade price 
    String object_text = object.getText().toString(); 
    int value = Integer.parseInt(object_text); 
    return value ; 
} 

private int object_text_to_int(TextView object){ 
    //gets ugrade price 
    String object_text = object.getText().toString(); 
    int value = Integer.parseInt(object_text); 
    return value ; 
} 

//button upgrade pressed 
//returns 0 if error occurs 
public int next_upgrade_price(int position, int curr_price) { 
    int next_price; 
    switch (position) { 
     case 0: 
      next_price = (int) (curr_price * 1.5 + 1); 
      break; 
     case 1: 
      next_price = (int) (curr_price * 2 + 1); 
      break; 
     case 2: 
      next_price = (int) (curr_price * 2.5); 
      break; 
     case 3: 
      next_price = (int) (curr_price * 2.7); 
      break; 
     case 4: 
      next_price = (int) (curr_price * 3); 
      break; 
     case 5: 
      next_price = (int) (curr_price * 5); 
      break; 
     default: 
      return 0; 
    } 

    return next_price; 
} 

//get current money 
private int getCurrentMoney(ViewHolder viewHolder) { 
    String curr_money_txt = viewHolder.curr_money_link.getText().toString(); 
    int curr_money = Integer.parseInt(curr_money_txt); 
    return curr_money; 
} 

}

我讀過這個線程:Android Custom Listview,但我看到它我prolem去agaisnt大約位置/視野的邏輯在那裏解釋。

我的問題是:如果我上下滾動,按鈕上的文本加上資源的lvls開始改變。 如果在調用此方法時代碼向我顯示位置正確,但標記和convertView對於給定位置錯誤,則會看到Log.d。

任何想法爲什麼發生這種情況?任何想法如何解決它沒有蠻力(如重建給定位置的視圖)。

在此先感謝您的幫助。 :) :) :)

+0

的可能重複[ListView的重用視圖時......我不希望它(http://stackoverflow.com/questions/6921462/listview-當我不想要它) –

+0

仍然,我使用的.setTag和.getTag的概念,並獲得錯誤的觀點,給定的位置。 –

+0

對,但是對於每個列表項內部的項目,您需要在getView中設置所需的默認狀態,否則當其他列表項重用時可能會混淆 –

回答

0

試試這個;

ViewHolder viewHolder= new ViewHolder(); 
if (convertView==nul){ 
    //your stuff 

    convertView.settag(viewholder); 
}else{ 
    viewHolder= convertView.getTag(viewHolder); 
} 


//your code stuff 
ButtonName.setText=ChangingArray[position] 

然後你應該改變你的按鈕。

實現onChangeStateListener與changingArray(應該是場)