我目前正在研究一个具有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。
任何想法为什么发生这种情况?任何想法如何解决它没有蛮力(如重建给定位置的视图)。
在此先感谢您的帮助。 :) :) :)
的可能重复[ListView的重用视图时......我不希望它(http://stackoverflow.com/questions/6921462/listview-当我不想要它) –
仍然,我使用的.setTag和.getTag的概念,并获得错误的观点,给定的位置。 –
对,但是对于每个列表项内部的项目,您需要在getView中设置所需的默认状态,否则当其他列表项重用时可能会混淆 –