1
我遇到了列表視圖問題,我正在使用。列表視圖中的每個項目都有兩個按鈕,用戶可以使用這兩個按鈕來添加或取消每個參賽者的積分。按鈕文字在滾動或添加和列表視圖中的項目時消失,Android
的問題是,當我添加一個新的項目列表視圖或滾動時(在已添加了至少一個項目)的代碼中隨機取出來的文本上的一個或多個項目的按鈕。
任何人都可以告訴我A)這是什麼原因造成的?和B)如何解決它?
我已經包括了我認爲是相關的代碼。如果你認爲我需要在這裏再增加一些,請告訴我。
我的適配器類:
public class ContestantListAdapter extends BaseAdapter {
private ArrayList<ContestantItem> contestantList;
private LayoutInflater layoutInflater;
public ContestantListAdapter(Context context, ArrayList<ContestantItem> contestantList){
this.contestantList = contestantList;
layoutInflater = LayoutInflater.from(context);
}
@Override
public int getCount(){
return contestantList.size();
}
public View getView(int position, View convertView, ViewGroup parentView){
ViewHolder viewHolder;
if(convertView == null){
convertView = layoutInflater.inflate(R.layout.contestant_row_layout,null);//null might need to be activity_main
viewHolder = new ViewHolder();
viewHolder.nameView = (TextView) convertView.findViewById(R.id.nameView);
viewHolder.pointsView = (TextView) convertView.findViewById(R.id.pointsView);
convertView.setTag(viewHolder);
}else{
viewHolder = (ViewHolder)convertView.getTag();
}
viewHolder.nameView.setText((contestantList.get(position).getName()));
viewHolder.pointsView.setText(Integer.toString(contestantList.get(position).getPoints()));
//get button position
Button button =(Button) convertView.findViewById(R.id.Minus);
button.setOnClickListener(minusListener);
Button buttonPlus = (Button) convertView.findViewById(R.id.Plus);
buttonPlus.setOnClickListener(addListener);
return convertView;
}
private View.OnClickListener minusListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
View parentRow = (View) v.getParent();
ListView listView = (ListView) parentRow.getParent();
final int position = listView.getPositionForView(parentRow);
ContestantItem tmpContestant = (ContestantItem) contestantList.get(position);
int tmpPoints = tmpContestant.getPoints()-1;
if(tmpPoints<0){tmpPoints=0;}
tmpContestant.setPoints(tmpPoints);
notifyDataSetChanged();
}
};
private View.OnClickListener addListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
View parentRow = (View) v.getParent();
ListView listView = (ListView) parentRow.getParent();
final int position = listView.getPositionForView(parentRow);
ContestantItem tmpContestant = (ContestantItem) contestantList.get(position);
int tmpPoints = tmpContestant.getPoints()+1;
tmpContestant.setPoints(tmpPoints);
notifyDataSetChanged();
}
};
static class ViewHolder {
TextView nameView;
TextView pointsView;
}
@Override
public Object getItem(int index){
return contestantList.get(index);
}
@Override
public long getItemId(int index){
return index;
}
//this method should add the contestent to the listView. must know what position to add it in.
public void addItem(String name, int index){
ContestantItem tempContestant = new ContestantItem();
tempContestant.setName(name);
tempContestant.setPoints(1);
contestantList.add(index,tempContestant);
notifyDataSetChanged();
}
. . .
ContestantRowLayout:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:layout_width="0dp"
android:layout_height="50dp"
android:layout_weight="0.15"
android:id="@+id/Minus"
android:text="@string/minus"
/>
<TextView
android:layout_width="0dp"
android:layout_height="50dp"
android:layout_weight="0.5"
android:id="@+id/nameView"
/>
<TextView
android:layout_width="0dp"
android:layout_height="50dp"
android:layout_weight="0.2"
android:id="@+id/pointsView"
/>
<Button
android:layout_width="0dp"
android:layout_height="50dp"
android:layout_weight="0.15"
android:id="@+id/Plus"
android:text="@string/plus"
/>
</LinearLayout>
主要活動:
public class MainActivity extends AppCompatActivity implements ContestantsFragment.OnFragmentInteractionListener{
ListView listView1;
ContestantListAdapter contestantAdapter;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ArrayList<ContestantItem> rowDetails = getListData();
listView1 = (ListView) findViewById(R.id.contactsListView);
listView1.setAdapter(new ContestantListAdapter(this,rowDetails));
contestantAdapter = (ContestantListAdapter) listView1.getAdapter();
}
private ArrayList getListData(){
ArrayList<ContestantItem> contestantList = new ArrayList<ContestantItem>();
ContestantItem cItem;
for(int i=0;i<10;i++){
cItem = new ContestantItem();
cItem.setName("Danny Anderson");
cItem.setPoints(5);
contestantList.add(cItem);
}
return contestantList;
}
@Override
public void onFragmentInteraction(Uri uri) {
}
//if the name is found returns the index position in the list. If not found -99
public void findAlphabetical(View view){
//TODO implement Binary search algorithm.
hideKeyboard();
EditText tmpEditTxt = (EditText) findViewById(R.id.searchField);
String inputTxt = tmpEditTxt.getText().toString();
int findAtIndex =contestantAdapter.searchAlphabetical(inputTxt)-1;
if(findAtIndex <0){findAtIndex=0;}
listView1.smoothScrollToPosition(findAtIndex);
}
public void addInAlpabetOrder(View view){
//TODO add the name in alphabetical order
hideKeyboard();
//ListView tmpListView = (ListView) contestantsFragment.getView().findViewById(R.id.contactsListView);
EditText tmpEditTxt = (EditText) findViewById(R.id.searchField);
String inputTxt = tmpEditTxt.getText().toString();
int addAtIndex =contestantAdapter.searchAlphabetical(inputTxt);
contestantAdapter.addItem(inputTxt, addAtIndex);
listView1.smoothScrollToPosition(addAtIndex);
}
public void clearContestantList(View view){
//TODO clear out all contestants from the list
contestantAdapter.clearAllItems();
}
. . .
在與TextView相同的視圖保持器中添加按鈕。 –
@SuhasBachewar,你是對的,因爲視圖持有人無法分辨哪個按鈕被點擊,所以與特定文本視圖沒有關係。他必須在ViewHolder中加上加號和減號按鈕 –
謝謝大家,我將這些按鈕添加到ViewHolder中,並且它仍然隨機使按鈕變爲空白。 我甚至在getView方法中設置按鈕文本,並得到相同的問題。 我使用一個相當便宜的手機,這可能是由於在主線程上發生太多而導致的嗎? –