0

私はこれを行う方法を理解できないようです.基本的に私はリストビューを持っており、それぞれが独自の値を持つボタンがたくさんあります.

このリストビューには、独自のカスタム アダプターがあります。コードは次のとおりです。

インポートはスペースのために削除されましたが、存在します。

public class FriendsArrayAdapter extends ArrayAdapter<Friend> 
{
    public FriendsArrayAdapter
    (Activity context, int resourceId, ArrayList<Friend> friends) 
{
    super(context, resourceId, friends);
    this.context = context;
    this.friends = friends;
    this.resourceId = resourceId;



}



@Override
public View getView(int position, View convertView, ViewGroup parent) 
{
    View rowView = convertView;
    if (rowView == null) 
    {
        LayoutInflater vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        rowView = vi.inflate(resourceId, null);
    }



    alert = new AlertDialog.Builder(context);
    alert.setTitle("Hanged! Online Play");
    alert.setMessage("Enter a word for your opponent to guess. Alphabetical characters only and maximum of 25 characters long.");
    final EditText input = new EditText(context);
    alert.setView(input);

    alert.setPositiveButton("Ok", new DialogInterface.OnClickListener() 
    {
    public void onClick(DialogInterface dialog, int whichButton) 
    {
       wordToGuess = input.getText().toString();
       SubmitWord submitTask = new SubmitWord();
       submitTask.execute(new String[] { "http://www.hanged.comli.com/main.php" });
       Log.i("postData", wordToGuess);
     }
    });

   alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() 
    {
      public void onClick(DialogInterface dialog, int whichButton) 
      {
          Intent intent = new Intent(context, NetPlay.class);
          intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);       
          context.startActivity(intent);
      }
    });

    final Friend f = friends.get(position);
    TextView rowTxt = (TextView) rowView.findViewById(R.id.rowtext_top);
    rowTxt.setText(f.name+"       ");




    Button battleBtn = (Button) rowView.findViewById(R.id.battleBtn);
    battleBtn.setText(f.id+" Accept Challenge");
    battleBtn.setOnClickListener(new OnClickListener() 
    {
           @Override
           public void onClick(View v) 
           {
               rivalid = f.id;
               AcceptChallenge task2 = new AcceptChallenge();
               task2.execute(new String[] { "http://www.hanged.comli.com/get-currentgame.php" });
           }
    });

    Button newgameBtn = (Button) rowView.findViewById(R.id.newgameBtn);
    newgameBtn.setText(f.id+" Start new game.");

    newgameBtn.setOnClickListener(new OnClickListener() 
    {
           @Override
           public void onClick(View v) 
           {
               rivalid = f.id;
               alert.show();  
           }   
    });



        for (int i = 0;i<NetPlay.victimArray.length-1;i++)
        {
            Log.i("VICTIM ARRAY DATA ", NetPlay.victimArray[i]);

            if (NetPlay.victimArray[i].equals(NetPlay.myId))
            {
                ingame = false;
            }
            else
            {
                ingame = true;
            }
        }

        for (int i = 0;i<NetPlay.rivalArray.length-1;i++)
        {
            Log.i("RIVAL ARRAY DATA ", NetPlay.rivalArray[i]);

            if (NetPlay.rivalArray[i].equals(NetPlay.myId))
            {
                battle = true;
            }
            else
            {
                battle = false;
            }

        }

        if (battle.equals(false))
        {
            battleBtn.setVisibility(View.INVISIBLE);
        }
        if (ingame.equals(false))
        {
            newgameBtn.setVisibility(View.INVISIBLE);
        }


    return rowView;
}

これらのボタンを非表示にすると、非表示にする必要があるボタンだけでなく、すべてのボタンが非表示になります。このビューは、その情報が役立つ場合、非同期タスクからのデータに依存しています。

どうすればそれができるかについて私を完全に混乱させて、これに関する助けを本当に感謝します。

これは、メイン アクティビティでリストビューが呼び出される場所です。

listView = (ListView) findViewById(R.id.friendsview);
friendsArrayAdapter = new FriendsArrayAdapter(this, R.layout.rowlayout, friends);
listView.setAdapter(friendsArrayAdapter);
4

2 に答える 2

2

問題は、このコードブロックにあります。

if (battle.equals(false)) {
  battleBtn.setVisibility(View.INVISIBLE);
}
if (ingame.equals(false)) {
  newgameBtn.setVisibility(View.INVISIBLE);
}

ListViewアイテムがリサイクルされることを知っているので(そのため、ViewHolderView.VISIBLEを使用する必要があります)、条件がtrueの場合にボタンを設定する必要もあります。

コードは次のようになります。

if (battle.equals(false)) {
  battleBtn.setVisibility(View.INVISIBLE);
} else {
  battleBtn.setVisibility(View.VISIBLE);
if (ingame.equals(false)) {
  newgameBtn.setVisibility(View.INVISIBLE);
} else {
  newgameBtn.setVisibility(View.VISIBLE);
}
于 2012-08-15T06:02:55.153 に答える
1

アプリケーションのロジックはわかりませんが、エラーと 2 つの解決策が表示されます。

  1. ループオーバーし、配列の途中にあるvictimArrayためNetPlay.myId、常に として戦闘が発生しfalseます。したがって、それが true になったらすぐに開始battlefalseて中断する必要があります。

  2. チェックを変更する必要があると思います:

    NetPlay.victimArray[i].equals(NetPlay.myId)

NetPlay.victimArray[i].equals(friend.id)

そして、別の条件についても同様です。

HashSetまた、プリミティブの代わりに使用することをお勧めしますvictimArraycontainsループの代わりにメソッドを使用すると、より最適な検索が得られます。

于 2012-08-15T05:52:28.413 に答える