2015-12-05 16 views
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(); 

} 
. . . 
+1

在與TextView相同的視圖保持器中添加按鈕。 –

+0

@SuhasBachewar,你是對的,因爲視圖持有人無法分辨哪個按鈕被點擊,所以與特定文本視圖沒有關係。他必須在ViewHolder中加上加號和減號按鈕 –

+0

謝謝大家,我將這些按鈕添加到ViewHolder中,並且它仍然隨機使按鈕變爲空白。 我甚至在getView方法中設置按鈕文本,並得到相同的問題。 我使用一個相當便宜的手機,這可能是由於在主線程上發生太多而導致的嗎? –

回答

0

我提什麼@Suhas Bachewar說,並把一些與代碼你一起有,因爲你應該知道你正在使用一個回收站讓你的視圖填充不同列表中的耳鼻喉對象,爲什麼沒有點擊事件裏面getView一樣,你不必做的喧囂爲尋找其特定的按鈕視圖關聯到其值必須增加一個對象,

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.buttonMinus= (Button) convertView.findViewById(R.id.Minus); 
     viewHolder.buttonPlus= (Button) convertView.findViewById(R.id.Plus); 
     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 

    buttonMinus.setOnClickListener(minusListener); 

    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; 
    Button buttonMinus; 
    Button buttonPlus; 
} 
相關問題